从pyside/opencv访问摄像头
问题描述:
访问pyside/opencv项目中的摄像头时遇到问题。从pyside/opencv访问摄像头
这是一个精简的例子,产生我所面临的问题:
from PySide import QtCore, QtGui
import cv, cv2, time, ImageQt
app = QtGui.QApplication([])
while True:
camcapture = cv.CaptureFromCAM(0)
cv.SetCaptureProperty(camcapture,cv.CV_CAP_PROP_FRAME_WIDTH, 1280)
cv.SetCaptureProperty(camcapture,cv.CV_CAP_PROP_FRAME_HEIGHT, 720);
frame = cv.QueryFrame(camcapture)
image = QtGui.QImage(frame.tostring(), frame.width, frame.height, QtGui.QImage.Format_RGB888).rgbSwapped()
pixmap = QtGui.QPixmap.fromImage(image)
app.exec_()
我看到这里有两个问题。第一:aparently我用用v412访问,否则工作从蟒蛇精摄像头看到的问题(使用其他应用程序):
python ./test.py
VIDIOC_QUERYMENU: Invalid argument
[... and countless more entries which don#t worry me ...]
VIDIOC_QUERYMENU: Invalid argument
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
然后有一个关机的问题,目前还不清楚,但不是我的主要问题现在:
*** glibc detected *** python: double free or corruption (fasttop): 0x00000000029368f0 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x78b66)[0x7f3539f06b66]
/usr/lib64/tls/libnvidia-tls.so.304.64(+0x1cc1)[0x7f352e448cc1]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:02 3937950 /usr/bin/python2.7
00600000-00601000 r--p 00000000 08:02 3937950 /usr/bin/python2.7
00601000-00602000 rw-p 00001000 08:02 3937950 /usr/bin/python2.7
01631000-03cd3000 rw-p 00000000 00:00 0 [heap]
7f351b6dc000-7f351b6dd000 rw-p 00000000 00:00 0
7f351b6dd000-7f351b773000 rw-s 001c2000 00:05 5759 /dev/video0
7f351b773000-7f351b809000 rw-s 0012c000 00:05 5759 /dev/video0
[... and so on ... and so on ... ]
我的问题是? 我从输出中无法理解。我尝试了许多代码变体,但通常遇到同样的问题。所以我想这不是一个具体的代码细节,但一些普遍的问题与我的设置或我的方法。 这是环境: - Linux操作系统(openSUSE的-12.2)的X86-64平台(的MacBook Pro) - OpenCV的2.4.3 - libqt4 4.8.4 - 蟒蛇2.7.3
什么是错在这里?我的代码就像所有变体中的所有示例一样。我错过了什么?
答
首先,在while循环中不应该有cv.CaptureFromCAM(0)
,因为这是导致“资源繁忙”冲突和内存转储的原因。
您可能需要放慢while循环。您可以实施cv2.waitKey()
或使用time.sleep()
。
之后,您将需要完成您的Qt实施。 (这似乎是一个单独的问题。)
这里就是你们的榜样的裸露的骨头重新写:
import cv, cv2, time, sys
camcapture = cv.CaptureFromCAM(0)
cv.SetCaptureProperty(camcapture,cv.CV_CAP_PROP_FRAME_WIDTH, 1280)
cv.SetCaptureProperty(camcapture,cv.CV_CAP_PROP_FRAME_HEIGHT, 720)
while True:
frame = cv.QueryFrame(camcapture)
... GUI stuff ...
time.sleep(.05)
使用CV2代替:
camcapture = cv2.VideoCapture(0)
while True:
_, frame = camcapture.read()
... GUI stuff ...
time.sleep(.05)
哎呀,我莫名其妙地错过了你的答案昨天,现在得出了相同的结论,并得到了工作。来到这里回答我自己的问题。并看到你的答案......大声笑无论如何:谢谢! – arkascha 2013-03-03 10:46:17
这是否与相机未正确释放有关? – 2016-10-20 13:07:49