二、加载视频源
在这个 Python OpenCV 教程中,我们将介绍一些使用视频和摄像头的基本操作。 除了起始行,处理来自视频的帧与处理图像是一样的。 我们来举例说明一下:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
首先,我们导入numpy
和cv2
,没有什么特别的。 接下来,我们可以cap = cv2.VideoCapture(0)
。 这将从你计算机上的第一个网络摄像头返回视频。 如果你正在观看视频教程,你将看到我正在使用1
,因为我的第一个摄像头正在录制我,第二个摄像头用于实际的教程源。
while(True):
ret, frame = cap.read()
这段代码启动了一个无限循环(稍后将被break
语句打破),其中ret
和frame
被定义为cap.read()
。 基本上,ret
是一个代表是否有返回的布尔值,frame
是每个返回的帧。 如果没有帧,你不会得到错误,你会得到None
。
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
在这里,我们定义一个新的变量gray
,作为转换为灰度的帧。 注意这个BGR2GRAY
。 需要注意的是,OpenCV 将颜色读取为 BGR(蓝绿色红色),但大多数计算机应用程序读取为 RGB(红绿蓝)。 记住这一点。
cv2.imshow('frame',gray)
请注意,尽管是视频流,我们仍然使用imshow
。 在这里,我们展示了转换为灰色的源。 如果你想同时显示,你可以对原始帧和灰度执行imshow
,将出现两个窗口。
if cv2.waitKey(1) & 0xFF == ord('q'):
break
这个语句每帧只运行一次。 基本上,如果我们得到一个按键,那个键是q
,我们将退出while
循环,然后运行:
cap.release()
cv2.destroyAllWindows()
这将释放网络摄像头,然后关闭所有的imshow()
窗口。
在某些情况下,你可能实际上需要录制,并将录制内容保存到新文件中。 以下是在 Windows 上执行此操作的示例:
import numpy as np
import cv2
cap = cv2.VideoCapture(1)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(True):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
out.write(frame)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
这里主要要注意的是正在使用的编解码器,以及在while
循环之前定义的输出信息。 然后,在while
循环中,我们使用out.write()
来输出帧。 最后,在while
循环之外,在我们释放摄像头之后,我们也释放out
。
太好了,现在我们知道如何操作图像和视频。 如果你没有网络摄像头,你可以使用图像甚至视频来跟随教程的其余部分。 如果你希望使用视频而不是网络摄像头作为源,则可以为视频指定文件路径,而不是摄像头号码。
现在我们可以使用来源了,让我们来展示如何绘制东西。 此前你已经看到,你可以使用 Matplotlib 在图片顶部绘制,但是 Matplotlib 并不真正用于此目的,特别是不能用于视频源。 幸运的是,OpenCV 提供了一些很棒的工具,来帮助我们实时绘制和标记我们的源,这就是我们将在下一个教程中讨论的内容。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论