前言
视频处理是计算机视觉中不可或缺的一部分,无论是实时视频流的分析还是本地视频文件的后处理,都是常见的应用场景。
功能实现
本示例实现了以下功能:
- 从摄像头捕获视频流,并显示视频画面。
- 读取本地视频文件,逐帧处理并叠加时间戳。
- 保存处理后的视频文件,并输出其基本信息。
完整代码
import datetime
import cv2 as cv
def get_video_info(cap):
"""获取并打印视频的基本信息"""
frame_width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv.CAP_PROP_FPS)
frame_count = int(cap.get(cv.CAP_PROP_FRAME_COUNT))
print(f"视频宽度:{frame_width}")
print(f"视频高度:{frame_height}")
print(f"帧率(FPS):{fps}")
print(f"总帧数:{frame_count}")
def camera_demo():
"""从摄像头捕获视频流并显示"""
cap = cv.VideoCapture(1) # 修改为 0 或 1 选择不同的摄像头
if not cap.isOpened():
print("无法打开摄像头")
return
get_video_info(cap)
while True:
ret, frame = cap.read()
if not ret:
print("无法读取摄像头帧")
break
cv.imshow("Camera Video", frame)
if cv.waitKey(1) == 27: # 按下 ESC 键退出
break
cap.release()
cv.destroyAllWindows()
def video_file_demo(video_path):
"""读取并播放本地视频文件"""
cap = cv.VideoCapture(video_path)
if not cap.isOpened():
print(f"无法打开视频文件:{video_path}")
return
get_video_info(cap)
# 定义视频编码器和输出文件
fourcc = cv.VideoWriter_fourcc(*'mp4v') # 使用 MPEG-4 编码器
frame_width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv.CAP_PROP_FPS)
out = cv.VideoWriter("output_with_timestamp.mp4", fourcc, fps, (frame_width, frame_height))
while True:
ret, frame = cap.read()
if not ret:
print("视频播放结束或无法读取帧")
break
# 获取当前日期和时间
current_datetime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 在帧上叠加日期和时间
cv.putText(frame, current_datetime, (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv.LINE_AA)
# 写入帧到输出视频
out.write(frame)
# 显示帧
cv.imshow("Video Playback", frame)
if cv.waitKey(30) == 27: # 按下 ESC 键退出
break
cap.release()
out.release()
cv.destroyAllWindows()
# 调用摄像头演示
# camera_demo()
# 调用视频文件演示
video_file_demo("images/balltest.mp4")
代码详解
获取视频的基本信息
def get_video_info(cap):
frame_width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv.CAP_PROP_FPS)
frame_count = int(cap.get(cv.CAP_PROP_FRAME_COUNT))
print(f"视频宽度:{frame_width}")
print(f"视频高度:{frame_height}")
print(f"帧率(FPS):{fps}")
print(f"总帧数:{frame_count}")
cv.CAP_PROP_FRAME_WIDTH
和cv.CAP_PROP_FRAME_HEIGHT
:视频帧的宽度和高度。cv.CAP_PROP_FPS
:视频帧率(每秒帧数)。cv.CAP_PROP_FRAME_COUNT
:视频总帧数。
从摄像头捕获视频流
cap = cv.VideoCapture(1) # 打开摄像头
if not cap.isOpened():
print("无法打开摄像头")
return
- 使用
cv.VideoCapture(0)
打开默认摄像头,1
表示第二个摄像头设备。
处理本地视频文件
视频编码器与保存
fourcc = cv.VideoWriter_fourcc(*'mp4v') # MPEG-4 编码器
frame_width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv.CAP_PROP_FPS)
out = cv.VideoWriter("output_with_timestamp.mp4", fourcc, fps, (frame_width, frame_height))
cv.VideoWriter
:用于保存处理后的视频。- 文件名为
"output_with_timestamp.mp4"
。 - 视频帧率和分辨率与输入视频保持一致。
- 文件名为
添加时间戳
current_datetime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cv.putText(frame, current_datetime, (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv.LINE_AA)
- 获取当前时间,并将其格式化为字符串
YYYY-MM-DD HH:MM:SS
。 - 使用
cv.putText
在视频帧的左上角叠加时间戳。
© 版权声明
转载请注明出处,并标明原文链接。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
THE END
暂无评论内容