3

Pythonを使用してopencvのCameraCaptureを再度開こうとすると、次のようになります。

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

私のアプリケーションはPyQtや他のさまざまなモジュールを使用してより大きなコンテキストで実行されますが、問題を特定することができました。したがって、「r」(リロード)を押すと、キャプチャオブジェクトは削除されますが、カメラがまだアクティブであるため、カメラへの接続を再度開くことができません。

#!/usr/bin/env python

from opencv.cv import *  
from opencv.highgui import *  

import sys
import time
import gc

cvNamedWindow("w1", CV_WINDOW_AUTOSIZE)
camera_index = 1
capture = cvCreateCameraCapture(camera_index)

def repeat():
    global capture #declare as globals since we are assigning to them now
    global camera_index
    frame = cvQueryFrame(capture)
    cvShowImage("w1", frame)
    c = cvWaitKey(10)

    if c == "q":
        sys.exit(0)

    if c == "r":

        print 'reload'

        #del frame
        del capture

        # pretty useless sleeping, garbage collecting, etc.
        #gc.collect()
        #import pdb; pdb.set_trace()
        #print gc.get_objects()
        #print gc.DEBUG_UNCOLLECTABLE
        #time.sleep(2)

        capture = cvCreateCameraCapture(camera_index)

if __name__ == "__main__":
    while True:
        repeat()

同様の質問に与えられたヒントは私には機能しませんでした: Pythonを使用しているときにopencvでReleaseCaptureを見つけることができませんか?および/またはOpenCV/アレイはCvMatまたはIplImage/キャプチャオブジェクトのリリースである必要があります

4

1 に答える 1

3

問題は、OpenCVAPIを使用してキャプチャコンポーネントをリリースしていないことです。

あなたはすべきではありませんdel capture。それを行う正しい方法は次のとおりです。

cvReleaseCapture(capture)
于 2012-03-19T12:37:37.113 に答える