Python OpenCV-VideoCapture.release()赢得';我不能在Linux下工作

Python OpenCV-VideoCapture.release()赢得';我不能在Linux下工作,python,linux,opencv,video-capture,Python,Linux,Opencv,Video Capture,我正在使用OpenCV 2.4.9和Python 2.7.11 我已经编写了一个小程序,显示相机输出,当按下“q”键时,关闭相机但不退出应用程序(为了进一步工作…) 问题是网络摄像头没有真正释放,LED灯一直亮着,当我再次尝试打开它时,它表示资源正忙,直到我完全退出程序。 不过,它在Windows中运行正常 代码如下: import cv2 import sys cap = cv2.VideoCapture(0) while True: ret, frame = cap.read(

我正在使用OpenCV 2.4.9和Python 2.7.11

我已经编写了一个小程序,显示相机输出,当按下“q”键时,关闭相机但不退出应用程序(为了进一步工作…)

问题是网络摄像头没有真正释放,LED灯一直亮着,当我再次尝试打开它时,它表示资源正忙,直到我完全退出程序。 不过,它在Windows中运行正常

代码如下:

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)
我错过了什么?有没有办法在不退出程序的情况下释放相机?
提前感谢

释放相机(不退出)的方法确实是释放()。我已经在LinuxMint18(64位)环境中测试了您的代码,该环境既运行OpenCV 2.4.13,也运行OpenCV 3.1和Python2.7.12。没有问题

下面是一种查看代码中发生了什么的方法:

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)
您可能需要考虑在系统上重新安装OpenCV。我建议查看PyImageSearch上的精彩指南-->


让我知道这是否有帮助

释放相机(不退出)的方法确实是释放()。我已经在LinuxMint18(64位)环境中测试了您的代码,该环境既运行OpenCV 2.4.13,也运行OpenCV 3.1和Python2.7.12。没有问题

下面是一种查看代码中发生了什么的方法:

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)
您可能需要考虑在系统上重新安装OpenCV。我建议查看PyImageSearch上的精彩指南-->


让我知道这是否有帮助

我也有同样的问题。默认情况下,我的OpenCV构建使用Gstreamer作为VideoCapture()的后端。如果我强迫它改用V4L2,例如

cap = VideoCapture(0,cv2.CAP_V4L2)
释放()成功了


Gstreamer后端应该能够关闭它打开的任何管道(请参阅此处的源代码:),但对于我的后端不可知应用程序,避免这个问题比修复这个问题更容易。

我也遇到了同样的问题。默认情况下,我的OpenCV构建使用Gstreamer作为VideoCapture()的后端。如果我强迫它改用V4L2,例如

cap = VideoCapture(0,cv2.CAP_V4L2)
释放()成功了


Gstreamer后端应该能够关闭它打开的任何管道(请参阅此处的源代码:),但对于我的后端不可知应用程序来说,避免该问题比修复该问题更容易。

删除最后两行,因为这是使应用程序挂起的原因(无论按什么键,它都会留在那里)@BillalBEGUERADJ我知道!!除了这些行,还有一些与我的项目相关的代码……我的观点是,应用程序始终处于应用程序状态,但必须在不退出的情况下释放相机。我无法重现您的问题。我的意思是,你的代码在我的机器上运行得非常好(Ubuntu 16.04 LTS,x64位)去掉最后两行,因为这就是应用程序挂起的原因(无论你按什么键,它都会留在那里)@billabegueradj我知道!!除了这些行,还有一些与我的项目相关的代码……我的观点是,应用程序始终处于应用程序状态,但必须在不退出的情况下释放相机。我无法重现您的问题。我的意思是你的代码在我的机器上运行得非常好(Ubuntu 16.04 LTS,x64位)。谢谢在我写这篇文章之前,我做过类似的事情。请在代码中尝试在release()后再次调用cv2.open(0)。虽然它应该可以工作并重新打开相机,但它会告诉您“资源正忙”cv2。open(0)将提供-->AttributeError:“module”对象没有属性“open”,您必须使用cap.open(0)。使用后,它的工作。我将更新答案我将尝试重新构建opencvI将接受您的答案,即使问题没有解决,因为它可能与opencv buildHi有关。谢谢在我写这篇文章之前,我做过类似的事情。请在代码中尝试在release()后再次调用cv2.open(0)。虽然它应该可以工作并重新打开相机,但它会告诉您“资源正忙”cv2。open(0)将提供-->AttributeError:“module”对象没有属性“open”,您必须使用cap.open(0)。使用后,它的工作。我将更新答案我将尝试重新构建opencvI将接受您的答案,即使问题没有解决,因为它可能与opencv构建有关非常感谢Anna。。。我已经被这件事困扰了一段时间了!非常感谢安娜。。。我已经被这件事困扰了一段时间了!