激安3D ウェブカメラ(DS-3DW300)をLinuxで使う(*・ ・*v
にゅくすさん達がやって下さいました!
@nobikko いま一緒にラズパイ買ったラボの先輩にソースうpしてもらいましたー https://t.co/lSPBuMo82i
— LINYX (@nyx_goddess) 2014, 9月 9
以前このブログに激安3DカメラをSide-by-sideモードに変更したときのUSBパケットログを置いていましたが、
Linuxでも同じコントロールパケットを送信することでSide-by-sideモードに変更が可能なようです(*・ ・*)
拝見させて頂いたソースコードをPCのLinux上でコンパイルしたら取り急ぎ私の環境では動いています。
具体的には、libusbではUVCカメラのデバイス取得>ストリームをスタート>コールバックで画像受け取り の順で動作させますが、
付属ソフト同様に、ストリームスタート後にlibusb_control_transferでコントロールコード(C3 76 00 04)を転送しています。
void smd_cmd(uvc_device_handle_t *devh) | |
{ | |
char buf[2]; | |
int res; | |
libusb_device_handle *dev_handle; | |
buf[0] = 0x76; | |
buf[1] = 0xc3; | |
dev_handle = devh->usb_devh; | |
res = libusb_claim_interface(dev_handle, 0); | |
if(res != LIBUSB_SUCCESS) printf("claim 0 is failed!\n"); | |
res = libusb_control_transfer(devh->usb_devh, | |
0x21, | |
0x01, | |
0x0800, | |
0x0600, | |
buf, | |
sizeof(buf), | |
0); | |
printf("res = %d\n",res); | |
if(res == sizeof(buf))printf("Control transfer Success!\n"); | |
else printf("Control transfer Failed!\n"); | |
buf[0] = 0x04; |
|
buf[1] = 0x00; |
|
res = libusb_control_transfer(devh->usb_devh, | |
0x21, | |
0x01, | |
0xa00, | |
0x600, | |
buf, | |
sizeof(buf), | |
0); | |
if(res == sizeof(buf))printf("Control transfer Success!\n"); | |
else printf("Control transfer Failed!\n"); | |
} | |
ソースコード
公開の許可を頂きましたので、頂いたコードを説明の為一部修正させて頂いて、CMakeLists.txtも追加した物を用意しました。
よかったらlibuvcとlibusbとopencv 2.4.9をコンパイル、インストールされた環境で
こちらのコードを試してみて下さい。
尚、私のubuntu環境ですと、実行時にroot権限が必要でした。
sudo ./camera みたいにして実行してみて下さいー。
これでRaspberryPiなんかでも使えるようになって、3Dカメラ搭載ロボとか作りやすくなりますね!
何か作った方がいらっしゃったら、是非教えてほしいです(*・ ・*)
追伸:Twitterの技術的お友達募集中です(*・ ・*)気軽に声掛けてくださいねー @nobikko