Python OpenCV立体声盲人之一?

时间:2012-06-20 12:07:49

标签: python opencv camera real-time

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

我的问题是如何从2个摄像头获取视频?我读过C ++版本,但我更喜欢python。非程序员更容易。

我不明白为什么我的网络摄像头仅适用于Wleft,但是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

回答你的问题:

  1. 在当前的OpenCV-Python中。我找不到任何命令,但是当我评论出Leftcam时,Rightcam正常工作。反之亦然。
  2. 是的,我刚发现它!我重定向命令并仔细搜索。

      

    libv4l2:开启错误:设备上没有剩余空间

  3. 他们是完全相同的。 OKER193。

  4. 我只能使用它只有一个凸轮左或右。无法同时从其中两个视频中获取视频。
  5. 我没有集线器。我不知道它是不是真正的端口,但是我把笔记本的左右连接起来。

    http://opencv-users.1802565.n2.nabble.com/Multiple-Camera-Read-Error-td7001563.html

  6. 我试过cv.ReleaseCapture()

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

    我收到了错误:

    ...
    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'
    

    我真的很好奇
    http://opencv.willowgarage.com/documentation/python/highgui_reading_and_writing_images_and_video.html?highlight=releasecapture
    CaptureFromCAM最后一行说要释放结构,请使用ReleaseCapture。此功能可能会被取消。

    四处游荡,发现了这一点
    https://superuser.com/questions/431759/using-multiple-usb-webcams-in-linux

    然后我检查每个凸轮的分辨率是否为640x480正常。我的网络摄像头是1.1 / 2.0 USB接口。

    root@HPDebian:~# v4l2-ctl -d /dev/video0 --list-formats
    ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'YUYV'
        Name        : YUV 4:2:2 (YUYV)
    

    然后检查另一个凸轮

    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

    尝试马丁的time.sleep(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)
    

    程序运行非常缓慢,WebCAM1失真,WebCAM2不是。

2 个答案:

答案 0 :(得分:0)

要检查的一些事项:

  1. OpenCV是否拿起了所有相机?试试checking how many cameras are attached
  2. 您是否收到任何其他错误消息?即是否有一个你提到过的堆栈轨道?
  3. 两台相机之间是否存在硬件差异?
  4. 如果你评论lcam的所有内容会怎样?也就是说它只是与第二台相机有关,还是与一次运行两台相机有关。
  5. 根据this suggestion
  6. 尝试将它们插入单独的集线器

答案 1 :(得分:0)

这可能是一个通用的多摄像机问题,我能够使用gsteamer管道解决此问题。借助在Ubuntu 18.04上通用的内核4.15.0-34和使用gstreamer / v4l支持编译的OpenCV 3.4,我能够使用动力集线器在python上使用带有Mstream压缩的MJPG压缩(使用2xC922和1xC920摄像机-不需要10fps的帧率)

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)