ウェブカメラのLED通知表示[パート1]

...そして、このアイデアについてHabrahabrに投稿することにしました。



昨日、「思考」が思い浮かびました...まあ、どういうわけかそれはひどく判明します:サイレントモードのスマートフォンでは、LEDインジケータを使用して通知を利用できるかどうかを知ることができますが、コンピュータではできません。



ラップトップからヘッドフォンを外すのを忘れた状況を想像してください。 次に、彼らはバックグラウンドで、たとえばVKであなたに手紙を書きました。ブラウザで通知がオンになっていないと、あなたはこれについて知ることができません。 修正する必要があります!



に興味がありますか? 猫へようこそ!



約30分考えた後、私は...人生を簡素化するdllファイルになり、同時に私の将来のプログラムを開発しました。 このDLLは"escapi"と呼ばれます。



なぜなら 私はC ++にあまり慣れていないので簡単な方法で開発することを決めましたが、すぐに多くの困難なしに開発しました(私はそれが発展したときに記事を書いたので、ここで私は深く間違っていました...)



最後にビジネスに取りかかりましょう。



上記のライブラリをダウンロードした後、私はすぐに「Examples」フォルダに登りました。 そこにはいくつかのコンパイルされた例とソースコードがありました。 最も単純で最適な例では、私の視線はすぐに落ちました。 「simplest.exe」と呼ばれるため、論理的です。 そのソースは次のとおりです。



ソースコード
/* "simplest", example of simply enumerating the available devices with ESCAPI */ #include <stdio.h> #include "escapi.h" void main() { int i, j; /* Initialize ESCAPI */ int devices = setupESCAPI(); if (devices == 0) { printf("ESCAPI initialization failure or no devices found.\n"); return; } /* Set up capture parameters. * ESCAPI will scale the data received from the camera * (with point sampling) to whatever values you want. * Typically the native resolution is 320*240. */ struct SimpleCapParams capture; capture.mWidth = 24; capture.mHeight = 18; capture.mTargetBuf = new int[24 * 18]; /* Initialize capture - only one capture may be active per device, * but several devices may be captured at the same time. * * 0 is the first device. */ if (initCapture(0, &capture) == 0) { printf("Capture failed - device may already be in use.\n"); return; } /* Go through 10 capture loops so that the camera has * had time to adjust to the lighting conditions and * should give us a sane image.. */ for (i = 0; i < 10; i++) { /* request a capture */ doCapture(0); while (isCaptureDone(0) == 0) { /* Wait until capture is done. * Warning: if capture init failed, or if the capture * simply fails (ie, user unplugs the web camera), this * will be an infinite loop. */ } } /* now we have the data.. what shall we do with it? let's * render it in ASCII.. (using 3 top bits of green as the value) */ char light[] = " .,-o+O0@"; for (i = 0; i < 18; i++) { for (j = 0; j < 24; j++) { printf("%c", light[(capture.mTargetBuf[i*24+j] >> 13) & 7]); } printf("\n"); } deinitCapture(0); }
      
      







要するに、プログラムはウェブカメラをオンにし、カメラの焦点を合わせたり、シャッター速度を設定したりするために連続して10ショットを撮り、最後のフレームを取り、その一部をASCIIで表示します。



カメラのLEDを「点滅」させるには、画面に表示したり、他の操作を行ったりせずに、1ショットだけ撮る必要があります。 カメラ(カメラ)がアクティブな場合にのみカメラのLEDが点灯する場合、コードの余分な部分のみを削除することができます。 実行可能ファイルの準備ができました。



新しいコード(関数のみ):



私のコード
 /* WebCamLED Notifier 1.0 by Sdore */ #include <stdio.h> #include "escapi.h" void led() { struct SimpleCapParams capture; capture.mWidth = 24; capture.mHeight = 18; capture.mTargetBuf = new int[24 * 18]; initCapture(0, &capture); doCapture(0); deinitCapture(0); }
      
      







escapiライブラリとバンドルでコンパイルし、実行します。 カメラのLEDが点灯し、すぐに消灯します。 動作します! さて、アプリケーションを見つけるだけです。 アイデアに従って、通知システムを作成することは非常に論理的です。 私のお気に入りの開発環境であるアルゴリズム2でプログラムの概要を説明します。



しかし、これはすでに次の部分にあります。



PS
上記を前もって書いたため、コードが機能しているかどうかはわかりません。



PS これは私の最初の投稿ですが、うまくいけば最後ではありません...



幸運を祈ります!




Upd:解説者の一人によると、
説明したソリューションはWindows専用であることを言及する価値があります。
これについて、私は言い忘れました。 追加していただきありがとうございます。



All Articles