1.给一段视频,抽取出视频的每一帧
import cv2
import os
# 指定视频文件
video_path = '510.mp4'
# 创建一个VideoCapture对象
cap = cv2.VideoCapture(video_path)
# 检查是否成功打开视频
if not cap.isOpened():
print("Error opening video file")
exit()
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 获取视频总帧数
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频帧宽度
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频帧高度
# 创建输出目录,如果不存在
output_dir = 'frames'
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 循环遍历视频的每一帧
for i in range(frame_count):
ret, frame = cap.read() # 读取一帧
# 检查帧是否成功读取
if not ret:
print("Frame could not be read")
break
# 构建输出文件名
output_file = f"{output_dir}/frame_{i:05d}.jpg"
# 保存帧为图片
cv2.imwrite(output_file, frame)
# 打印进度信息
print(f"Frame {i+1} of {frame_count} saved.")
# 释放VideoCapture对象
cap.release()
print("Video processing completed.")
2.根据帧间关系模糊的合成(相邻两帧取平均)
import cv2
import os
# 指定视频文件
video_path = '510.mp4'
# 创建一个VideoCapture对象
cap = cv2.VideoCapture(video_path)
# 检查是否成功打开视频
if not cap.isOpened():
print("Error opening video file")
exit()
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 获取视频总帧数
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频帧宽度
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频帧高度
# 创建输出目录,如果不存在
output_dir = 'frames'
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 初始化第一帧
prev_frame = None
# 循环遍历视频的每一帧
for i in range(frame_count):
ret, frame = cap.read() # 读取一帧
# 检查帧是否成功读取
if not ret:
print("Frame could not be read")
break
# 对于第一帧,直接保存
if prev_frame is None:
prev_frame = frame
output_file = f"{output_dir}/frame_{i:05d}.jpg"
cv2.imwrite(output_file, frame)
continue
# 计算平均帧
avg_frame = (prev_frame + frame) / 2
# 保存平均帧为图片
output_file = f"{output_dir}/frame_{i:05d}.jpg"
cv2.imwrite(output_file, avg_frame)
# 更新前一帧
prev_frame = frame
# 打印进度信息
print(f"Frame {i+1} of {frame_count} saved.")
# 释放VideoCapture对象
cap.release()
print("Video processing completed.")
3.运动模糊和高斯模糊的生成,根据模糊核改变模糊的程度
# coding=utf-8
import numpy as np
import cv2
def motion_blur(image, degree=20, angle=45):
image = np.array(image)
#这里生成任意角度的运动模糊kernel的矩阵, degree越大,模糊程度越高
M = cv2.getRotationMatrix2D((degree / 2, degree / 2), angle, 1)
motion_blur_kernel = np.diag(np.ones(degree))
motion_blur_kernel = cv2.warpAffine(motion_blur_kernel, M, (degree, degree))
motion_blur_kernel = motion_blur_kernel / degree
blurred = cv2.filter2D(image, -1, motion_blur_kernel)
#convert to uint8
cv2.normalize(blurred, blurred, 0, 255, cv2.NORM_MINMAX)
blurred = np.array(blurred, dtype=np.uint8)
return blurred
img = cv2.imread('./1.jpg')
#运动模糊
img_motion = motion_blur(img)
#高斯模糊
img_gauss = cv2.GaussianBlur(img, ksize=(9, 9), sigmaX=0, sigmaY=0)
cv2.imwrite("motion_blur" + ".jpg",img_motion )
cv2.imwrite("GaussianBlur" + ".jpg",img_gauss )