hack一個3D攝像頭來解悶

不想寫論文不想寫摘要不想寫緒論不想寫研究背景不想寫現(xiàn)狀。。。

嗯,好久不寫博客,因為我在忙(bu)著(xiang)寫(chao)論文。為我的心理健康著想,我決定搞點東西玩玩。于是我去某寶買了這個:

12大洋買的3d攝像頭

實際上這個是一種型號為DS-3DW300的日產3d攝像頭,每個頭最大分辨率為640x480,最大幀率為30fps,彩色。

焊好usb連接線并連接到ubuntu,用lsusb命令獲取其usb描述符信息,可以發(fā)現(xiàn):

$ lsusb -d 18e3:5031 -v
...
bFunctionClass     14 Video
...

好嘛,uvc啊,直接拿Cheese打開:

只能打開一個攝像頭

你大爺?shù)?。。果然不用官方軟件(CHUSEI 3D Camera)就只能打開一個頭啊,而且那個軟件是windows獨占的。

沒辦法,開心的Hack吧

既然是UVC協(xié)議,先考慮SELECTOR_UNIT中有多個輸入的情況。呃。。。瞄了一眼剛才lsusb獲取的信息發(fā)現(xiàn):

bNrInPins    1

好吧,去他大爺?shù)膗vc,還是從官方軟件下手吧。切換到windows下,用BusHound抓取在軟件中切換雙攝像頭時,usb總線上的數(shù)據(jù):

Bus Hound 6.01 capture on Windows Vista Service Pack 1 (x64). Complements of www.perisoft.net

double

  Device - Device ID (followed by the endpoint for USB devices)
            (26) USB 視頻設備
  Length - Total transfer length
  Phase  - Phase Type
            CTL   USB control transfer       
            IN    Data in transfer           
            OUT   Data out transfer          
  Data   - Hex dump of the data transferred
  Descr  - Description of the phase
  Cmd... - Position in the captured data
  Driver - Driver that submitted the command
            ntoskrnl     : NT Kernel & System 6.1.7601.19135 (win7sp1_gdr.160121-1718)


Device  Length    Phase  Data                      Description       Cmd.Phase.Ofs(rep)  Driver      
------  --------  -----  ------------------------  ----------------  ------------------  ------------
  26.0            CTL    a1 85 00 08  00 06 02 00  GET LEN                  1.1.0        ntoskrnl      
  26.0         2  IN     02 00                     ..                       1.2.0                      
  26.0            CTL    21 01 00 08  00 06 02 00  SET CUR                  2.1.0        ntoskrnl      
  26.0         2  OUT    50 ff                     P.                       2.2.0                      
  26.0            CTL    a1 85 00 0f  00 06 02 00  GET LEN                  3.1.0        ntoskrnl      
  26.0         2  IN     02 00                     ..                       3.2.0                      
  26.0            CTL    21 01 00 0f  00 06 02 00  SET CUR                  4.1.0        ntoskrnl      
  26.0         2  OUT    00 f6                     ..                       4.2.0                      
 ...
  26.0         2  OUT    76 c3                     v.                      32.2.0                      
  26.0            CTL    a1 85 00 0a  00 06 02 00  GET LEN                 33.1.0        ntoskrnl      
  26.0         2  IN     02 00                     ..                      33.2.0                      
  26.0            CTL    21 01 00 0a  00 06 02 00  SET CUR                 34.1.0        ntoskrnl      
  26.0         2  OUT    04 00                     ..                      34.2.0                      

嘿,SET CUR。。。翻出UVC協(xié)議來看了一眼,果然所有的輸出數(shù)據(jù)都是SET CUR的格式。后面我又抓去了左、右以及紅藍模式切換時的數(shù)據(jù),發(fā)現(xiàn)這4種情況下總線上的數(shù)據(jù)都是一樣的,只有最后一個SET CUR分別穿出的是1234。

也就是說,只要我們自己構造出相應的SET CUR指令流,就可以實現(xiàn)攝像頭工作方式的切換了!于是乎就有了下面這段腳本:

# need pyusb and python binding for opencv
# also need libusb installed
import cv2
import usb.core

cam=cv2.VideoCapture(0)

dev = usb.core.find(idVendor=0x18e3, idProduct=0x5031)
# simulate the SET_CUR sequence
dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x50,0xff])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0xf6])
dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x25,0x00])
dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x5f,0xfe])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0x03])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0x02])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0x12])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0x04])
dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x76,0xc3])

k=0
while (k!=ord('q')):
    ret,frame=cam.read()
    cv2.imshow("cam_test",frame)

    k=cv2.waitKey(18)&0xFF
    kv=k-ord('0')
    #  print(kv)
    #  if press 1,2,3 or 4, change the 3d camera mode
    if kv in [1,2,3,4]:
        dev.ctrl_transfer(0x21,0x01,0x0a00,0x0600,[kv,0x00])

運行腳本并按下“4”,結果如下:

hack成功

可以的,把兩張圖壓縮一半然后當成一張圖通過UVC傳輸,跟我做的那個雙攝像頭差不多,不過我是利用YUV格式來隱藏兩張灰度圖(還是我的強一點哈哈哈哈哈哈哈哈哈(?ì _ í?))。

玩完收工,憋論文去~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容