多线程保存图片,速度比原来提高百倍

2021.12.21
1
背景就是视频动作检测,检测到指定的动作,如摔倒等就报警并将该帧保存到指定文件夹中。

定义保存图片函数,当满足设定的条件时调用该函数,并传入参数。其中frame是当前要保存的帧,img_path是保存路径,warn_time是报警时间。
多线程保存图片,速度比原来提高百倍_第1张图片

其中image=frame[:,:,::-1]的第一个:返回所有行,第二个:返回所有列,::-1以相反的方式返回帧通道。目的是将BGR格式转换为RGB格式。

因为opencv捕获的帧返回的格式是BGR,如果直接保存图片颜色类似蓝色,需要先转为RGB格式也就是我们正常看到的图像颜色。

该句代码类似于cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)。

保存图片用imwrite()函数,该函数有三个参数,第一个参数是保存的路径和名字,第二个参数是图像矩阵,第三个参数可选,表示保存图像的质量。

保存JPEG格式图像,图像质量0-100,默认95。100最好,0最差,如:

cv2.imwriter(图片名, 图片,[int(cv2.IMWRITE_JPEG_QUALITY),100])

保存PNG格式图像,图像质量0-9,默认3。0最好,9最差,如:

cv2.imwriter(图片名, 图片,[int(cv2.IMWRITE_PNG_QUALITY),0])

调用该函数,保存一张图片约需要20ms。

2
如何利用多线程保存图片?

Python标准库提供了concurrent.futures模块,它提供了ThreadPoolExcutor和ProcessPoolExcutor两个类,分别用来创建线程池和进程池,对编写线程池/进程池提供了直接的支持。

步骤一:导包

from concurrent.futures import ThreadPoolExecutor

步骤二:创建线程池

threadpool=ThreadPoolExcutor(max_workers=5)

步骤三:使用submit调用保存图片的函数

Threadpool.submit(saveimg,frame,self.img_path,warn_time_ti)

第一个参数是调用的之前定义的saveimg函数,后面三个参数是传到该函数的三个参数。

此时保存一张图片约需要0.2ms。

你可能感兴趣的:(深度学习,opencv,python,pytorch,计算机视觉)