Pythonでビデオキャプチャ作業メモ

[pukiwiki]
PythonでWebカメラなどの画像を録画する方法の作業メモ。
環境はWindows(XP/Vista)
[/pukiwiki]

[pukiwiki]

*OpenCV
バージョン1.0では320×240でしか画像を取り込めません
[[tag:http://boxheadroom.com/tag/opencv]] / [[wiki:http://boxheadroom.com/wiki/?OpenCV]]

。。。なので、今回は別の方法を探すことに。
*[[VideoCaptureモジュール:http://videocapture.sourceforge.net/]]
Pythonから簡単にビデオキャプチャできるモジュール。超楽。
解像度も指定できます。(IEEEカメラなどが使えるかは不明)
きめ細かい指定は直接はできませんが、とにかく簡単。
*[[EyeToy用ドライバ:http://www.emagi.co.uk/2007/10/29/windows-vista-and-the-eyetoy/]]
PS2用のWebカメラ、EyeToy PlayをPC(WindowsXP,Vista)で使うためのドライバ。
1個だけなら、このドライバで、Vistaでも動きました。が。。。
**EyeToyをPCに複数個接続したい。。。が挫折
複数個のカメラをPCに接続したところ
-テレビチューナーカード1個+EyeToy1個で動作した(XP)
VideoCaptureモジュール自体は複数カメラに対応している模様
-VistaなPCにEyeToyを複数個接続したところ、
–USBハブに複数カメラを接続すると、2個目のカメラを認識せず。
–PC本体のUSBポートにカメラを直接接続。動作した。。。かと思いきや暴走してブルースクリーンに。
ドライバが原因か、ハード的な原因か、VideoCaptureモジュールのアクセスするタイミングの問題か。。。それともPCのUSBの問題かは不明

というわけで、当面、EyeToy一個だけで遊ぶことに。
同じ機種のカメラを複数同時に使えると面白そうだと思ったのだけれど残念。

*[[ビデオ編集ソフトVirtualDub:http://www.virtualdub.org/]]
OpenCVが作成するAVIは、一部のソフトと相性が悪く、開けない場合有り。
(音声トラックがついてない、という問題なのかも)
VirtualDubで開いて、再圧縮なしで保存しなおすと他のソフトでもちゃんと開けるようになります
*サンプルコード

***VideoCaptureモジュールサンプルコード(静止画)
たった4行でjpeg画像として保存できちゃいます。
これはラクチン。

_from VideoCapture import Device
_cam = Device(devnum=0)
_cam.setResolution(640,480)
_cam.saveSnapshot(‘testtestimage.jpg’)
_#保存する画像にタイムスタンプを入れる場合はこちら。
_#cam.saveSnapshot(‘testtestimage.jpg’, \
_# timestamp=3, boldfont=1)

***動画
Webカメラ1個をPythonからVideoCaptureモジュールで画像取り込み。
50フレームだけ一旦メモリーに格納。
取り込み終わったあと、OpenCVでAVIとして保存する例。取り込んで終了

VideoCaptureモジュールで取り込んだ画像をOpenCVのIPL Image形式に変換するには、cvSetData関数を使うのが速いみたいです。
(ちょっと悩みました)

_from VideoCapture import Device
_import time
_import CVtypes as cv
_
_w=640; h=480; fmax=50
_#cam = Device(devnum=0)
_cam.setResolution(w,h)
_vw=cv.cvCreateVideoWriter(“test.avi”,\
_ -1,30,cv.CvSize(w,h))
_print raw_input(“Press Enter for Start Recording”)
_last=time.time()
_blist=[]
_for i in xrange(fmax):
_ b=str(cam.dev.getbuffer()[0])
_ blist.append(b)
_t=time.time()-last
_print t
_print “%f fps” % (fmax/t)
_wd=w*3
_im=cv.cvCreateImage(cv.CvSize(w,h),8,3)
_for i,b in enumerate(blist):
_ cv.cvSetData(im,b,wd)
_ cv.cvWriteFrame(vw,im)
_ cv.cvFlip(im)
_cv.cvReleaseVideoWriter(vw)

OpenCVで、いろんな画像処理しても楽しいかも。

ソースも読みやすく着色しないといかんですねぇ。。。
[/pukiwiki]

コメントを残す

メールアドレスが公開されることはありません。