在linux下使用 Fitilink 3D Webcam (18e3:5031)
淘宝上买了个FITI的双目摄像头:
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.2dee37fcJE5aBt&id=531622105019&_u=11hcu395a1f
但是linux上使用v4l2只能控制该摄像头显示一个摄像头的数据,谷歌查一圈发现有人hack了一下,原作在此:
https://www.jianshu.com/p/2ce302d588a0
按这篇文章所说,控制该摄像头输出双目数据需要使用UVC_SET_CUR,但v4l2似乎并不直接支持这个命令,所以需要使用v4l2之外的工具进行配置。
该文章在python中使用了usb.core直接向usb设备发送命令,但这种方式需要root权限,而且想成功运行起来也需要解决一些其它问题,为了方便在程序中使用该摄像头,我们需要找到一种在用户态使用UVC_SET_CUR命令的方式
谷歌了一下,发现uvcdynctrl可以在用户态下使用该控制方式
首先安装uvcdynctrl
ubuntu下就是sudo apt install uvcdynctrl
安装成功后可以在bash下运行命令:uvcdynctrl -d /dev/video1 -S 6:10 '(LE)0x0400'来控制该摄像头显示双摄像头数据
为了在代码中读取摄像头内容,我们需要在代码中运行该命令
#!/usr/bin/env python import cv2 import os def __main(): oldKeyV = 0 running = True cam=cv2.VideoCapture(1) videoUxCmdPat = "uvcdynctrl -d /dev/video1 -S 6:10 '(LE)0x{:{fill}2x}00'" vuxCmd = videoUxCmdPat.format(4, fill="0") while (running): (ret, frame) = cam.read() w = cv2.imshow("3dcam",frame) ctrlKey = cv2.waitKey(18) & 0xFF if ctrlKey == ord('q'): running = False cv2.destroyWindow("3dcam") else: kv = ctrlKey - ord('0') if kv != oldKeyV and kv in xrange(1, 5): oldKeyV = kv vuxCmd = videoUxCmdPat.format(kv, fill="0") os.system(vuxCmd) if __name__ == "__main__": __main()
其中/dev/video1是插入摄像头装载驱动后系统生成的设备文件,需要替换为摄像头对应的设备文件名