Доступ к веб-камере из pyside / opencv

1

У меня проблемы с доступом к веб-камере в проекте 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

Что здесь не так? Мой код похож на все эти примеры во всех их вариантах. Что мне не хватает?

Теги:
qt
pyside
webcam

1 ответ

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)
  • 0
    Ага, я как-то пропустил твой ответ вчера, сейчас пришел к такому же выводу и все заработало. Пришел сюда, чтобы ответить на мой собственный вопрос. И увидеть ваш ответ ... LOL В любом случае: спасибо!
  • 0
    Это связано с тем, что камера не срабатывает должным образом?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню