《数字图像处理-OpenCV/Python》连载(8)调用摄像头拍照和录制视频
本书京东优惠购书链接:https://item.jd.com/14098452.html
本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html
第1章 图像的基本操作
为了方便初学者从零开始学习OpenCV-Python,本书从图像的读取、保存和显示等基本操作开始介绍,使读者可以循序渐进地使用和理解本书的每一个例程。
1.4 视频文件的读取与保存
视频文件是由一系列图像组成的,视频的每一帧都是一幅图像。
OpenCV中的VideoCapture类和VideoWriter类处理视频流,既可以处理视频文件,也可以处理摄像头设备。
VideoCapture类用于读取视频文件、视频流或从摄像头捕获视频;VideoWriter类用于视频文件的写入和保存。在Python语言中,可通过函数cv.VideoCapture和cv.VideoWrite实现类的初始化。
函数原型
cv.VideoCapture( index[, apiPreference] ) → <VideoCapture object>
cv.VideoCapture(filename[, apiPreference]) → <VideoCapture object>
cv.VideoWriter([filename, fourcc, fps, frameSize[, isColor]]) → <VideoWriter object>
参数说明
- index:摄像头的ID编号,index=0表示默认后端打开了摄像头。
- filename:读取或保存视频文件的路径,包括文件扩展名。
- apiPreference:读取视频流的属性设置。
- fourcc:用于压缩帧的编码器/解码器的字符代码。
- CV_FOURCC(‘I’,‘4’,‘2’,‘0’):未压缩的YUV编码格式,扩展名为.avi。
- CV_FOURCC(‘P’,‘I’,‘M’,‘1’):MPEG-1编码格式,扩展名为.avi。
- CV_FOURCC( ‘X’,‘V’,‘I’,‘D’):MPEG-4编码格式,扩展名为.avi。
- CV_FOURCC( ‘F’,‘L’,‘V’,‘I’):Flash编码格式,扩展名为.flv。
- fps:表示视频流的帧速率。
- frameSize:元组 (w,h),表示视频帧的宽度和高度。
- isColor:布尔类型,表示是否为彩色图像。
成员函数
- cv.VideoCapture.isOpened():检查视频捕获是否初始化成功。
- cv.VideoCapture.read():读取视频文件、视频流或捕获的视频设备。
- cv.VideoCapture.release():关闭视频文件或设备,释放对象。
- cv.VideoCapture.get(propId) :获取VideoCapture类对象的属性。
- cv.VideoCapture.set(propId, value):设置VideoCapture类对象的属性。
- cv.VideoWriter.fourcc(c1, c2, c3, c4[, ]):构造编码器/解码器的fourcc代码。
- cv.VideoWriter.write(image[, ]):写入下一帧视频。
- cv.VideoWriter.release():关闭视频写入,释放对象。
注意问题
(1) 在读取视频文件或视频流时,可通过filename指定视频文件或视频流的路径。在使用摄像头时,可通过index定义摄像头的ID编号。
(2) 使用摄像头设备时,index=0表示默认从后端打开摄像头,如笔记本内置摄像头,支持计算机内置或外接的摄像头,也支持本地网络或公共网络的IP摄像头。
(3) 视频写入类VideoWriter的参数frameSize是元组(w,h),即视频帧的宽度和高度,而OpenCV图像的形状表示为(h,w),注意二者的顺序相反。
(4) 视频处理过程较为复杂,一些程序设置与具体系统环境有关,本节只介绍基本的成员函数和通用的处理方法。更多内容详见OpenCV说明文档(链接1-1)。
(5) 视频处理过程中的很多问题都会涉及计算机和摄像机的硬件设备及设置,需要结合具体系统和环境来分析。建议读者参考【例程0106】和【例程0107】,先确认视频读取和设备捕获环境的配置是否正确,再调试和运行其他的视频处理程序。
【例程0107】调用摄像头拍照和录制视频
本例程用于调用笔记本内置摄像头抓拍图片和录制视频。注意:由于用户计算机和摄像头的配置与接口不同,可能需要修改API设置。
# 【0107】调用摄像头拍照和录制视频
import cv2 as cv
if __name__ == '__main__':
# 创建视频捕获对象,调用笔记本内置摄像头
# cam = cv.VideoCapture(0) # 创建捕获对象,0 为笔记本内置摄像头
cam = cv.VideoCapture(0, cv.CAP_DSHOW) # 修改 API 设置为视频输入 DirectShow
# 设置写入视频图像的高、宽、帧速率和总帧数
fps = 20 # 设置帧速率
width = int(cam.get(cv.CAP_PROP_FRAME_WIDTH)) # 640
height = int(cam.get(cv.CAP_PROP_FRAME_HEIGHT)) # 480
fourcc = cv.VideoWriter_fourcc(*'XVID') # 编码器设置为 XVID
# 创建写入视频对象
vedioPath = "../images/camera.avi" # 写入视频文件的路径
capWrite = cv.VideoWriter(vedioPath, fourcc, fps, (width, height))
print(fourcc, fps, (width, height))
sn = 0 # 抓拍图像编号
while cam.isOpened(): # 检查视频捕获是否成功
success, frame = cam.read() # 读取下一帧视频图像
if success is True:
cv.imshow('vedio', frame) # 播放视频图像
capWrite.write(frame) # 将当前帧写入视频文件
key = cv.waitKey(1) & 0xFF # 接收键盘输入
if key == ord('c'): # 按 'c' 键抓拍当前帧
filePath = "../images/photo{:d}.png".format(sn) # 保存文件名
cv.imwrite(filePath, frame) # 将当前帧保存为图片
sn += 1 # 更新写入图像的编号
print(filePath)
elif key == ord('q'): # 按 'q' 键结束录制视频
break
else:
print("Can't receive frame.")
break
cam.release() # 关闭视频捕获对象
capWrite.release() # 关闭视频写入对象
cv.destroyAllWindows() # 关闭显示窗口
本书京东优惠购书链接:https://item.jd.com/14098452.html
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/133243948)
Copyright 2023 youcans, XUPT
Crated:2023-09-22
欢迎关注本书CSDN独家连载专栏
《数字图像处理-OpenCV/Python》连载: https://blog.csdn.net/youcans/category_12418787.html
文章评论