ウェブカメラソフトウェアキャプチャ

最近、ウェブカメラからデータを取得して自動的に処理する必要がありました。 いくつかのプログラムを通過した後、プログラムでカメラを操作することはできません-形状とボタンのみ、最高でも録画スケジューラがありますが、このためにはプログラムを常に実行し続ける必要があります。 さらに、クロスプラットフォームではなく、プロジェクト内の特定のソフトウェアにバインドします。 解決策は、お気に入りのプログラミング言語を使用することです。





WebカメラとPythonがあります。 まず第一に、私はdealextremeで購入したカメラを賞賛せざるを得ません:サードパーティのソフトウェアをインストールせずにWindowsとLinuxで少しの1.5マッチボックスが動作します(Win 7とMint 13でチェックしてオンにしました)、許容可能な品質と価格。 動作中、カメラは光るインジケータやその他の効果を出しません。 小さなサイズは、目に見えないインストールに貢献します。





私はWindowsとLinuxの両方で作業しているため、ソリューションは両方のOSを満たす必要があります。 OpenCVコンピュータービジョンライブラリとPython用のビニングが役立ちます。 別の解決策はvideo4linuxかもしれませ 。 しかし、第一に、OpenCVを学ぶのは興味深いことでした。第二に、v4lの使用についてはすでに素晴らしいhabrastatyaでした



numpyおよびopencvライブラリをインストールします。 Linuxユーザーはターミナルを開いて次のように記述します。



sudo apt-get install python-numpy sudo apt-get install python-opencv
      
      







Windowsの下にあるものはここに行き 、正しいバージョンのPythonのためにnumpyおよびopencvディストリビューションを送り出します。



Windowsには別のインストール方法があります。 公式のライブラリ配布物をダウンロードするだけです。 アーカイブには/build/python/2.x/cv2.pydがあります。 サイトパッケージに入れます。 同じ場所で、コンテンツを含むcv.pyファイルを作成します。



 from cv2.cv import *
      
      







すべて準備完了です。 テストインポート:

 import cv
      
      







higuiと呼ばれるライブラリの一部を使用します。 実験を開始します。 テストボール-フレームを受け取り、ファイルに書き込みます。



 import cv capture = cv.CaptureFromCAM(0) frame = cv.QueryFrame(capture) cv.SaveImage("capture.jpg", frame)
      
      







CaptureFromCAM関数は、キャプチャが発生するオブジェクトを作成します。 0はデバイスのインデックスです。複数のカメラがある場合、ゼロより大きくなる可能性があります。 -1の値は、「使用可能なカメラ」を意味します。



これで、ループでフレームの収集を開始できます。 フレームが別々のウィンドウに同時に表示されるとすばらしいでしょう。



 import cv capture = cv.CaptureFromCAM(-1) cv.NamedWindow("capture", cv.CV_WINDOW_AUTOSIZE) i = 0 while True: frame = cv.QueryFrame(capture) cv.ShowImage("capture", frame) cv.WaitKey(10) path = "capture%.4d.jpg" % i #      cv.SaveImage(path, frame) i += 1
      
      







NamedWindow関数は、各フレームがループで表示されるウィンドウを作成して表示します。 WaitKeyハンドラーは、キーの押下や画像の表示などのウィンドウイベントの処理の遅延をミリ秒単位で設定します。 省略した場合、ウィンドウにはフレームが表示されません(場合によってはまったく表示されません)。





アクションでフレームをキャプチャします。 カメラはモニターを見るため、再帰があります-デスクトップ、内部はデスクトップ、内部はデスクトップです...



複数のフレームを収集することは、ショットの間に一時停止、たとえば毎分1フレームを挿入する場合に便利です。 ループ内でtime.sleep(60)を置き換えるだけで十分です。



