【脚本解析笔记】将视频转为图片

依然是网上找的脚本python 实现将视频转换为图片
—根目录
|—创建文件夹video存放源视频
|—传建文件夹result 存放输出结果

"""
将视频转换为图片,可以为多个文件夹下的图片。
注:在程序使用前需先配置好main中的地址
视频路径:video_path_list = [path1, path2, ...](路径数量可以为[1,n],每个路径下的视频数也可为[1,m])
    paht1                path2             ....
     |------video1.avi      |-----video1.avi
     |------vidoe2.avi      |-----...
     |------....
图片存储路径:image_save_dir = save_path(存储方式则将按以下方式)
    save_path
     | -------path1_name
                |----video1
                        |----jpg1.jpg
                        |----jpg2,jpg
                |----video2
                ...
     |-------path2_name
     ...
"""
import cv2
import os
from pathlib import Path

VID_FORMATS = ('.mov', '.avi', '.mp4', '.mpg',  '.mpeg', '.m4v', '.wmv', '.mkv', '.mp3')


def videos2images(root_video_path, root_save_dir):
    for video_dir_path in root_video_path:
        # 1.检测读取文件路径是否正确
        path_video = Path(video_dir_path)
        if path_video.is_dir():
            print(video_dir_path + '\t ok')
            videos = os.listdir(video_dir_path)
        else:
            print('\033[31mLine36 error: \033[31m' + video_dir_path + 'is not exist!')
            return

        # 2. 生成存储文件夹
        save_name_dir = Path(path_video.name)
        save_name_dir = os.path.join(root_save_dir, save_name_dir)
        if not os.path.exists(save_name_dir):
            os.makedirs(save_name_dir)

        file_count = 0
        for video in videos:
            # 判断是否为视频文件,如果不是视频文件则跳过并进行说明
            if Path(video).suffix in VID_FORMATS:
                file_count += 1  # 视频文件数+1
                save_jpg_dir = os.path.join(save_name_dir, Path(video).stem)
                if not os.path.exists(save_jpg_dir):
                    os.makedirs(save_jpg_dir)
                each_video_path = os.path.join(path_video, video)
                save_dir = save_jpg_dir
            else:
                print('\033[33mLine56 warning: \033[33m' + os.path.basename(video) + ' is not a video file, so skip.')
                continue

            # 3. 开始转换。打印正在处理文件的序号和他的文件名,并开始转换
            print('\033[38m' + str(file_count) + ':' + Path(video).stem + '\033[38m')
            cap = cv2.VideoCapture(each_video_path)

            flag = cap.isOpened()
            if not flag:
                print("\033[31mLine 65 error\033[31m: open" + each_video_path + "error!")

            frame_count = 0  # 给每一帧标号
            while True:
                frame_count += 1
                flag, frame = cap.read()
                if not flag:  # 如果已经读取到最后一帧则退出
                    break
                if os.path.exists(
                        save_dir + str(frame_count) + '_t2.jpg'):  # 在源视频不变的情况下,如果已经创建,则跳过
                    break
                cv2.imwrite(save_dir + '\\' + str(frame_count) + '_t2.jpg', frame) #图片名字

            cap.release()
            print('\033[38m' + Path(video).stem + ' save to ' + save_dir + 'finished. \033[38m')  # 表示一个视频片段已经转换完成


if __name__ == '__main__':
    # 需要转换的视频路径列表,直达视频文件(自定义修改)
    video_path_list = [r'video']

    # 预期存储在的主文件夹,即'result'文件夹下
    image_save_dir = r'results'
    path_save = Path(image_save_dir)
    if not path_save.exists():
        path_save.mkdir()
    # 进行转换
    videos2images(video_path_list, image_save_dir)

运行结果

F:\ruanjian\10_3Anaconda3\lujing\python.exe F:/lianxi/lianxi/py/实用脚本/视频转图片/main.py
video	 ok
1:VID_20220816_151014
VID_20220816_151014 save to results\video\VID_20220816_151014finished. 

Process finished with exit code 0

主程序

视频路径和存储输出路径
原博是支持多个路径 每个路径下多个视频的
下面只用单个路径单个视频解析

video_path_list = [r'video']
image_save_dir = r'results'

判断存储路径是否存在,若不存在则创建。

    if not path_save.exists():
        path_save.mkdir()

进入自定义的转换函数

遍历“路径列表”for video_dir_path in root_video_path:

1.检测读取文件路径是否正确
 # 1.检测读取文件路径是否正确
        path_video = Path(video_dir_path)
        if path_video.is_dir():
            print(video_dir_path + '\t ok')
            videos = os.listdir(video_dir_path)
        else:
            print('\033[31mLine36 error: \033[31m' + video_dir_path + 'is not exist!')
            return

python系列13:python中Path常用功能

path_video = Path(video_dir_path)
拉出单个路径地址判断
.is_dir()判断路径是否存在
若存在路径赋值给videos
若不存在输出警告

'\033[31mLine36 error: \033[31m' + video_dir_path + 'is not exist!' 意为
(31m:前景色红色)Line36 error: 地址is not exist!

