OpenCVとV4L2
ちょっと前からOpenCV+V4L2で1600x1200の画像を撮ろうと四苦八苦してるのさ。
正直、LinuxのドライバのプログラミングどころかV4L2のプログラミングすらやったことないわけで、mmapとioctlの嵐に涙目。当然、日本語の情報などないし。
とりあえずOpenCVのhighgui/cvcap_v4l.cppをffmpegのv4l2を参考に読み進めたところ、問題のありそうなところをいくつか発見。
- 画像サイズ変更のためのVIDIOC_S_FMT呼び出しのあと、mmapされたバッファの再初期化(lengthの取りなおし?)がされてない
- icvGrabFrameCAM_V4L中でDQBUFしたあと、バッファの中身を保存する前にQBUFでキューに戻してる。
- CV_CAP_PROP_FPSとか実装されてねえ
- YUV422が使えてもMJPEGを優先するので、普通だと960x720までしかとれない
かなりアバウトな調べ方+正直よくわからないので、間違ってるかもしらん。
1600x1200で撮れないのは、1と4のせいっぽいかな。
4はどうにかなった。
1については、cvcap_v4l.cppをいじって調べたところ、サイズ変更してfmt.pix.sizeimageがおっきくなってもバッファサイズ(buffers[n].length)が変わってない様子。
しかしMJPEGでも変わってないけどちゃんと撮れてるし・・・。MJPEGではそれでも有効バッファサイズ内に収まっているのか?
やっぱりおなかがすいたので今日はこのぐらいで終了。