我正在使用覆盆子pi来捕捉视频的前20帧。现在这更像是一个概念问题,但在浏览videoCapture的openCV文档时,他们强调了在此代码中发布捕获的重要性(如在其网站上发布的):
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
cap.release()
的重要性是什么? ommmiting这一行是否有任何内存含义?如果是这样,它们是什么?为什么?
答案 0 :(得分:3)
当您致电cap.release()
时,请:
您可以在致电cap2 = cv2.VideoCapture(0)
之前尝试制作另一个实例cap.release()
。
cap = cv2.VideoCapture(0)
#cap.release()
cap2 = cv2.VideoCapture(0)
由于您尚未释放相机设备资源,因此会引发Device or resource busy
之类的错误,导致引发OpenCV异常。
libv4l2: error setting pixformat: Device or resource busy
VIDEOIO ERROR: libv4l unable to ioctl S_FMT
libv4l2: error setting pixformat: Device or resource busy
libv4l1: error setting pixformat: Device or resource busy
VIDEOIO ERROR: libv4l unable to ioctl VIDIOCSPICT
libv4l2: error setting pixformat: Device or resource busy
OpenCV Error: Unspecified error (GStreamer: unable to start pipeline
) in cvCaptureFromCAM_GStreamer, file /home/xxx/Programs/OpenCV/src/opencv-master/modules/videoio/src/cap_gstreamer.cpp, line 887
VIDEOIO(cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, reinterpret_cast<char *>(index))): raised OpenCV exception:
/home/xxx/Programs/OpenCV/src/opencv-master/modules/videoio/src/cap_gstreamer.cpp:887: error: (-2) GStreamer: unable to start pipeline
in function cvCaptureFromCAM_GStreamer
答案 1 :(得分:1)
我不清楚,但根据这个offical documentation,它既关闭了IO设备,又释放了一个指针。因此可以假设它释放了一些内存(无论多少)。更重要的是,我认为它会释放对其他进程的设备/文件的访问权。
关闭视频文件或捕获设备。
后续VideoCapture :: open会自动调用这些方法 并通过VideoCapture析构函数。
C函数还释放内存并清除*捕获指针。
答案 2 :(得分:0)
正如上面的Kinght,它释放了硬件和软件资源。
但是,在新版本的openCV中,它会在退出帧循环后自动执行。
根据使用 Python 的 openCV 的文档字符串,他们是这样说的:
<块引用>release() -> 关闭视频文件或捕获设备。该方法由随后的 VideoCapture::open 和 VideoCapture 析构函数自动调用。 C 函数还释放内存并清除*捕获指针。
因此,我尝试在不释放的情况下按顺序分配资源两次,效果很好。如以下代码:
import cv2 as cv
cap = cv.VideoCapture('Resources/test1.mp4')
cap2 = cv.VideoCapture('Resources/test2.mp4')
while True:
isSuccess1, img1 = cap.read()
isSuccess2, img2 = cap2.read()
print('isSuccess1', isSuccess1)
print('isSuccess2', isSuccess2)
cv.imshow('Video1', img1)
cv.imshow('Video2', img2)
if cv.waitKey(1) & 0XFF == ord('q'):
break
并且视频打开良好,我的终端中的输出也是:
isSuccess True
答案 3 :(得分:0)
根据我的经验,如果您在笔记本电脑或其他带有 Raspberry Pi 的机器人项目或其他机器人项目上使用实时摄像头会更有用,在这种情况下,您确实需要释放视频捕获对象,(以及视频写入) 避免任何材料冲突。
当您有时需要关闭一个软件(来自任务管理器)才能使用另一个软件时,您会发现这是日常生活中使用笔记本电脑的问题。