程序功能
- 从控制台读入 取待处理的视频(.mp4) 位置
- 从控制台读入 ffmpeg.exe 位置
- 程序将会在视频同目录下生成
imgs_cutting_by_opencv
目录,存放切帧及图像处理后的图片 - 随后通过
subprocess
库执行命令,将处理后的图片重新合成新视频(fps=24),新视频会在原视频同目录下生成
import cv2
import os
import shutil
import subprocess
def preprocess(raw_video_path,ffmpeg_path):
'''
对文件路径进行预处理
'''
raw_video_path=raw_video_path.replace('\\','/') # 替换 \
ffmpeg_path=ffmpeg_path.replace('\\','/')
t_path=raw_video_path.split('/')[:-1] # 获取视频所在目录列表
video_name=raw_video_path.split('/')[-1] # 获取视频文件名
video_path='/'.join(t_path)+"/" # 生成视频所在文件目录
image_save=video_path+"imgs_cutting_by_opencv/" # 切割后图片所在的目录
if not os.path.exists(image_save):
os.mkdir(image_save) # 不存在就新建该目录
else: # 存在就清空该目录重建
shutil.rmtree(image_save)
os.mkdir(image_save)
print("图片文件目录已生成")
return video_path, video_name, image_save, ffmpeg_path
def gaussianblur_and_Canny(video_path,video_name,image_save,ffmpeg_path):
'''
对视频切帧后进行高斯模糊+边缘检测
使用ffmpeg将处理后的图片合成新视频
'''
cap=cv2.VideoCapture(video_path+video_name)
video_frame_count=cap.get(cv2.CAP_PROP_FRAME_COUNT)
# 图片处理并保存图片
for i in range(int(video_frame_count)):
_,img = cap.read()
img = cv2.GaussianBlur(img, (3, 3), 0)
# 阈值参数可以进行调整
img_canny = cv2.Canny(img, 30, 100)
cv2.imwrite(image_save+'image{}.jpg'.format(i), img_canny)
# 切换工作路径到原视频目录
os.chdir(video_path)
# 利用ffmpeg命令合并图片,fps设置为24
cmd=ffmpeg_path+" -i ./imgs_cutting_by_opencv/image%d.jpg -r 24 -pix_fmt yuv420p output.mp4"
p = subprocess.Popen(cmd, shell=True, stdout=None, stderr=None)
stdout, stderror = p.communicate()
if stdout == None and stderror == None: print("视频已生成:"+video_path+"output.mp4")
else: print(stderror)
if __name__=="__main__":
raw_video_path = input( "输入视频位置(如C:\\Users\\Desktop\\xx.mp4):" )
ffmpeg_path = input( "输入 ffmpeg.exe 文件位置(如C:\\Users\\Desktop\\bin\\ffmpeg.exe):" )
video_path, video_name, image_save, ffmpeg_path = preprocess(raw_video_path,ffmpeg_path)
gaussianblur_and_Canny(video_path, video_name, image_save, ffmpeg_path)
使用说明
需要输入 MP4文件 和 ffmpeg.exe 的路径,然后不出意外就能得到处理后的视频了
效果预览
原视频
处理后的视频