簡體   English   中英

從pyside / opencv訪問網絡攝像頭

[英]Accessing a webcam from 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_()

我在這看到兩個問題。 第一:顯然我看到使用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 ... ]

我的問題? 我沒有從輸出中理解。 我嘗試了很多代碼變體,但通常會遇到同樣的問題。 所以我想這不是具體的代碼細節,而是我的設置或方法的一些常見問題。 這就是環境: - x86-64平台上的Linux OS(openSUSE-12.2)(MacBook Pro) - opencv 2.4.3 - libqt4 4.8.4 - python 2.7.3

這有什么不對? 我的代碼就像所有變體中的所有示例一樣。 我錯過了什么?

首先,你不應該在while循環中使用cv.CaptureFromCAM(0) ,因為這是導致“資源忙”沖突和內存轉儲的原因。

您可能需要減慢while循環速度。 您可以實現cv2.waitKey()或使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM