上篇文章我们学习了图片的数据采集,今天主要了解一下视频数据采集的方法。视频是由一系列图像构成的,其中每一张图片就是一帧。视频数据采集方法通常有自动图像采集和基于处理器的图像采集两种。我们学习一下如何利用python 工具和笔记本计算机摄像头进行视频数据的实时采集。
1、基础操作方法
在Python中使用OpenCV库录制视频是一种常见的需求,尤其是在进行视频处理、机器视觉项目或教学视频录制时。OpenCV(Open Source Computer Vision Library)提供了强大的视频处理功能,包括视频录制。
1)cv2.VideoWriter()方法
cv2.VideoWriter(video_file_name,fourcc,fps,frameSize[,isColor])
video_file_name:创建写入对象,录制视频的名称
fourcc:用来指定视频的编码格式,每个编/解码器都有一个4字符标记
fps:视频的帧速率,指视频每秒多少帧
frameSize:录制视频的窗口大小(长和宽)
isColor:判断是否为彩色图像,非零为彩色帧,否在为灰度帧
2)fourcc常用编码格式
在OpenCV中,fourcc通常是一个四字符代码,用于标识不同的编解码器。例如:
- 'XVID' 通常用于MP4文件,特别是在使用x264编解码器时。
- 'DIVX' 也是一个常用的编解码器,特别是在较老的系统中。
- 'X264' 用于H.264编码,这是一种广泛使用的视频编码格式。
- 'MJPG' 用于Motion JPEG编码,通常用于.avi文件。
举例说明:
# 定义视频编解码器和创建VideoWriter对象
# 参数分别是:输出文件名,编解码器,帧率,帧大小,是否为彩色
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 或者使用'MJPG', 'X264', 'DIVX'等
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
3)cv2.VideoCapture.get()方法
cv2.VideoCapture.get() 是 OpenCV 库中用于获取视频捕获设备(例如摄像头或视频文件)的属性值的方法。这个方法非常有用,因为它允许你访问和调整摄像头的各种参数,比如帧宽、帧高、帧率等。
获取摄像头的帧宽和帧高
import cv2
# 创建一个VideoCapture对象,0通常是内置摄像头的索引
cap = cv2.VideoCapture(0)
# 获取摄像头的帧宽和帧高
frame_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print(f"Frame width: {frame_width}")
print(f"Frame height: {frame_height}")
# 释放VideoCapture对象
cap.release()
获取摄像头的帧率
import cv2
# 创建一个VideoCapture对象,0通常是内置摄像头的索引
cap = cv2.VideoCapture(0)
# 获取摄像头的帧率
fps = cap.get(cv2.CAP_PROP_FPS)
print(f"Frame rate: {fps}")
# 释放VideoCapture对象
cap.release()
2、举例说明
我们试着通过通过笔记本摄像头录一段视频:
录制视频并保存的基本步骤如下:
1)使用cv2.VideoCapture(0)来获取默认摄像头。
2)使用cv2.VideoWriter来创建视频写入对象。
3)循环读取摄像头的帧,并使用write方法写入视频文件。
4)当不再需要视频写入对象时,使用release方法释放资源。
import cv2 #导入CV2库来使用
video_dir ="D:\\dewi\\project2024\\myListPractice\\pythonProject1\\test_data\\get_videos\\"
file_name = "005.avi"
video_file_name = video_dir + file_name
cap = cv2.VideoCapture(0) #开启摄像头,0指笔记本内置摄像头
#设置视频的宽度和高度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
#创建视频写入对象
out_video = cv2.VideoWriter(video_file_name,
cv2.VideoWriter_fourcc("D","I","V","X"),
20,(frame_width,frame_height))
while True:
ret,frame = cap.read() #捕获帧信息
if ret:
out_video.write(frame)
print("写入成功")
else:
print("获取图片出错了!")
break
cap.release() #释放摄像头
out_video.release() #释放视频对象
cv2.destroyAllWindows() #关闭所有图像窗口
3、进阶练习
在上一个练习的基础上,我们录取10段视频,每秒钟30帧图片。参考代码:
import cv2 #导入CV2库来使用
import time
video_dir ="D:\\dewi\\project2024\\myListPractice\\pythonProject1\\test_data\\get_videos\\"
cap = cv2.VideoCapture(0) #开启摄像头,0指笔记本内置摄像头
#设置视频的宽度和高度,帧率
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
for seg in range(10): #获取10段视频
# 获取当前系统时间戳(秒)
current_timestamp = time.time()
# 转换为本地时间
current_time = time.localtime(current_timestamp)
# 格式化输出
formatted_time = time.strftime("%Y-%m-%d_%H%M%S", current_time)
file_name = f"video_{formatted_time}.avi" #视频名称添加当前时间的时间戳
video_file_name = video_dir + file_name
#创建视频写入对象
out_video = cv2.VideoWriter(video_file_name,
cv2.VideoWriter_fourcc(*"XVID"),
fps,(frame_width,frame_height))
for count in range(300): #每段视频为10秒,需要300帧数据,30帧/秒
ret,frame = cap.read() #捕获帧信息
if ret:
out_video.write(frame)
#print("写入成功")
else:
print("获取图片出错了!")
break
print(f"第{seg+1}段视频录制(fps:{fps})成功:",file_name)
out_video.release()
cap.release()
cv2.destroyAllWindows()
执行结果参考:
第1段视频录制成功: video_2025-03-30_181125.avi
第2段视频录制成功: video_2025-03-30_181136.avi
第3段视频录制成功: video_2025-03-30_181146.avi
……
在对应的文件夹下看到了录制的10段视频。
每天进步一点点,继续加油!