連続撮影が必要な場合は、ビデオストリームにフレームを記録する必要があります。



 import cv capture = cv.CaptureFromCAM(-1) fourcc = cv.CV_FOURCC('M','J','P','G') fps = 16 w, h = 640, 480 stream = cv.CreateVideoWriter("test.avi", fourcc, fps, (w, h)) while True: frame = cv.QueryFrame(capture) cv.WriteFrame(stream, frame)
      
      







一見すると、ここのすべても明らかです。CreateVideoWriter関数は、フレームが書き込まれるストリームを作成します。 完成したビデオファイルを取得するには、サイクルを中断するだけで十分です。 ただし、入力パラメーターを処理する必要があります。



fourccはコーデックであり、整数であり、4 文字のコーデック名を数値インデックスにマッピングした結果です。 たとえば、CV_FOURCC( 'P'、 'I'、 'M、' 1 ')はMPEG-1圧縮です。 Windowsでは、ダイアログボックスで対話形式でコーデックを選択する場合は-1を、圧縮なしで記録する場合は0を渡すことができます(ファイルサイズがすごいことになります!)。 Elsedar habrayuzerは、コーデックの完全なリストを見ることができる場合にプロンプ​​トを表示します: www.fourcc.org/codecs.php



fps -1秒あたりのフレームレート。 パラメータはカメラのモデルに直接依存します。 この場所では、実際の状況は文書に反していました。 記録パラメーターは目で設定するのではなく、 GetCaptureProperty関数が提供する正確な方法で設定する必要があると考えられています 。 彼女は、キャプチャを正しく初期化するためのデバイスパラメータを取得できます。 しかし、フレームの高さと幅が問題なく抽出された場合、fpsを取得します。



 fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS)
      
      







CreateVideoWriter関数を満たさない-1を返します。したがって、周波数は経験的に選択されます。 通常、ほとんどのカメラでは、1秒あたり14〜16フレームの範囲です。 25を設定すると、結果のファイルは20代のサイレントムービーに似たものになります。



最後のパラメーターframe_sizeは、フレームの高さと幅の整数のペアです。 カメラ設定を使用するには、次のように初期化します。



 w = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH) h = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT) w, h = int(w), int(h) #     float
      
      







これで、カラーグレーディングのトピックに触れることができます。 出力フレームが自分に合わない場合は、ジープの山やビデオクロックをバッチで追い越すよりも、キャプチャパラメータを調整するのが妥当です。 パラメーターを設定するには、関数SetCapturePropertyがあります。 辞書を列挙していくつかのプロパティに入力すると便利です。



 config = { cv.CV_CAP_PROP_BRIGHTNESS: 50, cv.CV_CAP_PROP_CONTRAST: 50, cv.CV_CAP_PROP_SATURATION: 50, } for param, value in config.iteritems(): cv.SetCaptureProperty(capture, param, value)
      
      







明るさ、コントラスト、彩度のパラメータは1〜100の範囲で設定されます。これらの組み合わせにより、暗い部屋での撮影の品質を大幅に向上させることができます。



いくつかの例:





デフォルト設定のフレーム





明るさ、コントラスト、彩度は50ポイントです





明るさ50、コントラスト70、彩度0



カメラからのフレームをPILライブラリで処理する必要が生じることがあります。 cv形式からPILに変換するには、ディスクに保存する必要はありません。コードを実行するだけで十分です。



 pil_img = Image.fromstring("L", cv.GetSize(frame), frame.tostring())
      
      







そして反対方向に:



 cv_img = cv.CreateImageHeader(pil_img.size, cv.IPL_DEPTH_8U, 3) cv.SetData(cv_img, pil_img.tostring())
      
      







その結果、プログラムでカメラにアクセスでき、フレームを撮影してメールで送信したり、分析を行ったり、ビデオを作成したりできます。 ソリューションはクロスプラットフォームです。 ストリーミングは簡単だと思います。 ちなみに、例えば、wxにGUIインターフェースを備えたプログラムは、それ自体を提案します。



参照:



1) OpenCVライブラリ

2) Pythonバインディングドキュメント

3)セクション「highgui」



All Articles