Невозможно выключить / включить CameraCapture с помощью Python / opencv: устройство или ресурс занят - PullRequest
3 голосов
/ 19 марта 2012

Когда я пытаюсь заново открыть openCv CameraCapture с помощью Python, я получаю:

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

Подсказки, приведенные для аналогичныхвопросы не работали для меня: не могу найти ReleaseCapture в opencv при использовании python? и / или OpenCV / Array должен быть CvMat или IplImage / Releasing объекта захвата

1 Ответ

3 голосов
/ 19 марта 2012

Проблема в том, что вы не выпускаете компонент захвата с помощью OpenCV API.

Вы не должны делать del capture.Правильный способ сделать это через:

cvReleaseCapture(capture)
...