PythonOpenCV立体摄像机盲镜头?

PythonOpenCV立体摄像机盲镜头?,python,opencv,camera,real-time,Python,Opencv,Camera,Real Time,我的系统是Linux HPDebian 3.2.0-2-amd64#1 SMP x86#U 64 GNU/Linux Python 2.7,OpenCV2。我只能用一个凸轮 我的问题是如何从2个摄像头获取视频?我已经阅读了C++版本,但我更喜欢Python。这对于非程序员来说更容易 我不明白为什么我的网络摄像头只能在左边工作,但WRight是一个灰色的空白窗口。在命令行中 VIDIOC_QBUF:无效参数 继续淹没我的命令行 OpenCV Python有一个现成的立体声程序包,但我需要访问每个c

我的系统是Linux HPDebian 3.2.0-2-amd64#1 SMP x86#U 64 GNU/Linux Python 2.7,OpenCV2。我只能用一个凸轮

我的问题是如何从2个摄像头获取视频?我已经阅读了C++版本,但我更喜欢Python。这对于非程序员来说更容易

我不明白为什么我的网络摄像头只能在左边工作,但WRight是一个灰色的空白窗口。在命令行中

VIDIOC_QBUF:无效参数

继续淹没我的命令行

OpenCV Python有一个现成的立体声程序包,但我需要访问每个cam的元素,因为我想测试我的算法

我的尝试:

'''
Simple Stereo feed
'''
import cv
cv.NamedWindow("wLeft", cv.CV_WINDOW_AUTOSIZE)
cv.NamedWindow("wRight", cv.CV_WINDOW_AUTOSIZE)
captureL = cv.CaptureFromCAM(0)
captureR = cv.CaptureFromCAM(1)

def repeat():
    frameL = cv.QueryFrame(captureL)
    cv.ShowImage("wLeft", frameL)
    frameR = cv.QueryFrame(captureR)
    cv.ShowImage("wRight", frameR)

while True:
    repeat()
    if cv.WaitKey(33)==27:
       break

