2016-07-21 18 views
1

Ich benutze OpenCV 2.4.9 und Python 2.7.11.Python OpenCV - VideoCapture.release() funktioniert nicht in Linux

Ich habe ein kleines Programm geschrieben, das die Kamera-Ausgabe zeigt, und wenn Sie 'q' drücken, schließt die Kamera, aber nicht die Anwendung (für die weitere Arbeit ...).

Das Problem ist, dass die Webcam nicht wirklich freigegeben ist, die LED leuchtet und wenn ich erneut versuche, es zu öffnen, heißt es, dass die Ressource beschäftigt ist, bis ich das Programm vollständig verlasse. Es funktioniert ok in Windows, obwohl ...

Hier ist der Code:

import cv2 
import sys 


cap = cv2.VideoCapture(0) 

while True: 
    ret, frame = cap.read() 
    if frame is None: 
     print "BYE" 
     break 

    cv2.imshow('frame', frame)  
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break  

cap.release() 
cv2.destroyAllWindows() 
while True: 
    cv2.waitKey(1) 

Was fehlt bin ich? Gibt es eine Möglichkeit, die Kamera freizugeben, ohne das Programm zu beenden? Vielen Dank im Voraus

+0

Entfernen Sie die letzten 2 Zeilen, weil das ist, was die Anwendung hängt (egal welche Taste gedrückt wird, bleibt es dort) –

+0

@BillalBEGUERADJ Ich weiß !! anstelle dieser Zeilen gibt es einen Code, der für mein Projekt relevant ist ... mein Punkt ist, dass die Anwendung immer auf Anwendung ist, aber die Kamera freigeben muss, ohne zu beenden – DanielY

+2

Ich kann Ihr Problem nicht reproduzieren. Ich meine, Ihr Code funktioniert perfekt auf meinem Rechner (Ubuntu 16.04 LTS, x64 Bit) –

Antwort

2

Der Weg, um die Kamera zu befreien (ohne zu beenden) ist in der Tat release(). Ich habe Ihren Code in einer Linux Mint 18 (64bit) Umgebung getestet, die sowohl OpenCV 2.4.13 als auch OpenCV 3.1 mit Python 2.7.12 ausführt. Es gab keine Probleme. Hier

ist eine Möglichkeit für Sie, um zu sehen, was in Ihrem Code los ist:

import cv2 
import sys 

#print "Before cv2.VideoCapture(0)" 
#print cap.grab() 
cap = cv2.VideoCapture(0) 

print "After cv2.VideoCapture(0): cap.grab() --> " + str(cap.grab()) + "\n" 

while True: 
    ret, frame = cap.read() 
    if frame is None: 
     print "BYE" 
     break 

    cv2.imshow('frame', frame) 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 

print "After breaking, but before cap.release(): cap.grab() --> " + str(cap.grab()) + "\n" 

cap.release() 

print "After breaking, and after cap.release(): cap.grab() --> " + str(cap.grab()) + "\n" 

cap.open(0) 
print "After reopening cap with cap.open(0): cap.grab() --> " + str(cap.grab()) + "\n" 

cv2.destroyAllWindows() 

while True: 
    cv2.waitKey(1) 

Möglicherweise möchten Sie über Neuinstallation OpenCV auf Ihrem System denken. Ich empfehle die tollen Anleitungen auf PyImageSearch ->http://www.pyimagesearch.com/opencv-tutorials-resources-guides/

Lassen Sie mich wissen, ob dies hilft!

+0

Hallo. Vielen Dank. Ich habe etwas Ähnliches gemacht, bevor ich auf diese Seite geschrieben habe. Versuchen Sie in Ihrem Code, cv2.open (0) nach release() erneut aufzurufen. obwohl es funktioniert und die Kamera wieder öffnet, wird es Ihnen sagen "Ressource ist beschäftigt" – DanielY

+0

cv2.open (0) wird geben -> AttributeError: 'Modul' Objekt hat kein Attribut 'öffnen' – Jaxian

+0

Sie müssen Verwenden Sie cap.open (0). Nach der Benutzung funktionierte es. Ich werde die Antwort aktualisieren – Jaxian