Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果
目录
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
这里使用 Python 基于 OpenCV 进行视觉图像处理,......
二、简单视频放大抖动效果实现原理
简单的视频抖动放大效果是对视频中的每一帧进行处理,使其在特定的条件下进行放大。通常情况下,这种效果会在视频的开始阶段或者特定的时间间隔内对帧进行放大处理,以达到抖动放大的效果。具体来说,这种效果通常包括以下几个步骤:
涉及的关键函数包括:
三、简单视频放大抖动效果案例实现简单步骤
1、编写代码
2、运行效果
3、具体代码
"""
简单视频抖动放大效果
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()
四、注意事项
五、其他
1、生成一个黑白棋盘图
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、图片保存视频
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()