参考[print()在终端输出彩色字体](https://blog.csdn.net/weixin_69553582/article/details/125700943?ops_request_misc=&request_id=&biz_id=102&utm_term=print(%27%5C033%5B31mLine36%20error:%20%5C&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-125700943.142v41pc_rank_34_ecpm25,185v2tag_show&spm=1018.2226.3001.4187)

2.确定路径后生成存储文件夹
        # 2. 生成存储文件夹
        save_name_dir = Path(path_video.name)
        save_name_dir = os.path.join(root_save_dir, save_name_dir)
        if not os.path.exists(save_name_dir):
            os.makedirs(save_name_dir)

先提取出视频名字成路径形式save_name_dir = Path(path_video.name)
再将该路径与用于输出结果的文件夹路径联立起来save_name_dir = os.path.join(root_save_dir, save_name_dir)

save_name_dir = Path(path_video.name)
此时debug可见
save_name_dir = {WindowsPath}video
此时path_video:video

save_name_dir = os.path.join(root_save_dir, save_name_dir)
此时debug可见
root_save_dir={str}'results'
save_name_dir ={str}'results\\video'

判断如果联立起来的路径不存在(及文件夹不存在)则创建

if not os.path.exists(save_name_dir):
   os.makedirs(save_name_dir)
遍历viedos路径下的文件是否为视频
    file_count = 0
    for video in videos:
           if Path(video).suffix in VID_FORMATS:
                file_count += 1  # 视频文件数+1
                save_jpg_dir = os.path.join(save_name_dir, Path(video).stem)
                if not os.path.exists(save_jpg_dir):
                    os.makedirs(save_jpg_dir)
                each_video_path = os.path.join(path_video, video)
                save_dir = save_jpg_dir
            else:
                print('\033[33mLine56 warning: \033[33m' + os.path.basename(video) + ' is not a video file, so skip.')
                continue

用文件名的后缀去匹配是否满足VID_FORMATS = ('.mov', '.avi', '.mp4', '.mpg', '.mpeg', '.m4v', '.wmv', '.mkv', '.mp3')
满足则视频计数+1
输出图片的地址为联立起来的路径/视频的绝对路径

save_jpg_dir = os.path.join(save_name_dir, Path(video).stem)
此时debug 可见
save_jpg_dir={str}'results\\video\\VID_20220816_151014'

each_video_path = os.path.join(path_video, video)
此时debug
each_video_path={str}'video\\VID_20220816_151014.mp4'

判断路径(文件夹)是否存在,若不存在则创建
若存在 报print('\033[33mLine56 warning: \033[33m' + os.path.basename(video) + ' is not a video file, so skip.')

3.开始转换
 print('\033[38m' + str(file_count) + ':' + Path(video).stem + '\033[38m')

序号:+文件名(视频绝对路径)

cap = cv2.VideoCapture(each_video_path)

视频抽帧,视频图像化【opencv-python】视频处理(1)VideoCapture类、 cv2.VideoCapture()函数

此时debug
each_video_path={str}'video\\VID_20220816_151014.mp4'
 flag = cap.isOpened() #判断视频是否可读
            frame_count = 0  # 给每一帧标号
            while True:
                frame_count += 1
                flag, frame = cap.read()
                if not flag:  # 如果已经读取到最后一帧则退出
                    break
                if os.path.exists(
                        save_dir + str(frame_count) + '_t2.jpg'):  # 在源视频不变的情况下,如果已经创建,则跳过
                    break
                cv2.imwrite(save_dir + '\\' + str(frame_count) + '_t2.jpg', frame) #图片名字
flag, frame = cap.read()
此时debug
flag={bool}True
frame ={ndarry:(1080,1920,3)} [[[137 125 111],  [137 125 111],  [137 125 111],  ...,  [209 190 169],  [207 188 167],  [205 186 165]],, [[137 125 111],  [138 126 112],  [137 125 111],  ...,  [210 191 170],  [208 189 168],  [205 186 165]],, [[139 127 113],  [138 126 112],  [139 127 113],  ...,  [210 191 170],  [208 189 168],  [205 186 165]],, ...,, [[144 132 118],  [144 132 118],  [144 132 118],  ...,  [240 224 204],  [238 222 202],  [238 222 202]],, [[144 132 118],  [144 132 118],  [144 132 118],  ...,  [238 222 202],  [237 221 201],  [238 222 202]],, [[144 132 118],  [144 132 118],  [144 132 118],  ...,  [238 222 202],  [238 222 202],  [240 224 204]]]

在这里插入图片描述
flag为假则跳出循环即结束。
为真 继续
判断是否存在路径(os.path.exists()
save_dir + str(frame_count) + '_t2.jpg' 路径/名称_t2.jpg

 cv2.imwrite(save_dir + '\\' + str(frame_count) + '_t2.jpg', frame) 
 即写入results\\video\\VID_20220816_151014\\(序号)_t2.jpg
结束

cap.release()和cv2.destroyAllWindows()是用来停止捕获视频和关闭相应的显示窗口的。

print('\033[38m' + Path(video).stem + ' save to ' + save_dir + 'finished. \033[38m')  # 表示一个视频片段已经转换完成

笔记1:
处理图像多用cap

cap = cv2.VideoCapture(each_video_path)
flag = cap.isOpened()
flag, frame = cap.read()
cap.release()

笔记2:
判断是否存在路径(os.path.exists()

笔记3:
先列出路径
检测路径是否正确
再不停的联立路径(os.path.join()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是孑然呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值