Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果
目录
[Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果](#Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果)
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
这里使用 Python 基于 OpenCV 进行视觉图像处理,......
二、简单视频放大抖动效果实现原理
简单的视频抖动放大效果是对视频中的每一帧进行处理,使其在特定的条件下进行放大。通常情况下,这种效果会在视频的开始阶段或者特定的时间间隔内对帧进行放大处理,以达到抖动放大的效果。具体来说,这种效果通常包括以下几个步骤:
读取视频:首先,程序会读取输入的视频文件。
逐帧处理:接着,程序会对视频中的每一帧进行处理。在简单的视频抖动放大效果中,通常会根据特定的条件来判断是否对当前帧进行放大处理。
放大处理:当满足放大条件时,对当前帧进行放大处理。一种常见的放大方式是通过裁剪图像中心部分,然后将其放大至原始图像大小。
写入输出视频:最后,处理后的帧将被写入到输出视频文件中,从而形成一个具有抖动放大效果的视频。
涉及的关键函数包括:
cv2.VideoCapture():
- 这个函数用于从视频文件中读取视频流。
- 在
video_shake()
函数中使用,用于打开视频文件并创建一个 VideoCapture 对象。cap.get():
- 这个方法用于获取视频的属性,如帧率、宽度、高度等。
- 在
video_shake()
函数中使用,用于获取视频的帧率、宽度和高度。cv2.VideoWriter():
- 这个函数用于创建一个用于保存视频的 VideoWriter 对象。
- 在
video_shake()
函数中使用,用于创建一个 VideoWriter 对象,用于写入输出视频文件。cap.read():
- 这个方法用于逐帧读取视频。
- 在
video_shake()
函数中使用,用于逐帧读取视频并对每一帧进行处理。cv2.VideoWriter.write():
- 这个方法用于将帧写入到视频文件中。
- 在
video_shake()
函数中使用,用于将处理后的帧写入到输出视频文件中。
三、简单视频放大抖动效果案例实现简单步骤
1、编写代码
2、运行效果
3、具体代码
python
"""
简单视频抖动放大效果
apply_zoom() 函数:
这个函数接受一个帧图像和放大因子作为参数,然后将图像放大。
首先,计算了放大区域的左上角和右下角坐标,然后从原图中截取出放大区域,最后将截取的图像进行放大并返回。
video_shake() 函数:
这个函数接受视频文件的路径和输出视频文件的路径作为参数。
首先,打开视频文件并获取视频信息,包括帧率、宽度和高度。
然后,创建一个 VideoWriter 对象,用于写入输出视频文件。
在一个循环中,逐帧读取视频,检查帧索引是否为前 5 帧或者 10 的倍数帧,如果是,则应用放大效果。
最后,将处理后的帧写入输出视频文件,释放资源。
"""
import cv2
def apply_zoom(frame, factor):
"""
放大指定帧图
:param frame:
:param factor: 这个函数接受一个帧图像和放大因子作为参数,然后将图像放大。
:return:
"""
height, width, _ = frame.shape
h1 = int(height * 0.1)
h2 = int(height * 0.9)
w1 = int(width * 0.1)
w2 = int(width * 0.9)
zoomed_frame = frame[h1:h2, w1:w2]
return cv2.resize(zoomed_frame, (width, height))
def video_shake(video_path, output_path):
"""
视频放大抖动
:param video_path:
:param output_path:
:return:
"""
# 打开视频文件
cap = cv2.VideoCapture(video_path)
# 获取视频信息
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 定义视频编码器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# 创建 VideoWriter 对象
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
# 视频索引
frame_index = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 检查帧索引是否为 10 的倍数或前 5 帧
if frame_index < 5 or frame_index % 10 == 0:
frame = apply_zoom(frame, factor=2)
out.write(frame)
frame_index += 1
cap.release()
out.release()
cv2.destroyAllWindows()
def main():
video_path = "Videos/CatRun.mp4"
output_path = "Videos/VideoShake.mp4"
video_shake(video_path, output_path)
if __name__ == "__main__":
main()
四、注意事项
视频文件路径:
- 确保
video_path
变量中指定的视频文件路径是正确的,包括文件名和文件格式。如果视频文件不存在或路径错误,程序将无法打开视频文件。输出视频文件路径:
- 确保
output_path
变量中指定的输出视频文件路径是正确的,并且具有合适的文件名和文件格式。如果输出路径无法访问或已存在同名文件,程序将无法写入输出视频文件。视频处理参数:
- 在
apply_zoom()
函数中,可以调整放大效果的参数,例如放大区域的比例因子。可以根据实际需求调整这些参数,以获得更好的效果。帧索引判断:
- 在
video_shake()
函数中,使用了帧索引来判断是否对当前帧应用放大效果。确保你理解了条件判断的逻辑,并且根据需求调整条件判断的条件。资源释放:
- 在程序执行结束时,确保释放了视频文件对象和 VideoWriter 对象的资源,并关闭了所有的 OpenCV 窗口,以避免资源泄露和内存占用。
五、其他
1、生成一个黑白棋盘图
python
import cv2
import numpy as np
# 设置棋盘格尺寸和方格数
board_size = (7, 7)
square_size = 100 # 每个棋盘格的边长,单位为像素
# 计算棋盘格图像大小
board_width = board_size[1] * square_size
board_height = board_size[0] * square_size
# 创建棋盘格图像
chessboard_image = np.zeros((board_height, board_width, 4), dtype=np.uint8)
# 绘制棋盘格
for i in range(0, board_height, square_size):
for j in range(0, board_width, square_size):
color = 255 if (i // square_size + j // square_size) % 2 == 0 else 0
chessboard_image[i:i+square_size, j:j+square_size] = (color, color, color, 255)
# 保存为 PNG 图片
cv2.imwrite('chessboard.png', chessboard_image)
# 显示图像
cv2.imshow('Chessboard', chessboard_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、图片保存视频
python
import cv2
# 读取棋盘图片
chessboard_image = cv2.imread('Images/chessboard.png')
# 检查图片是否读取成功
if chessboard_image is None:
print("Error: Unable to read chessboard image.")
exit()
# 设置视频帧率和尺寸
fps = 30
enlarged_height, enlarged_width = chessboard_image.shape[0] * 2, chessboard_image.shape[1] * 2
# 创建 VideoWriter 对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video_writer = cv2.VideoWriter('calibration_video.mp4', fourcc, fps, (enlarged_width, enlarged_height))
# 计算帧数
frame_count = 5 * fps
# 循环生成放大颜色分离的棋盘格图像,并写入视频
for _ in range(frame_count):
# 放大棋盘图片
enlarged_chessboard = cv2.resize(chessboard_image, (enlarged_width, enlarged_height), interpolation=cv2.INTER_LINEAR)
# 颜色分离
blue_channel, green_channel, red_channel = cv2.split(enlarged_chessboard)
# 对每个通道进行错开叠加显示
merged_frame = cv2.merge((red_channel, green_channel, blue_channel))
video_writer.write(merged_frame)
# 释放资源
video_writer.release()
cv2.destroyAllWindows()