Python OpenCV - VideoCapture.release() 在 Linux 中不起作用
Python OpenCV - VideoCapture.release() won't work in Linux
我正在使用 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)
我错过了什么?有没有办法在不退出程序的情况下释放相机?
提前致谢
释放相机(不退出)的方法确实是release()。我已经在 Linux Mint 18(64 位)环境 运行 OpenCV 2.4.13 和带有 Python 2.7.12 的 OpenCV 3.1 中测试了您的代码。没有问题。
您可以通过以下方式查看代码中发生的情况:
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 上的精彩指南 --> http://www.pyimagesearch.com/opencv-tutorials-resources-guides/
如果有帮助请告诉我!
我遇到了同样的问题。默认情况下,我的 OpenCV 构建使用 Gstreamer 作为 VideoCapture() 的后端。如果我强迫它改用 V4L2,例如
cap = VideoCapture(0,cv2.CAP_V4L2)
cap.release() 有效。
Gstreamer 后端应该能够关闭它打开的任何管道(参见此处的源代码:https://github.com/opencv/opencv/blob/master/modules/videoio/src/cap_gstreamer.cpp),但对于我的后端不可知的应用程序,避免比修复该问题更容易。
我正在使用 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)
我错过了什么?有没有办法在不退出程序的情况下释放相机? 提前致谢
释放相机(不退出)的方法确实是release()。我已经在 Linux Mint 18(64 位)环境 运行 OpenCV 2.4.13 和带有 Python 2.7.12 的 OpenCV 3.1 中测试了您的代码。没有问题。
您可以通过以下方式查看代码中发生的情况:
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 上的精彩指南 --> http://www.pyimagesearch.com/opencv-tutorials-resources-guides/
如果有帮助请告诉我!
我遇到了同样的问题。默认情况下,我的 OpenCV 构建使用 Gstreamer 作为 VideoCapture() 的后端。如果我强迫它改用 V4L2,例如
cap = VideoCapture(0,cv2.CAP_V4L2)
cap.release() 有效。
Gstreamer 后端应该能够关闭它打开的任何管道(参见此处的源代码:https://github.com/opencv/opencv/blob/master/modules/videoio/src/cap_gstreamer.cpp),但对于我的后端不可知的应用程序,避免比修复该问题更容易。