うちの環境(BeagleBoard-xM + Ubuntu11.04 + OpenCV2.3.0)だけの問題かも知れませんが、重い画像処理を行うと、カメラの映像がひどく遅延してしまう現象が発生しています。
例えば、BeagleBoardで顔認識を行うと3FPSぐらいになります。3FPSであれば0.3秒程度遅延するのは分かりますが、実際には2~3秒ぐらい遅延してしまいます。3秒も遅延すると画像認識した結果でロボットを制御するのは難しいと思います。
対策として、
frame = cvQueryFrame (capture);
を数回繰り返して取得したイメージを捨てると遅延は少なくなります。しかし、無駄な処理を行っているようで納得できません。(実際、FPSも下がります。)
これで改善されることから、バッファリング関係の処理が影響していることは分かりました。
OpenCVのcvSetCapturePropertyで設定する、CV_CAP_PROP_POS_FRAMESやCV_CAP_PROP_FPSあたりのパラメータで回避できないかいろいろ試してみましたが、うまくいかず。OpenCVのソースを調べてみると、実装されていませんでした。。。
そこで、最後の手段で、OpenCVのソースを変更してみました。(これが正しい対応方法かどうかはわかりませんし、何か副作用がある可能性は高いです。)
OpenCV-2.3.0\modules\highgui\src\cap_libv4l.cpp の
#define MAX_V4L_BUFFERS 10
#define DEFAULT_V4L_BUFFERS 4
のところを
#define MAX_V4L_BUFFERS 1
#define DEFAULT_V4L_BUFFERS 1
のように変更して、OpenCVをコンパイルしなおしました。
この方法で、FPSは下がらずに、遅延もFPS相当程度(3FPSなら0.3秒ぐらい)になりました。
しかし、処理が速い場合にはFPSが上がらなかったりする副作用があるかもしれません。