import cv2 cap = cv2.VideoCapture(0) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height =int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fourcc = cv2.VideoWriter_fourcc(*"XVID") out= cv2.VideoWriter("123.avi",fourcc,20.0,(width,frame_height)) while (cap.isOpened()): ret,frame = cap.read() if ret: out.write(frame) if cv2.waitKey(1)==ord("s"): cv2.imwrite("456.jpg",frame) print("保存图片成功") cv2.imshow("frame",frame) if cv2.waitKey(1)& 0xff == ord("q"): break else: break cap.release() out.release() cv2.destroyAllWindows()
以下是对这段 Python 代码的分析:
代码功能概述
这段代码主要实现了使用 OpenCV 库从摄像头获取视频流,将视频流保存为一个.avi
格式的视频文件,同时还提供了在按下特定按键时截取当前帧保存为图片的功能。
代码详细解读
- 导入库与初始化摄像头
import cv2
cap = cv2.VideoCapture(0)
入cv2
(OpenCV 库),然后通过cv2.VideoCapture(0)
初始化摄像头,参数0
表示使用默认的摄像头设备(如果有多个摄像头,可以更改参数来选择不同的摄像头)。
2. 获取视频帧尺寸
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height =int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
利用cap.get()
函数分别获取摄像头捕获的视频帧的宽度和高度信息,并将其转换为整数类型,后续用于设置要保存的视频文件的尺寸参数。
3. 设置视频写入器
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out= cv2.VideoWriter("123.avi",fourcc,20.0,(width,frame_height))
cv2.VideoWriter_fourcc(*"XVID")
:用于指定视频编码格式,这里选择的是XVID
编码格式,它是一种常用的、能在很多平台上兼容播放的编码格式。cv2.VideoWriter()
:创建一个VideoWriter
对象,用于将视频帧写入到指定的视频文件中。参数依次为要保存的视频文件名(这里是"123.avi"
)、视频编码格式、帧率(这里设置为20.0
帧每秒)以及视频帧的尺寸(即前面获取到的宽度和高度组成的元组(width, frame_height)
)。
- 视频流处理循环
while (cap.isOpened()):
ret,frame = cap.read()
if ret:
out.write(frame)
if cv2.waitKey(1)==ord("s"):
cv2.imwrite("456.jpg",frame)
print("保存图片成功")
cv2.imshow("frame",frame)
if cv2.waitKey(1)& 0xff == ord("q"):
break
else:
break
- 外层
while
循环通过cap.isOpened()
判断摄像头是否正常打开,只要摄像头处于打开状态就持续循环处理视频帧。 - 在循环内部,
cap.read()
函数从摄像头读取一帧视频,返回两个值,ret
是一个布尔值,表示是否成功读取到帧,frame
则是读取到的视频帧图像数据(如果ret
为True
)。 - 当成功读取到帧(
ret
为True
)时:- 首先通过
out.write(frame)
将当前帧写入到之前创建的视频文件中。 - 接着通过
cv2.waitKey(1)==ord("s")
判断是否按下了键盘上的s
键,如果按下了,则使用cv2.imwrite("456.jpg", frame)
将当前帧保存为名为"456.jpg"
的图片文件,并打印提示信息 “保存图片成功”。 - 然后通过
cv2.imshow("frame", frame)
在一个名为"frame"
的窗口中显示当前视频帧,方便实时查看摄像头捕获的画面。 - 最后通过
cv2.waitKey(1)& 0xff == ord("q")
判断是否按下了键盘上的q
键,如果按下了,则跳出循环,结束视频捕获和处理过程。
- 首先通过
- 如果
ret
为False
,也就是没能成功读取到视频帧,那么直接跳出while
循环。
- 资源释放与窗口关闭
cap.release()
out.release()
cv2.destroyAllWindows()
cap.release()
:释放摄像头资源,结束对摄像头的占用。out.release()
:释放视频写入器相关资源,确保视频文件能正确保存和关闭。cv2.destroyAllWindows()
:关闭所有由cv2.imshow()
创建的显示窗口。
总体来说,这段代码实现了基本的摄像头视频捕获、视频保存以及简单的截图功能,是一个很好的 OpenCV 应用示例的基础代码框架,可以基于它进一步扩展和完善相关功能。