OpenCVとV4L2

ちょっと前からOpenCV+V4L2で1600x1200の画像を撮ろうと四苦八苦してるのさ。
正直、LinuxのドライバのプログラミングどころかV4L2のプログラミングすらやったことないわけで、mmapとioctlの嵐に涙目。当然、日本語の情報などないし。

とりあえずOpenCVのhighgui/cvcap_v4l.cppをffmpegのv4l2を参考に読み進めたところ、問題のありそうなところをいくつか発見。

  1. 画像サイズ変更のためのVIDIOC_S_FMT呼び出しのあと、mmapされたバッファの再初期化(lengthの取りなおし?)がされてない
  2. icvGrabFrameCAM_V4L中でDQBUFしたあと、バッファの中身を保存する前にQBUFでキューに戻してる。
  3. CV_CAP_PROP_FPSとか実装されてねえ
  4. YUV422が使えてもMJPEGを優先するので、普通だと960x720までしかとれない

かなりアバウトな調べ方+正直よくわからないので、間違ってるかもしらん。

1600x1200で撮れないのは、1と4のせいっぽいかな。
4はどうにかなった。
1については、cvcap_v4l.cppをいじって調べたところ、サイズ変更してfmt.pix.sizeimageがおっきくなってもバッファサイズ(buffers[n].length)が変わってない様子。
しかしMJPEGでも変わってないけどちゃんと撮れてるし・・・。MJPEGではそれでも有効バッファサイズ内に収まっているのか?
やっぱりおなかがすいたので今日はこのぐらいで終了。