1

pyside/opencvプロジェクトでWebカメラにアクセスする際に問題が発生しました。

これは、私が直面している問題を引き起こす簡略化された例です。

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_()

ここに2つの問題があります。最初に:どうやら私は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プラットフォーム(MacBook Pro)上のLinux OS(openSUSE-12.2)-opencv 2.4.3 --libqt4 4.8.4 --python 2.7.3

ここで何が問題になっていますか?私のコードは、すべてのバリアントのすべての例のようです。何が恋しいですか?

4

1 に答える 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)
于 2013-03-02T19:09:17.620 に答える