Armadilloフォーラム

Armadillo 440/debian UVCカメラでキャプチャがうまくいかない

y_kudo_ncpl

2014年2月17日 16時54分

お世話になります。
工藤@NCPLと申します。

先日PC/SCのインストールでご相談させていただいて、
結局依存関係解決がうまくいかずdebianを入れてみたところ
とりあえずPC/SCはdebian上で動きました。
(クロス環境へ持っていく方法をまた考えねばなりませんが。)

併せてUVCカメラからキャプチャする必要があり、OpenCVを入れてみました。
apt-get installで一通り入れて、下記のようなソースのコンパイル・リンクは通ったのですが
とりあえず手元に転がってたUVCカメラで試したところ
cvCreateCameraCapture( 1 )でNULLが帰ってきました。

dmesg を見てみると
usb 1-1: USB disconnect, address 2
usb 2-1: new high speed USB device using fsl-ehci and address 3
usb 2-1: configuration #1 chosen from 1 choice
uvcvideo: Found UVC 1.00 device USB2.0 Camera (1e4e:0103)
uvcvideo: Failed to query (135) UVC control 1 (unit 0) : -32 (exp. 26).
uvcvideo: Failed to query (1) UVC control 2 (unit 0) : -32 (exp. 26).
uvcvideo: Failed to initialize the device (-5).
と出ていますので、どうもOpenCV以前の話のようです。

①この辺のエラー要因調べるにはどこを探せばよろしいでしょうか?

②何かモジュールが足りてないのか?と思って lsmodを実行しても何も出てきません。
modprobe -lでは下記のように表示されました。
#modprobe -l
FATAL: Could not load /lib/modules/2.6.26-at18/modules.dep: No such file or directory
実際に# ls /lib/modules/ すると
2.6.26-at15 2.6.26-at6
がありますが2.6.26-at18/がありません。
kernelのバージョン見ると
# uname -r
2.6.26-at18
と返ってきました。
この不整合はどうやって解決すればよろしいでしょうか?

以下テストしたソース
// OpenCV カメラ画像取得テスト。
#include
#include
#include
#include
#include

#include

int main(int argc, char **argv)
{
CvCapture *capture = NULL;
IplImage *frame = NULL;
int c;
int i;
// カメラに対するキャプチャ構造体を作成。
capture = cvCreateCameraCapture( 1 );

if( capture == NULL ){
printf("cvCreateCapture Return NULL\n" );
return -1;
};

// キャプチャサイズの設定。
frame = cvQueryFrame(capture);
if( frame == NULL ){
printf("cvQueryFrame return NULL\n");
cvReleaseCapture(&capture);
return -2;
};
cvSaveImage( "test.jpg", frame );

// 後片付け。
cvReleaseCapture(&capture);

return 0;
}

何かアドバイスいただけることが在りましたらよろしくお願いします。

コメント

at_yashi

2014年2月19日 15時32分

> 先日PC/SCのインストールでご相談させていただいて、
> 結局依存関係解決がうまくいかずdebianを入れてみたところ
> とりあえずPC/SCはdebian上で動きました。
> (クロス環境へ持っていく方法をまた考えねばなりませんが。)

お役に立てず、すみません。PC/SC を dist に組み込む方法を、こちらでも考
えてみます。

> 併せてUVCカメラからキャプチャする必要があり、OpenCVを入れてみました。
> apt-get installで一通り入れて、下記のようなソースのコンパイル・リンクは通ったのですが
> とりあえず手元に転がってたUVCカメラで試したところ
> cvCreateCameraCapture( 1 )でNULLが帰ってきました。
>
> dmesg を見てみると
> usb 1-1: USB disconnect, address 2
> usb 2-1: new high speed USB device using fsl-ehci and address 3
> usb 2-1: configuration #1 chosen from 1 choice
> uvcvideo: Found UVC 1.00 device USB2.0 Camera (1e4e:0103)
> uvcvideo: Failed to query (135) UVC control 1 (unit 0) : -32 (exp. 26).
> uvcvideo: Failed to query (1) UVC control 2 (unit 0) : -32 (exp. 26).
> uvcvideo: Failed to initialize the device (-5).
> と出ていますので、どうもOpenCV以前の話のようです。
>
> ①この辺のエラー要因調べるにはどこを探せばよろしいでしょうか?

opencv のソースコードで、

opencv/modules/highgui/src/cap_libv4l.cpp:CvCapture* cvCreateCameraCapture_V4L( int index )

あたりが良いかと思います。dmesg に出ているのは uvcvideo ドライバーですが

opecv highgui -> v4l2 -> uvcvide

と、関数コールが流れていきます。v4l2 からカーネルです。uvcvide の部分は

/linux-3.4-at/drivers/media/video/uvc/uvc_video.c::uvc_query_ctrl()

内にあります。v4l2の ioctrlを発行すると、上記の関数が呼ばれます。

> ②何かモジュールが足りてないのか?と思って lsmodを実行しても何も出てきません。

カーネルモジュールはお使いですか?

> modprobe -lでは下記のように表示されました。
> #modprobe -l
> FATAL: Could not load /lib/modules/2.6.26-at18/modules.dep: No such file or directory

modules.dep は、depmod を使うと生成できます。
でも、module を使っていないと思うので、気にしなくても問題ないです。

> 何かアドバイスいただけることが在りましたらよろしくお願いします。

cvCreateCameraCapture() は、v4l2のラッパー関数なのですが、決め打ちが多
く、あまりお勧めしません。ちょっと手間かもしれませんが、v4l2 を直接扱う
方が、今後いろいろ便利だと思います。

http://manual.atmark-techno.com/armadillo-810/armadillo-810_product_man…

を参考にしてみてください。

y_kudo_ncpl

2014年2月20日 10時22分

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

PC/SCの件 是非よろしくお願いします。

カメラキャプチャの件、今回はキャプチャ以外にどうしてもOpenCvの処理を使う必要があるわけではないので
例示していただいたv4l2を直接使う方向も検討します。
ありがとうございました。