PythonOpenCV立体摄像机盲镜头?
我的系统是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的元素,因为我想测试我的算法 我的尝试: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
'''
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
回答你的问题:
...
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不失真。需要检查的一些事项:
这可能是一个通用的多摄像头问题,我能够通过使用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)