Armadilloフォーラム

Armadillo-810 UVCガジェットのcamctrlについて

ohshimayyyy

2014年8月20日 11時49分

お世話になります。
大島と申します。

標記の件、Armadillo-810でUVCガジェットのcamctrlにて、
フリッカー対策で、露光時間の調整を行なおうと試みております。
ATDE上でアプリケーション(動画撮影及び表示)を実行し、
動画を確認してみると、露光時間の変更に対する反映が確認できたのですが、
実機(Armadillo-810)でアプリケーション(動画撮影及び表示)を
実行し、動画を確認してみると、露光時間の変更に対する反映が確認できす、
変更前と特に変化がない様に見えています。
実機(Armadillo-810)でアプリケーション(動画撮影及び表示)を
実行し、露光時間の変更に対する反映ができる手順をご教示頂きたいです。

ATDEでの手順としては、下記の通り、実施しました。
1. 実機(Armadillo-810)起動後、予め、camctrlで露光時間を変更する。
2. ATDEで、アプリケーション(動画撮影及び表示)を実行する。

実機(Armadillo-810)での手順としては、下記の通り、実施しました。
1. 実機(Armadillo-810)起動後、予め、camctrlで露光時間を変更する。
2. camctrlのプロセスをkillする。
(UVCガジェットは、カメラデバイスを利用している為、
実機(Armadillo-810)のアプリケーション(動画撮影及び表示)が
カメラデバイスを利用することができない状態となり、実行前に、
UVCガジェットを止めています)
3. 実機(Armadillo-810)で、アプリケーション(動画撮影及び表示)を実行する。

ATDEと実機(Armadillo-810)での手順の差分は、camctrlのプロセスをkillする
手順のみなので、camctrlのプロセスをkillする事で、camctrlによる設定に
影響を与えているのではないかと考察しております。

以上、ご対応の程、宜しくお願い致します。

コメント

at_ohsawa

2014年8月20日 14時26分

Armadillo-810のカメラモジュール01のデバイスドライバは、
VIDIOC_S_FMT の ioctl を受け取ると、露出補正、フリッカ除去等の
カメラの制御パラメーターを初期値に戻す実装になっています。

> 3. 実機(Armadillo-810)で、アプリケーション(動画撮影及び表示)を実行する。
ここで実行しているアプリケーション内で VIDIOC_S_FMT を発行していますか?
前述の通り、その場合はcamctrlで設定した露出時間の設定が、初期値に戻ります。

> camctrlのプロセスをkillする事で、camctrlによる設定に
> 影響を与えているのではないかと考察しております。
camctrlを killする/しない はカメラの設定に影響は与えません。

VIDIOC_S_FMTが発行されていると仮定しますが、先に大島様のアプリケーショ
ンを実行し、アプリケーション内で VIDIOC_S_FMT を発行した後に、camctrlで
露出時間を設定してみてください。

ohshimayyyy

2014年8月20日 15時22分

大島です。
ご対応、有難う御座います。

> > 3. 実機(Armadillo-810)で、アプリケーション(動画撮影及び表示)を実行する。
> ここで実行しているアプリケーション内で VIDIOC_S_FMT を発行していますか?
> 前述の通り、その場合はcamctrlで設定した露出時間の設定が、初期値に戻ります。
実行しているアプリケーション内では、OpenCVで、カメラモジュールを使用しています。
それが上記に該当していなければ、VIDIOC_S_FMT は発行していない認識です。

> VIDIOC_S_FMTが発行されていると仮定しますが、先に大島様のアプリケーショ
> ンを実行し、アプリケーション内で VIDIOC_S_FMT を発行した後に、camctrlで
> 露出時間を設定してみてください。
アプリケーション内では、OpenCVでカメラモジュールを使用しているのですが、
実機(Armadillo-810)上では、camctrlのプロセスをkillしないと、
カメラモジュールが使用できない情況なのですが、アプリケーション内で 、
VIDIOC_S_FMT を発行すれば、camctrlのプロセスをkillせずに、
アプリケーション内で、カメラモジュールを使用する事ができるのでしょうか?

以上、ご対応の程、宜しくお願い致します。

at_ohsawa

2014年8月21日 16時57分

> OpenCVで、カメラモジュールを使用しています。
OpenCVの何の関数を呼んでいるかに拠りますが、
OpenCVライブラリでカメラを扱う関数の中身はv4l2のioctlを呼ぶ実装です。
cvCapture系の関数でフレームサイズや色深度を設定すると
VIDIOC_S_FMTを呼ぶ実装になっていた記憶があります。

>camctrlのプロセスをkillせずに、
>アプリケーション内で、カメラモジュールを使用する事ができるのでしょうか?
先にアプリケーションを起動してから、camctrlを起動してはいけないでしょうか。

kensaku

2014年8月21日 17時14分

kensakuと申します。
一部補足がありますので横から失礼します。

アットマークさんのご指摘通り、OpenCV上でカメラを使用した場合、カメラOpen処理でVIDIOC_S_FMTを発行しています。
※カメラドライバOpen後、VGAサイズに解像度を設定する処理が入っており、そこでVIDIOC_S_FMTを叩いている。
詳細につきましてはOpenCVのソース highgui\src\cap_v4l.cppを確認下さい。

camctrlにつきましては使用した事がありませんので詳細は分かりませんが、
camctrlの設定がV4L2を経由せず直接SCCBでコマンドを叩く仕組みであれば後起動でいけるはずです。
※間違っていたらすみません。
もし起動できない場合はOpenCVにも露光設定を行うIFは用意されておりますので
そちらを使われるのもありかと思います。
http://opencv.jp/opencv-2svn/c/reading_and_writing_images_and_video.htm…
※上記サイトでは2.2時点のもので未サポートと記載されていますが、2.4以降であれば大体対応しています。

ohshimayyyy

2014年8月22日 21時30分

大島です。
お世話になります。
ご対応、有難う御座います。
ご連絡が遅れて、すみません。

> もし起動できない場合はOpenCVにも露光設定を行うIFは用意されておりますので
> そちらを使われるのもありかと思います。
OpenCVで、露光設定ができるのであれば、その方が簡単なので、こちらを試そうと考えておりますが、
当方の開発環境にインストールされているOpenCVのバージョンが、2.3.1で、対応されておらず、
最新のOpenCVにアージョンアップをしようと試みております。
現状は、別途、フォーラムに投稿させて頂いておりますが、バージョンアップの手順が分からず、
保留の状態となっております。

VIDIOC_S_FMTの発行につきまして、大変参考になりました。
ご助言、有難う御座いました。

ohshimayyyy

2014年8月22日 21時22分

大島です。
お世話になります。
ご対応、有難う御座います。
ご連絡が遅れて、すみません。

> OpenCVの何の関数を呼んでいるかに拠りますが、
OpenCV上でのカメラの使用には、cvCaptureFromCAMを使用しています。

> 先にアプリケーションを起動してから、camctrlを起動してはいけないでしょうか。
Armadillo-810の起動時に、camctrlが起動している様に見えるのですが、
認識違いでしょうか?
また、camctrlの起動方法が分かっておりません。

ご対応の程、宜しくお願い致します。

ohshimayyyy

2014年8月25日 10時37分

お世話になります。
大島です。

> VIDIOC_S_FMTが発行されていると仮定しますが、先に大島様のアプリケーショ
> ンを実行し、アプリケーション内で VIDIOC_S_FMT を発行した後に、camctrlで
> 露出時間を設定してみてください。
アプリケーション内で、cvCaptureFromCAM後に、
下記の通り、露光時間を設定したところ、
----------------------------------------
system("camctrl --set --exposure=5000");
system("camctrl --get --all");
----------------------------------------
設定の反映はされているようなのですが、
----------------------------------------
gain: 16
exposure: 4993←near 5000
red: 132
green: 128
blue: 154
auto-gain: on
auto-exposure: off
auto-white-balance: on
colorbar: off
dsp-colorbar: off
----------------------------------------
下記の様なエラーが出力されます。
----------------------------------------
HIGHGUI ERROR: V4L2: Unable to get property (5) - Invalid argument
----------------------------------------
露光時間が反映された様な画像は、確認できず、
原因が分かっておりません。
どうすれば反映されるのか、ご教示頂きたく。

ご対応の程、宜しくお願い致します。

ohshimayyyy

2014年8月25日 11時05分

お世話になります。
大島です。

度々、申し訳ありません。

> Armadillo-810の起動時に、camctrlが起動している様に見えるのですが、
> 認識違いでしょうか?
私の認識違いです。すみません。
起動方法は、マニュアルを参照しました。

> HIGHGUI ERROR: V4L2: Unable to get property (5) - Invalid argument
上記エラーについては、camctrlの起動に関係なく、
Armadillo-810を起動すると出力されます。
但し、画像に対しては、やはり露光時間が反映されていない様です。
他の極端な値で試してみましたが、変化がありませんでした。

ご対応の程、宜しくお願い致します。

ohshimayyyy

2014年8月28日 9時18分

お世話になります。
大島です。

上記の件、解決致しました。

アプリケーション内で、cvCaptureFromCAM後に、
下記の通り、露光時間を設定しておりましたが、
----------------------------------------
system("camctrl --set --exposure=5000");
system("camctrl --get --all");
----------------------------------------
その後、更に、cvSetCapturePropertyを実行していた為、
VIDIOC_S_FMTが発行され、露光時間の設定がリセットされていた様です。

現状、cvCaptureFromCAM / cvSetCapturePropertyの後に、
露光時間を設定し、画像(映像)に反映させる事ができました。
cvCaptureFromCAM / cvSetCaptureProperty以外のライブラリで、
VIDIOC_S_FMTが発行されるものが何なのか、気になるところですが、
追々、ライブラリのソースを覗いてみようと考えております。
ご協力頂いた皆様、有難う御座いました。

ご対応の程、宜しくお願い致します。