Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 视频图像处理基础操作 之 视频捕获/存储/提取/合成/合并
目录
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 视频图像处理基础操作 之 视频捕获/存储/提取/合成/合并
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
这里使用 Python 基于 OpenCV 进行视觉图像处理,......
二、视频处理流程和原理
视频处理的基本原理涉及到图像处理和计算机视觉领域的很多概念和算法。在处理视频时,常见的算法包括帧间差分、光流法、背景建模、物体检测和跟踪等。这些算法的原理涉及到像素级别的操作、特征提取、模型训练等。
通过对比相邻帧间的图像差异,可以计算出图像中的运动目标。
OpenCV 提供了一些基本的流程,下面是一个简要的概述:
三、视频的捕获和存储
视频的读取可以通过读取已经存储好的视频。可以通过打开Camera摄像头读取视频图像。OpenCV中获取摄像头视频使用VideoCapture类,其构造参数为摄像头的Index,一般的笔记本计算机只有一个摄像头,因此其Index一般为0。获取视频属性(码率\尺寸)使用VideoCapture的get()方法。
将视频帧写入文件使用VideoWriter类,其构造参数分别为写入的文件路径名、编码格式、帧率及视频尺寸,可以通过VideoCapture获取。
import cv2
def vedioCaptureWrite(saveName):
"""
视频捕捉与保存
:param saveName: 类似 output.avi
:return:
"""
# 打开摄像头
cap = cv2.VideoCapture(0)
# 定义视频编码器
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 创建 VideoWriter 对象,用于保存视频
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
# 循环读取摄像头帧
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 在视频上绘制一个简单的示例文本
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame, 'Recording...', (10, 50), font, 1, (0, 255, 255), 2, cv2.LINE_AA)
# 写入帧到输出视频
out.write(frame)
# 显示帧
cv2.imshow('frame', frame)
# 按 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
四、提取视频中的某些帧
视频可以视为连续帧图像的集合,可以对图像的帧进行计数,也可以通过视频的时间来提取视频中的某些帧。
import cv2
def videoExtraction(videoName):
"""
提取视频中的某一帧保存为图片
:param videoName: 类似 TwoPeopleRunning.mp4
:return:
"""
# 打开视频文件
cap = cv2.VideoCapture(videoName)
# 检查视频是否成功打开
if not cap.isOpened():
print("Error: Unable to open video.")
exit()
# 选择要提取的帧索引
frame_index = 100 # 例如,提取第 100 帧
# 设置视频帧索引
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index)
# 读取帧
ret, frame = cap.read()
# 检查帧是否成功读取
if not ret:
print("Error: Unable to read frame.")
exit()
# 保存帧为图像文件
cv2.imwrite('Images/videoExtraction.jpg', frame)
# 关闭视频文件
cap.release()
print(f"Frame {frame_index} extracted and saved as output_frame.jpg")
五、将图片合成为视频
将图片合成为视频意味着将一系列图片按照一定的顺序和帧率组合成视频文件。
import cv2
import os
def imagesCompositingVideo(imageFolder, frame):
"""
图片合成图片
:param imageFolder: 图片文件夹,例如 'Images'
:param frame: 每秒多少帧,例如 30帧每秒,1帧每秒
:return:
"""
# 图片所在文件夹
images_folder = imageFolder
# 读取文件夹中的所有图片文件名
image_files = [f for f in os.listdir(images_folder) if os.path.isfile(os.path.join(images_folder, f))]
# 指定输出视频文件名
output_video = 'Videos/imagesCompositingVideo.mp4'
# 定义视频编码器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# 获取第一张图片的尺寸
first_image = cv2.imread(os.path.join(images_folder, image_files[0]))
height, width, _ = first_image.shape
# 创建 VideoWriter 对象
out = cv2.VideoWriter(output_video, fourcc, frame, (width, height))
# 逐张读取图片并写入视频
for image_file in image_files:
image_path = os.path.join(images_folder, image_file)
img = cv2.imread(image_path)
out.write(img)
# 释放资源
out.release()
imagesCompositingVideo()
六、多个视频合并
多个视频合并是指将多个视频文件合并成一个视频文件的过程。在这个过程中,多个视频文件的内容会按照一定的顺序连接起来,形成一个新的视频文件。合并多个视频可以用于将不同的视频片段拼接成一个完整的视频,或者将多个视频源合并为一个视频文件。
通常,多个视频合并可以分为两种情况:
-
简单拼接:将多个视频按照顺序连接在一起,形成一个长视频。这种合并方式不对视频进行任何处理,只是将它们连接起来。
-
混流合并:将多个视频文件进行混流,即将它们的视频流和音频流合并到一个视频文件中。这种合并方式通常需要对视频进行解码、编辑和编码等操作。
在实现多个视频合并时,可以使用视频编辑软件(如Adobe Premiere、Final Cut Pro等)或编程语言中的相应库(如OpenCV、FFmpeg等)来完成。
import cv2
def mergeVideo(videoName1, videoName2):
"""
合并视频
:param videoName1: 视频名称,类似 'Videos/CatRun.mp4'
:param videoName2: 视频名称,类似 'Videos/TwoPeopleRunning.mp4'
:return:
"""
# 打开第一个视频文件
cap1 = cv2.VideoCapture(videoName1)
# 打开第二个视频文件
cap2 = cv2.VideoCapture(videoName2)
# 获取视频信息
fps = int(cap1.get(cv2.CAP_PROP_FPS))
width = int(cap1.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap1.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 定义视频编码器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# 创建 VideoWriter 对象
out = cv2.VideoWriter('Videos/mergeVideo.mp4', fourcc, fps, (width, height))
# 逐帧读取并写入第一个视频文件
while cap1.isOpened():
ret, frame = cap1.read()
if not ret:
break
out.write(frame)
# 逐帧读取并写入第二个视频文件
while cap2.isOpened():
ret, frame = cap2.read()
if not ret:
break
out.write(frame)
# 释放资源
cap1.release()
cap2.release()
out.release()