cv2.videoCapture.release()的含义是什么?

时间:2018-01-11 18:16:28

标签: python opencv raspberry-pi

我正在使用覆盆子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这一行是否有任何内存含义?如果是这样,它们是什么?为什么?

4 个答案:

答案 0 :(得分:3)

当您致电cap.release()时,请:

  1. 发布软件资源
  2. 发布硬件资源
  3. 您可以在致电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 的机器人项目或其他机器人项目上使用实时摄像头会更有用,在这种情况下,您确实需要释放视频捕获对象,(以及视频写入) 避免任何材料冲突。

当您有时需要关闭一个软件(来自任务管理器)才能使用另一个软件时,您会发现这是日常生活中使用笔记本电脑的问题。