多线程截取视频帧
程序员文章站
2022-03-26 08:12:16
...
对于长视频或者多个视频文件来说,截取图像帧比较慢,看了几个大佬用多线程处理此类问题。本萌新尝试整理了一下,废话不多说,直接上代码
import threading
import cv2
import time
import os
from multiprocessing import Pool
path2 = 'E:\image\\' # 图片保存位置
if not os.path.exists(path2):
os.makedirs(path2)
class myThread(threading.Thread):
def __init__(self, start_frame, length, path, count):
super(myThread, self).__init__()
self.start_frame = start_frame
self.length = length
self.path = path #视频路径
self.count = count #用于计数
def run(self):
with thread_max_num: #这里引入thread_max_num为了控制线程数下文会定义这个参数
print('当前线程的名字是: ', threading.current_thread().name)
cap = cv2.VideoCapture(self.path) # 视频位置
cap.set(cv2.CAP_PROP_POS_FRAMES, self.start_frame)
freq = 100 #每隔100帧截取一张图像
for idx in range(self.length):
ret = cap.grab()
if not ret:
break
if idx % freq == 0:
ret, frame = cap.retrieve()
if frame is None: # exist broken frame
break
cv2.imwrite(path2 + str(self.count + idx + self.start_frame) + '.jpg', frame)
# do something else
...
cap.release()
path = r'E:\集卡视频'
def get_file(): # 创建一个空列表用于存放要处理的视频路径
files = os.listdir(path)
files.sort() # 排序
list = []
for file in files:
if not os.path.isdir(path + file): # 判断该文件是否是一个文件夹
f_name = str(file)
# print(f_name)
tr = '\\' # 多增加一个斜杠
filename = path + tr + f_name
list.append(filename)
return list
lists = get_file() #lists中存放的是所有视频路径
#print(len(lists))
count=0
n=4 #我这边是每个视频用4个线程处理,可以针对自己的视频总帧数合理设置
thread_max_num = threading.Semaphore(5) #最大线程个数,防止线程过多抢占资源
for list in lists: #计数,这边偷懒了
count=count+100000
print(list)
for i in range(n):
p = myThread(i * 2500, i * 2500 + 2500, list ,count) # 一个线程处理2500帧数据
i = i + 1
p.start()
在使用代码前可以用cv2.VideoCapture中的cap.get(7)获取视频总帧数,然后再设置线程个数和每个线程处理的帧数。
小白一个,欢迎大佬前来指正
上一篇: Java中使用Jedis操作Redis
下一篇: 数据探索之数据分析