OpenCV Python - 从相机捕获视频


通过使用OpenCV 库中的VideoCapture()函数,可以非常轻松地在 OpenCV 窗口上从摄像机捕获实时流。

该函数需要一个设备索引作为参数。您的计算机可能连接了多个摄像头。对于内置网络摄像头,它们通过从 0 开始的索引进行枚举。该函数返回一个VideoCapture对象

cam = cv.VideoCapture(0)

打开相机后,我们可以借助read()函数从中读取连续的帧

ret,frame = cam.read()

read() 函数读取下一个可用帧和返回值(True/False)。现在使用cvtColor()函数在所需的颜色空间中渲染该帧并显示在 OpenCV 窗口上。

img = cv.cvtColor(frame, cv.COLOR_BGR2RGB)
# Display the resulting frame
cv.imshow('frame', img)

要将当前帧捕获到图像文件,可以使用imwrite()函数。

cv2.imwrite(“capture.png”, img)

为了将来自摄像机的实时流保存到视频文件,OpenCV 提供了 VideoWriter() 函数。

cv.VideoWriter( filename, fourcc, fps, frameSize)

fourcc 参数是视频编解码器的标准化代码。OpenCV 支持各种编解码器,例如 DIVX、XVID、MJPG、X264 等。 fps 和帧大小参数取决于视频捕获设备。

VideoWriter() 函数返回一个 VideoWrite 流对象,在循环中将抓取的帧连续写入该对象。最后,释放frame和VideoWriter对象,完成视频的创建。

例子

以下示例从内置网络摄像头读取实时源并将其保存到 ouput.avi 文件。

import cv2 as cv
cam = cv.VideoCapture(0)
cc = cv.VideoWriter_fourcc(*'XVID')
file = cv.VideoWriter('output.avi', cc, 15.0, (640, 480))
if not cam.isOpened():
   print("error opening camera")
   exit()
while True:
   # Capture frame-by-frame
   ret, frame = cam.read()
   # if frame is read correctly ret is True
   if not ret:
      print("error in retrieving frame")
      break
   img = cv.cvtColor(frame, cv.COLOR_BGR2RGB)
   cv.imshow('frame', img)
   file.write(img)

   
   if cv.waitKey(1) == ord('q'):
      break

cam.release()
file.release()
cv.destroyAllWindows()