python多进程海量视频提取帧图片
发布日期:2021-06-29 18:19:15 浏览次数:2 分类:技术文章

本文共 2831 字,大约阅读时间需要 9 分钟。

视频提取帧图片

  1. 多个视频同时处理
  2. 跳帧保存图片
  3. 限制进程数防止系统崩溃
  4. 一键设置视频目录自动获取全部视频并提取帧图片。
  5. CPU打满,系统不卡顿。

源码

#!/usr/bin/env python# -*- coding:utf-8 -*-# Author:CXKimport cv2,os,timefrom multiprocessing import Processfrom multiprocessing import Pool def GetNameByEveryDir(file_dir,videoProperty):      """[summary]    Args:        file_dir ([type]): [文件路径]        videoProperty ([type]): [文件类型]    Returns:        [type]: [文件名列表,文件路径列表,文件夹列表]    """    FileNameWithPath = []     FileName         = []    FileDir          = []    for root, dirs, files in os.walk(file_dir):          for file in files:              if os.path.splitext(file)[1] in videoProperty:                  FileNameWithPath.append(os.path.join(root, file))  # 保存图片路径                FileName.append(file)                              # 保存图片名称                FileDir.append(root[len(file_dir):])               # 保存图片所在文件夹    return FileName,FileNameWithPath,FileDirdef video_to_omg(file_name,file_name_with_path,img_save_dir,count):    """[summary]    Args:        file_name ([type]): 视频文件名        file_name_with_path ([type]): 视频文件路径        img_save_dir ([type]): 图片保存路径        count ([int]): 1秒几张图片    """    print('Child process %s (%s)Running...' %(file_name,os.getpid()))    videoLeftUp = cv2.VideoCapture(file_name_with_path)    fps = videoLeftUp.get(cv2.CAP_PROP_FPS)    count=int(fps/count) #帧率,用于跳帧处理    count_img=0    while (videoLeftUp.isOpened()):        retLeftUp, frameLeftUp = videoLeftUp.read()        if retLeftUp:            count_img+=1            if count_img%count==0:                # cv2.imshow(FileNameWithPath[j], frameLeftUp)                img_name=img_save_dir+os.sep+file_name[:-4]+"_"+str(count_img)+".jpg"                # print(img_name)                cv2.imwrite(img_name,frameLeftUp)        else:            break    count_img=0    videoLeftUp.release()    print('Child process %s (%s)Stoping...' %(file_name,os.getpid()))if __name__ == '__main__':    time_time=time.time()    root_dir='X:\\lane_detect\\train_data\\2020.11.11\lane_3min\\'    FileName,FileNameWithPath,FileDir = GetNameByEveryDir(root_dir,'.mp4')    #设置进程池 最多10个进程    p = Pool(10)    # print(len(FileNameWithPath))    #20sec : 18378    # 多线程写入图片    for j in range(len(FileNameWithPath)):        try:            #保存图片文件夹名  默认视频文件夹下的视频名文件夹            img_save_dir=root_dir+FileName[j][:-4]            if not os.path.exists(img_save_dir):                os.makedirs(img_save_dir)            #多进程 未限制进程数            # p=Process(target=video_to_omg,args=(FileName[j],FileNameWithPath[j],img_save_dir,5))            # p.start()            #限制进程数            p.apply_async(video_to_omg,args=(FileName[j],FileNameWithPath[j],img_save_dir,3))        except Exception as e:            print(e)    p.close()    p.join()    print("inference time: {} s".format(round(time.time() - time_time, 4)))

进程运行截图

在这里插入图片描述

详细动图

在这里插入图片描述

转载地址:https://cxk-life.blog.csdn.net/article/details/109615740 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:python百行代码编码摇骰子模拟器(告诫网du)
下一篇:一键去除txt文本重复行(带界面版)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月07日 01时42分27秒