Armadilloフォーラム

cvQueryFrame

ikeya

2014年3月9日 10時12分

お世話になります。

ikeya と申します。

A840にUSBカメラ(センサーテクノロジー社のUSB2.0対応カメラ)を繋げて
openCVの関数cvQueryFrameで画像取り込みを行っています。
この関数の実効時間が数百ms掛かってしまっています。
(因みにA810では同じソースで90ms程度です)

カメラのシャッター速度が約1/30なのでこの関数の応答時間は30~40ms程度では
ないかと考えています。

cvQueryFrameに数百msの時間が掛かってしまう原因を探っています。

ご存知の方おりませんでしょうか?

コメント

at_daisuke.sasaki

2014年3月10日 20時31分

佐々木大輔です。

> A840にUSBカメラ(センサーテクノロジー社のUSB2.0対応カメラ)を繋げて
> openCVの関数cvQueryFrameで画像取り込みを行っています。
> (因みにA810では同じソースで90ms程度です)

何点か確認させてください。
Armadillo-810とArmadillo-840で、同じUSBカメラを接続し差分を確認しているのでしょうか?
それとも、Armadillo-810については「Armadillo-810 カメラモデル開発セット」に付属するカメラを使用しているのでしょうか?

上記の質問の答えが、同じUSBカメラを接続し差分確認している場合、
原因切り分けのために、Armadillo-840のLCDを使用しない状態で、再度差分確認をしていただく事は可能でしょうか?

Armadillo-810とArmadillo-840でUSBのドライバに差分はありませんが、
LCDなどを使用していると、メモリバス帯域の使われ方が異なり差分が出る可能性があります。

> この関数の実効時間が数百ms掛かってしまっています。

具体的に"数百ms"はどの程度か教えていただけますか?
(100ms程度か900ms程度かでは、わりと差があるので、ざっくりどの程度でしょうか?)

ikeyaです。

> 何点か確認させてください。
> Armadillo-810とArmadillo-840で、同じUSBカメラを接続し差分を確認しているのでしょうか?
> それとも、Armadillo-810については「Armadillo-810 カメラモデル開発セット」に付属するカメラを使用しているのでしょうか?

90msといったのはカメラモデル開発セットに付属するカメラを使用した場合です。

> > この関数の実効時間が数百ms掛かってしまっています。
>
> 具体的に"数百ms"はどの程度か教えていただけますか?
> (100ms程度か900ms程度かでは、わりと差があるので、ざっくりどの程度でしょうか?)

500ms前後です。

よろしくお願いします。

kensakuと申します。
申し訳御座いませんが本内容に便乗させて下さい。
 ※長文で失礼します。。。
こちらでもA840+Sentech USBカメラで数百msかかる現象が発生しておりますので情報展開します。

添付しております、V4Lで取得したフレーム間の差を図るサンプルプログラム(ネットで拾ってきたソースを若干改良)で
図った結果、VGAサイズ30FPS設定でも250ms前後かかっているようです。
(XGAだと600ms程度、かつ15FPSに設定変更しても同様の値(V4LからのFPS変更が効いていない?)になります)

同様のプログラムを他のUSBカメラで測定するとVGA 30FPSでほぼ33msをキープできている為、
Sentechのカメラにのみ何かしらの要因で遅延が発生しているように思われます。
アットマークさんのほうでもSentechのUSBカメラをお持ちであるとお伺いしておりますので
同様の現象が発生するか、御確認をお願い致します。
30FPS近い値が出るのであれば、カーネルへのドライバ導入方法の問題と思われるので
申し訳御座いませんが実装方法について展開下さい。
(基本的にはアットマークさんの技術資料にあるデバイスドライバのインストール方法でやっています)
同様の結果が出るようでしたらこちらからもSentech社への問い合わせを行います。

下記に添付プログラムの実行結果について展開します。

【添付プログラムの実行方法】
Armadillo 840上でのビルドの場合です。VM上でビルドする場合はgccをクロスコンパイラに変更下さい。

ビルド
> gcc capture_time.c -o capture_time.o -ljpeg
実行方法
> ./capture_time.o 640 480 30 10 0
 ※ パラメータの順番は、横サイズ、縦サイズ、FPS、撮影枚数、取得YUV画像のJPEGエンコード指定(0がエンコードしない)

【Sentecカメラ VGA 30FPS】
デバイス情報
Driver name : SentechTUSB
Driver Version : 3.0.27
Device name : Sentech MC83 USB Camera -1: 4
実行結果
loop_count = 0, time_start = 946699726.931939 time_end = 946699727.223627 time_between = 0.291688[s]
loop_count = 1, time_start = 946699727.223681 time_end = 946699727.497582 time_between = 0.273901[s]
loop_count = 2, time_start = 946699727.497590 time_end = 946699727.772557 time_between = 0.274967[s]
loop_count = 3, time_start = 946699727.772565 time_end = 946699728.013043 time_between = 0.240478[s]
loop_count = 4, time_start = 946699728.013050 time_end = 946699728.286483 time_between = 0.273433[s]
loop_count = 5, time_start = 946699728.286492 time_end = 946699728.560392 time_between = 0.273900[s]
loop_count = 6, time_start = 946699728.560400 time_end = 946699728.834367 time_between = 0.273967[s]
loop_count = 7, time_start = 946699728.834375 time_end = 946699729.108758 time_between = 0.274383[s]
loop_count = 8, time_start = 946699729.108766 time_end = 946699729.348253 time_between = 0.239487[s]
loop_count = 9, time_start = 946699729.348261 time_end = 946699729.623229 time_between = 0.274968[s]

【Playstation Eye(ov534センサ)】
デバイス情報
Driver name : ov534
Driver Version : 3.4.0
Device name : USB Camera-B4.09.24.1
実行結果
loop_count = 0, time_start = 946699819.712900 time_end = 946699819.745972 time_between = 0.033072[s]
loop_count = 1, time_start = 946699819.746023 time_end = 946699819.779308 time_between = 0.033285[s]
loop_count = 2, time_start = 946699819.779316 time_end = 946699819.812595 time_between = 0.033279[s]
loop_count = 3, time_start = 946699819.812602 time_end = 946699819.845925 time_between = 0.033323[s]
loop_count = 4, time_start = 946699819.845932 time_end = 946699819.879240 time_between = 0.033308[s]
loop_count = 5, time_start = 946699819.879247 time_end = 946699819.912575 time_between = 0.033328[s]
loop_count = 6, time_start = 946699819.912582 time_end = 946699819.945904 time_between = 0.033322[s]
loop_count = 7, time_start = 946699819.945912 time_end = 946699819.979187 time_between = 0.033275[s]
loop_count = 8, time_start = 946699819.979194 time_end = 946699820.012556 time_between = 0.033362[s]
loop_count = 9, time_start = 946699820.012563 time_end = 946699820.045844 time_between = 0.033281[s]

【Logicool C310(UVC)】
デバイス情報
Driver name : uvcvideo
Driver Version : 3.4.0
Device name : UVC Camera (046d:081b)
実行結果
loop_count = 0, time_start = 946699888.755812 time_end = 946699889.157683 time_between = 0.401871[s]
loop_count = 1, time_start = 946699889.157735 time_end = 946699889.193234 time_between = 0.035499[s]
loop_count = 2, time_start = 946699889.193242 time_end = 946699889.225535 time_between = 0.032293[s]
loop_count = 3, time_start = 946699889.225541 time_end = 946699889.257835 time_between = 0.032294[s]
loop_count = 4, time_start = 946699889.257843 time_end = 946699889.293376 time_between = 0.035533[s]
loop_count = 5, time_start = 946699889.293384 time_end = 946699889.325670 time_between = 0.032286[s]
loop_count = 6, time_start = 946699889.325677 time_end = 946699889.361200 time_between = 0.035523[s]
loop_count = 7, time_start = 946699889.361209 time_end = 946699889.393492 time_between = 0.032283[s]
loop_count = 8, time_start = 946699889.393500 time_end = 946699889.425794 time_between = 0.032294[s]
loop_count = 9, time_start = 946699889.425801 time_end = 946699889.461345 time_between = 0.035544[s]

以上。

ファイル ファイルの説明
capture_time.c

中村です。

本件、ちょっとだけ関わっていますので、コメントさせてください。
(このカメラの実機は触ったことも見たこともないのですが....)

ikeyaさんはOpenCVで・・・とのことでしたが、kensakuさんの状況をみると、
下の方の問題みたいですね。

kensakuさん、
他のLinux(x86マシンなど)では試されました?

まずはメーカーに、他の適当なLinuxマシンで、実際にどのくらいの
速度がでるものなのかを問い合わせるのが近道のような気もします。

--
なかむら

中村さん
kensakuです。
※すれ違い投稿で追加返信

