Armadilloフォーラム

Armadillo-800 EVAをUVCカメラとして使用する

sugar_hagi

2014年8月8日 10時31分

お世話になります。

ボードに搭載されたカメラからの取り込み画像を保存したく、
下記ページの手順を参考に、画像のキャプチャを行いました。
「Howto : Armadillo-800 EVAをUVCカメラとして使用する 」
http://armadillo.atmark-techno.com/howto/a800eva-use-uvc-gadget

しかし、ATDE4でguvcviewで画像をキャプチャしたところ、
17FPS程度のフレームレートでしか保存することができませんでした。

保存した画像を使用してPC上で動作検証を行いたく、
リアルタイム(30FPS)で画像を保存できる画像取得方法があれば、
ご教授いただけませんでしょうか。

また、UVCカメラとして利用する手順を実施したことで、
USB-Ethenetガジェットを利用した、ArmadilloとATDE4間でのFTP通信が
できなくなってしまったのですが、これは、カーネルを書き戻さないと
FTP通信ができないのでしょうか。

以上、よろしくお願いいたします。

コメント

> 17FPS程度のフレームレートでしか
R-Mobile A1 の USB2.0 Function Module(USBデバイスとして動作する機能)
はUVCクラスで使われるIsochronous転送モードでは62.5Mbpsまでしか
転送する事ができません。

これはVGAサイズのYUV4:2:0(1画素あたり12bit)画像だと、
およそ 16.95FPSになるので、17FPSは妥当な値です。

> リアルタイム(30FPS)で画像を保存できる画像取得方法があれば

これはカメラの出力するYUVをそのまま、PCに送りたいという事でしょうか?
同じCPUを使っているArmadillo-840/810であれば、HWのJPEGエンコーダーを使って、
Ethernetで送る事もできるのですが。。

> FTP通信ができなくなってしまったのですが
Howto : Armadillo-800 EVAのUSBデバイス機能を使用する
http://armadillo.atmark-techno.com/howto/a800eva-use-usb-gadget
この手順で、下記のコンフィグを有効にして

[*] CDC Ethernet + CDC Serial + UVC configuration

g_armadillo.koを作っているのであれば、カーネルはそのままで、UVC GadgetとEthernet Gadgetが
同時に使える状態になっているはずです。
ifconfig -a で usb0 のネットワークインターフェースも見えない状態でしょうか?

Ethernetで転送できる可能性について、補足します。

ベンチマークしか取っていないので、参考情報ですが、
libjpeg-turboというJPEG圧縮ライブラリを使って、eMMCに置いた
VGAサイズのRGB画像を大体60FPS程度のスループットで圧縮した
事があります。

この場合はボトルネックがEthernetになるので、帯域さえ確保
できればソフトウェアでJPEG圧縮 -> UDP等で転送 でPC等に
画像を送出できますね。

ご回答ありがとうございます。

> およそ 16.95FPSになるので、17FPSは妥当な値です。
ご解説ありがとうございます。理解できました。

> これはカメラの出力するYUVをそのまま、PCに送りたいという事でしょうか?
できれば非圧縮データを保存したいですが、30FPSで保存できることを最優先としたく、圧縮することで実現できるのであればそちらを試したいと思います。

> Howto : Armadillo-800 EVAのUSBデバイス機能を使用する
「ネットワークの疎通確認」手順までを実施したことろ、利用できるようになりました。

> libjpeg-turboというJPEG圧縮ライブラリを使って、
こちらは、
①カメラからの出力データをメモリに保存
②libjpeg-turboを使用して、JPEGに圧縮
③JPEGデータをUDP送信
④PCでUDP受信
というイメージでよろしいでしょうか?

まずは、②の使い方について調べてみます。

お世話になります。

メモリにバッファを用意し、非圧縮画像を数百フレーム保存してみたのですが、この時点で、19FPS程度でしか画像を取得できていないようです。
原因を調べてみたところ、現在、OpenCVのcvQueryFrame関数を使って画像を取得しているのですが、画像取得ループ中のこの処理だけで約50ms以上かかってしまっています。
また、この時間に他の処理の時間が加算されていくというわけではなく、他の処理の速度が速くても、一回のループにかかる時間が50msにつりあげられてしまうという感じです。

V4Lのサンプルコードでも時間を計測してみたのですが、カメラドライバがバッファをフィルするまで待つ、selectシステムコールで時間がかかっているようで、その時間が約50msだったので、OpenCVでも同じ原因で時間がかかっているのではないかと考えています。

これは、オンボードカメラのフレームレートがそもそも30FPS出ていない、ということでしょうか?
問題を解決する方法がありましたらご教授ください。

自己レスです。

> これは、オンボードカメラのフレームレートがそもそも30FPS出ていない、ということでしょうか?
Armadillo-810 EVA製品マニュアルのP.18に下記のように書かれていました。
これを見る限りオンボードカメラのフレームレートはVGAで30fpsに対応しているようです。

----------------------------------------
CEU0 最大 16bit データバス(CEU1 を使用しない場合に可能な最大 bit 数)
カメラモジュール CRESYN 社製 DCB-NSB55QFMRB 3.1M ピクセル QXGA:最大 15fps, VGA:最大 30fps 8bit データバス
----------------------------------------

at_kojiro.yamada

2014年10月22日 18時58分

> これを見る限りオンボードカメラのフレームレートはVGAで30fpsに対応しているようです。
おっしゃるとおり、オンボードのカメラモジュールはVGAで30fpsのフレームレートに対応しています。
カメラから30fpsで出力されるVGAの画像データを、R-Mobile A1が取り込めることもスペック的に間違いありません。

> OpenCVのcvQueryFrame関数を使って画像を取得しているのですが、画像取得ループ中のこの処理だけで約50ms以上かかってしまっています。
> V4Lのサンプルコードでも時間を計測してみた
とのことですが、コードの中でどのように時間を計測しているか教えていただけますか?

ご返信ありがとうございます。

処理時間計測に使用したOpenCVとV4Lのソースコードを添付させていただきます。
OpenCVのコードについては、Armadillo-810で動かしてみたところcvQueryFrameでの画像取得時間は23msとなっております。

よろしくお願いいたします。

ファイル ファイルの説明
capturetime_opencv.c 処理時間計測OpenCV版
capturtime_v4l.c 処理時間計測V4L版