cv.DestroyAllWindows()
更新1 回答你的问题:

  • 在当前的OpenCV Python中。我找不到任何命令,但当我注释掉Leftcam时,Rightcam工作。反之亦然

  • 是的,我刚找到它!。我改变了指挥方向,仔细搜索

    libv4l2:打开流时出错:设备上没有剩余空间

  • 它们是相同的。好的,193

  • 我只能用左或右1个凸轮。无法同时从其中两个获取视频源

  • 我没有集线器。我不知道它是不是一个真正的端口,但我把它连接在笔记本的左右两侧

  • 我试过cv.ReleaseCapture()

    我得到了错误:

    ...
    VIDIOC_QUERYMENU: Invalid argument //Many lines
    ...
    Traceback (most recent call last):
      File "55.py", line 19, in <module>
        repeat()
      File "55.py", line 13, in repeat
        cv.ReleaseCapture(captureL)
    AttributeError: 'module' object has no attribute 'ReleaseCapture'
    
    然后检查另一个凸轮

    root@HPDebian:~# v4l2-ctl -d /dev/video1 --list-formats
    ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'YUYV'
        Name        : YUV 4:2:2 (YUYV)
    
    在这一点上,我不确定我的USB笔记本。它可能是内部的一个中心。我将尝试降低分辨率并再次发布我的结果

    更新2 尝试时间。Martin提供的睡眠(1):

    VIDIOC_QUERYMENU: Invalid argument //Many lines
    libv4l2: error setting pixformat: Device or resource busy
    HIGHGUI ERROR: libv4l unable to ioctl S_FMT
    libv4l2: error setting pixformat: Device or resource busy
    libv4l1: error setting pixformat: Device or resource busy
    HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT
    
    libv4l2: error turning on stream: No space left on device
    VIDIOC_STREAMON: No space left on device
    VIDIOC_QBUF: Invalid argument  //Many lines until Ctrl C
    
    我将在M$xp中再次尝试

    更新3 仍然在使用Linux。M$xp很忙。这次我删除c1和c2。因为我不知道如何释放相机。我相信我使用的驱动程序API每次只允许1个设备访问内核。所以我试试这个

    def repeat1():
        c1 = cv.CreateCameraCapture(0)
        i1 = cv.QueryFrame(c1)
        cv.ShowImage("WebCAM1", i1)
        del(c1)
    def repeat2():
        c2 = cv.CreateCameraCapture(1)
        i2 = cv.QueryFrame(c2)
        cv.ShowImage("WebCAM2", i2)    
        del(c2)
    
    程序运行非常缓慢,网络摄像头1失真,网络摄像头2不失真。

    需要检查的一些事项:

  • OpenCV正在接收你所有的相机吗?试试看
  • 您是否收到任何其他错误消息?i、 e.是否有与您提到的堆叠轨迹相同的堆叠轨迹
  • 这两台摄像机之间有硬件上的区别吗
  • 如果你把所有关于lcam的东西都注释掉会怎么样?i、 这只是与第二台摄像机有关,还是与同时运行两台摄像机有关
  • 尝试将其插入单独的集线器,如所示

  • 这可能是一个通用的多摄像头问题,我能够通过使用gsteamer管道解决它。使用Ubuntu 18.04上的内核4.15.0-34-generic和使用gstreamer/v4l支持编译的OpenCV 3.4,我能够在一个USB端口上使用一个带电源的集线器,使用python中gstreamer的MJPG压缩(使用2xC922和1xC920摄像头-10fps的帧速率对这项工作来说是不必要的):


    似乎你不是唯一一个遇到这种情况的人:您是否尝试过“导入cv2”和“CaputureL=video.create_capture(0)”的可能重复?此外,您可能还应该在休息时使用“CaputureL.release()”释放相机,因为这可能会导致调试时出现问题。@Snesticle:两次导入库很好-它可能共享了其中的一些资源…@Snesticle我现在正在读命令cv2 sir.A Sleep()有时需要在两个摄像头设置之间进行切换-至少在USB网络摄像头较差的Windows上是这样drivers@MartinSleep()函数。好的,我会试试你的建议。@MartinBeckett我更新了答案,仍然不能解决这个问题。@Sarit-网络摄像机能做MJPG吗?两个原始YUYV流(即使是300kpixels)对于单个USB来说可能太多了hub@MartinBeckett我不知道。我怎么知道的?谢谢你的回答。但我很抱歉现在已经6年了。我无法验证你的答案。没关系,这更多是为了将来来到这里的人。
    VIDIOC_QUERYMENU: Invalid argument //Many lines
    libv4l2: error setting pixformat: Device or resource busy
    HIGHGUI ERROR: libv4l unable to ioctl S_FMT
    libv4l2: error setting pixformat: Device or resource busy
    libv4l1: error setting pixformat: Device or resource busy
    HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT
    
    libv4l2: error turning on stream: No space left on device
    VIDIOC_STREAMON: No space left on device
    VIDIOC_QBUF: Invalid argument  //Many lines until Ctrl C
    
    def repeat1():
        c1 = cv.CreateCameraCapture(0)
        i1 = cv.QueryFrame(c1)
        cv.ShowImage("WebCAM1", i1)
        del(c1)
    def repeat2():
        c2 = cv.CreateCameraCapture(1)
        i2 = cv.QueryFrame(c2)
        cv.ShowImage("WebCAM2", i2)    
        del(c2)
    
    def open_cam_usb(dev, width, height):
        gst_str = (
            "v4l2src device=/dev/video{} ! "
            "image/jpeg,widh=(int){},height=(int){},framerate=10/1,"
            "format=(string)RGB ! "
            "jpegdec ! videoconvert ! appsink"
        ).format(dev, width, height)
        return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER)