【问题标题】:Python OpenCV stereo cam blind one?Python OpenCV 立体摄像头盲一?
【发布时间】:2012-06-20 12:07:48
【问题描述】:

我的系统是 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 有一个现成的立体程序包,但我需要访问每个凸轮的元素,因为我想测试我的算法。

我的尝试:

'''
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. 我只能使用它只有 1 个凸轮左或右。无法同时从其中两个获取视频源。

  5. 我没有集线器。我不知道它是不是一个真正的端口,但我将它连接到我的笔记本的左右。

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

我试过 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

试试 Martin 的 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 没有。

【问题讨论】:

  • 看来你不是唯一一个遇到这种情况的人:permalink.gmane.org/gmane.comp.lib.opencv.user/263
  • 你试过“import cv2”和“CaputureL = video.create_capture(0)”吗?此外,您可能应该在休息时使用“CaputureL.release()”释放您的相机,因为这可能会导致调试时出现问题。
  • @Snesticle:两次导入库的好点 - 它可能会在那里共享一些资源......
  • @Snesticle 我现在正在阅读命令 cv2 sir。

标签: python opencv camera real-time


【解决方案1】:

需要检查的一些事项:

  1. OpenCV 是否会拾取您所有的相机?试试checking how many cameras are attached
  2. 您是否收到任何其他错误消息?即,您提到的堆栈轨道是否存在?
  3. 两个摄像头之间是否存在硬件差异?
  4. 如果您注释掉所有关于 lcam 的内容会怎样?即它只是与第二个摄像头有关,还是与同时运行两个摄像头有关。
  5. 尝试按照this suggestion 将它们插入单独的集线器

【讨论】:

  • 有时需要在两个摄像头设置之间使用 Sleep() - 至少在 USB 网络摄像头驱动程序较差的 Windows 上
  • @Martin Sleep() 函数。好的,我会尝试你的建议。
  • @MartinBeckett 我更新了答案,仍然无法解决。
  • @Sarit - 网络摄像头可以做 MJPG 吗?两个原始 YUYV 流(即使是 300kpixels)对于单个 USB 集线器来说可能太多了
  • @MartinBeckett 我不知道。我怎么知道?
【解决方案2】:

这可能是一个常见的多摄像头问题,我可以通过使用 gsteamer 管道解决它。使用 Ubuntu 18.04 上的内核 4.15.0-34-generic 和使用 gstreamer/v4l 支持编译的 OpenCV 3.4,我能够使用有源集线器在单个 USB 端口上流式传输 3x720p,并在 python 中使用带有 gstreamer 的 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)

【讨论】:

  • 感谢您的回答。但是很抱歉,到现在已经6年了。我无法验证您的回答。
  • 没关系,更适合以后遇到这里的人。
猜你喜欢
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2012-06-16
  • 2020-06-03
相关资源
最近更新 更多