解析途中の過程でVM上で試しましたが、
select時(画像バッファ準備の待機コマンドと思われる)でSelectTimeoutが発生していました。

その為、メーカーのドキュメント周りを漁った結果が先ほどの報告になります。
どちらにしろ独自のプログラムを作ってV4L制御をして下さい、って流れになると思います・・・

以上。

中村です。

kensakuさん、
解析情報の提供、ありがとうございます。

> Sentech独自V4L拡張コマンドを実行しているようです

となると、ちょっと面倒ですね。
ATDE5環境での、atmark-distやlinuxカーネルのソースの
範囲でのパッチですめばいいですが...

--
なかむら

kensakuです。
継続調査により遅延の原因が判明しました。

取得する画像形式をV4L2_PIX_FMT_YUYVで画像を取得すると
1枚の取得に数百ms時間がかかる事がサンプルプログラム改修より分かりました。

ドキュメントを参照すると(一部抜粋します)
「Most Sentech cameras use Bayern RGGB8 or/and BGGR8 as native (raw)
format. Other formats supported by the Linux driver are implemented in soft-
ware, and therefore slower.」
と記載されており、簡単に言うとRGGB8 又は BGGR8以外は遅い、と記載されています。
確かにサンプルプログラム内の出力形式をRGGB8からYUYVに変更すると毎フレーム250ms~500msかかるようになりました。

一般のV4Lカメラ制御ではYUYV形式又はMJPEGが使われており、
おそらくcvQueryFrameでも何も指定しなければYUYV形式で使われている可能性があります。
(motionもmjpg-streamerも実行時に形式を指定しなければ大体どのUSBカメラにも
 サポートされているYUYVを使ってます)

以上より、V4LでSentechのカメラを使う場合には取得フォーマットによってはフレームを
維持出来ない可能性があるという結論になります。
もしOpenCVならば、cvSetCapturePropertyのCV_CAP_PROP_FOURCCで
フォーマット形式を変えてみてはどうでしょうか?

これ以上はArmadilloとは関係なくカメラ側のお話になると思うので
詳細な仕様の問い合わせ等はSentech社に調整を取りたいと思います。
(※そもそもYUYV形式での画像取得が遅いのは致命的すぎるので・・・)

以上。

中村です。

> 継続調査により遅延の原因が判明しました。

kensakuさん、ありがとうございます。

ドキュメントのその前後もざっと読んでみました。
私の仕事は動かすことが目的ではなかったので(なのでドキュメントは
ほとんど読んでません)、クロス環境でビルドできるところまで確認して
手渡してしまいましたが、実用になるまでにするには、ちゃんと
ドキュメントを読んでカスタマイズするとか、改造するとか、しないと
ならなそうですね。

> (※そもそもYUYV形式での画像取得が遅いのは致命的すぎるので・・・)

ですねぇ~。

--
なかむら

自己レスです。
遅延が発生している原因の一部が分かりました。

結論からいいますとSentechのUSBカメラは汎用V4Lサンプルソースでは
正常に動作しない事が分かりました。
(フレームレートが維持出来ない、又はselect時にTimeoutが発生する、等)

よって、Ikeya様の
>openCVの関数cvQueryFrameで画像取り込みを行っています。
>この関数の実効時間が数百ms掛かってしまっています。
に関しても同様の問題が発生していると思われます。

Sentech社のドライバに添付されていたサンプルソースを実行すると
A840上でXGAでも30FPS(33ms)間隔で画像が取得出来ている事を確認致しました。

>Ikeya様
SentechのUSBドライバ配下
「Sentech-3.0.27\DOC\examples\output_IO2」にある「snapshotsT.c」
をビルドし、実行してみて下さい。(実行時に -s 1を付けると画像保存も行う)
VGAの画像が30FPSで画像が取得出来ると思います。

本サンプルソースを参照すると、Sentech独自V4L拡張コマンドを実行しているようです。(トリガモード設定等色々)
まだ、どの独自コマンドが必要な作法かは分かりませんが、
OpenCVのcvQueryFrameを含め、通常のカメラ制御アプリでは
Sentech向けにカスタマイズしないと望む動作にならないものと思われます。

>アットマーク様
申し訳御座いませんが、貴社でSentechのカメラ制御を行っているサンプルソース等ありましたら
提供願えますでしょうか?
何が独自で何が汎用V4Lで制御出来るのかを分かる範囲で展開頂ければ幸いです。

以上。