在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是插入摄像头装载驱动后系统生成的设备文件,需要替换为摄像头对应的设备文件名

原文地址:https://www.cnblogs.com/astreye/p/8399792.html