У меня проблемы с доступом к веб-камере в проекте 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_()
Здесь я вижу две проблемы. Во-первых: я вижу проблему с использованием v4l2 для доступа к веб-камере, которая в противном случае отлично работает с python (используя другие приложения):
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 - python 2.7.3
Что здесь не так? Мой код похож на все эти примеры во всех их вариантах. Что мне не хватает?
Для начала вам не нужно иметь cv.CaptureFromCAM(0)
внутри цикла while, так как это вызывает конфликты "занятые ресурсами" и дамп памяти.
Вам, вероятно, придется замедлить цикл 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)