2013-03-02 300 views
1

訪問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

什麼是錯在這裏?我的代碼就像所有變體中的所有示例一樣。我錯過了什麼?

回答

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) 
+0

哎呀,我莫名其妙地錯過了你的答案昨天,現在得出了相同的結論,並得到了工作。來到這裏回答我自己的問題。並看到你的答案......大聲笑無論如何:謝謝! – arkascha 2013-03-03 10:46:17

+0

這是否與相機未正確釋放有關? – 2016-10-20 13:07:49