今天从B站下载了一些资源图片,从网盘下载后才发现都是几秒的视频。
作为一个程序员,这种情况不能忍。用potplayer视频播放器可以截取 。但这种批量处理还是程序自动化要快速。
一、思路
批量读取目录下的视频文件,读取第一帧并保存为同名png图片
二、准备工作
-
Python内置的函数读取目录及目录下的文件
-
通过opencv第三方库获取视频第一帧
要对Python内置的os模块有了解,能够了解读取目录的函数。查找Python第三方视频处理的库有哪些,应用方向和调用难易,选择适合你的库。
三、代码书写
先写一个主处理函数,函数代码块主要实现了目录读取。目录读取处理后要交于第三方视频库处理。这块我们通过传递一个函数参数进行预留处理 。
import os
# 获取视频目录及相应视频文件
def process(path,fn):
print("开始处理视频剪辑....")
for file in os.listdir(path):
filepath = os.path.join(path, file)
# 子目录不予考虑
if os.path.isdir(filepath):
continue
# 新文件是旧有文件去掉扩展名拼接生成
newfile = file.split('.')[0] + ".png"
newfilepath = os.path.join(path,newfile)
print(filepath,newfilepath)
# 交于视频提取的函数处理
fn(filepath,newfilepath)
完成上面处理过程中的函数实参。通过VideoCapture捕获视频。通过numpy 的tofile保存成图片。
import cv2
import sys
# 转化视频为图片
def convert_to_image(oldfile,newfile):
print("convert_to_image start ...")
cap=cv2.VideoCapture(oldfile)
# 视频占用直接返回
if cap.isOpened() == False:
return
# 读取视频中第一帧
ret,frame=cap.read()
# 保存视频到图片
cv2.imencode(".png",frame)[1].tofile(newfile)
# 资源释放
cap.release()
cv2.waitKey(0)
cv2.destroyAllWindows()
path = r"E:美女照片超可爱动态壁纸(1)"
process(path,convert_to_image)
代码运行:
效果:所有视频文件都转化完成了。
四、遇到的问题
开始使用cv2自带的imwrite函数生成图片文件,但有中文名称目录不能写入。
def convert_by_write(oldfile,newfile):
print("convert_to_image start ...")
cap=cv2.VideoCapture(oldfile)
if cap.isOpened() == False:
return
# 读取视频中第一帧
ret,frame=cap.read()
img = cv2.resize(frame, (2048, 1080))
cv2.imshow("img",img)
cv2.imwrite(newfile,img)
cap.release()
cv2.waitKey(0)
cv2.destroyAllWindows()
path = r"E:美女照片test"
process(path,convert_by_write)
这段代码中imshow是可以的。但imwrite对于一些特殊字符不太友好。
五、改进
对opencv库深入研究,对图片进行高清处理。比如可以增加灰度后进行图片融合等。
原文始发于微信公众号(程序员老朱):Python实战02:网上下载的视频进行图片截取
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论