OpenCV 读取视频
本教程将讨论在 Python 中使用 OpenCV 的 VideoCapture()
函数读取视频。
在 Python 中使用 OpenCV 的 VideoCapture()
函数读取视频
一个视频文件包含多个帧,我们可以使用 OpenCV 读取和显示这些帧。我们可以使用 OpenCV 的 VideoCapture()
函数来读取视频文件。
我们可以使用 cap.isOpened()
函数来检查捕获是否已初始化。如果捕获未初始化,此函数将返回 false,我们可以使用 cap.open()
函数来初始化捕获。
我们可以使用 cap.read()
函数读取视频中存在的帧,然后我们可以处理它们,然后使用 OpenCV 的 imshow()
函数显示它们。在这个例子中,我们将使用 OpenCV 的 cvtColor()
函数将每一帧转换为灰度。
cap.read()
函数还返回一个标志,如果帧已被接收并准备好处理,则该标志将为真,我们可以使用此标志来检查视频文件的结尾并相应地打印一些内容。这个标志也可以在我们等待帧到达的实时流视频中使用。
在这个例子中,我们将使用标志来检查视频的结束,如果达到,我们将打印一条消息并中断循环。OpenCV 的 waitKey()
函数可以在代码中添加以毫秒为单位的延迟,我们将使用它来减慢视频的播放速度。
在接收并处理完所有帧之后,我们可以使用 cap.release()
函数来释放捕获。OpenCV 的 destroyAllWindows()
函数可以销毁所有打开的窗口。
例如,让我们使用一个视频,读取它的帧,并将它们转换为灰度。
请参阅下面的代码。
import numpy as np
import cv2
cap = cv2.VideoCapture("bon_fire_dog_2.mp4")
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow("frame", gray)
cv2.waitKey(10)
if cv2.waitKey(1) == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
输出:
我们还定义了一个键,如果使用 waitKey()
函数按下该键将中断循环。它很有用,因为我们无法手动终止视频。
我们可以使用 cap.set()
函数来设置许多视频捕获属性。set()
函数的第一个参数是我们要更改的属性,第二个参数是属性的值。
例如,要设置视频中帧的宽度和高度,我们可以使用 cv2.CAP_PROP_FRAME_WIDTH
和 cv2.CAP_PROP_FRAME_HEIGHT
属性。我们还可以设置帧速率、亮度、对比度和其他视频属性。
检查此链接以获取有关视频捕获属性的更多详细信息。我们可以在 cap.get()
函数中使用相同的属性来获取它们的当前值。
例如,我们可以使用 cv2.CAP_PROP_FRAME_WIDTH
和 cv2.CAP_PROP_FRAME_HEIGHT
属性来获取帧的当前宽度和高度。