のびっこ日記

(*|         |*)v ういっすー。 VRとかコンピュータービジョンとかARとかに興味があります。OpenCVとかPCLとかOculusRiftとかUnityとかKinectとかLeapMotionとか手を出していますが、いろいろドツボにハマっててくじけそう。誰か教えてー

激安3D ウェブカメラ(DS-3DW300)をLinuxで使う(*・         ・*v

にゅくすさん達がやって下さいました!

 

以前このブログに激安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をコンパイル、インストールされた環境で

こちらのコードを試してみて下さい。

3dcam.tar.gz - Google ドライブ

 

尚、私のubuntu環境ですと、実行時にroot権限が必要でした。

sudo ./camera みたいにして実行してみて下さいー。

 

これでRaspberryPiなんかでも使えるようになって、3Dカメラ搭載ロボとか作りやすくなりますね!

何か作った方がいらっしゃったら、是非教えてほしいです(*・      ・*)

 

追伸:Twitterの技術的お友達募集中です(*・        ・*)気軽に声掛けてくださいねー @nobikko