目录

  • 前言
  • Python多线程编程
  • OpenCV视屏流的多线程处理
  • 结语

前言

最近在功能性测试的过程中,需要在Python环境下用OpenCV读取网络摄像头的视频流,接着用目标检测器进行视屏帧的后续处理。在测试过程中发现如果是单线程的情况,会出现比较严重的时延,如果目标检测模型稍微大一点,像YOLOv4这类的,那么情况更加严重。
后面考虑到演示效果,从单线程改为了多线程,即单独用一个线程实时捕获视频帧,主线程在需要时从子线程拷贝最近的帧使用即可。通过这样的修改,不仅时延基本消失,整个流程的实时性也有相对的提升,可以说是非常实用的技巧。

Python多线程编程

使用Python进行多线程编程是较为简单的,Python的threading模块封装了相关的操作,通过编写功能类继承threading.Thread即可实现自己的逻辑。简单的代码示例如下所示:

class myThread(threading.Thread):def __init__(self, name=None):super(myThread, self).__init__(name=name)def run(self):print('=> Thread %s is running ...' % self.name)thread = myThread()
thread.start()
thread.join()

上面的代码简单展示了如何使用线程类:通过调用start()方法,线程实例开始在单独的线程上下文中运行自己的run()函数处理任务,直到线程退出。在此期间,主线程可以继续执行任务。当主线程任务执行结束时,主线程可通过设置全局状态变量告知子线程退出,同时调用join()方法等待子线程运行结束。

OpenCV视屏流的多线程处理

在上面例子的基础上,可对简单的单线程处理流程进行优化,即将读取视频帧的部分单独放在一个线程执行,同时提供线程间同步、数据交互的支持,在主线程中运行目标检测模型和后续处理流程,在需要时从读取视频帧的子线程获取最近的帧进行预处理、推理、后处理和可视化等操作。相关的示例代码如下:

import numpy as np
import cv2
import threading
from copy import deepcopythread_lock = threading.Lock()
thread_exit = Falseclass myThread(threading.Thread):def __init__(self, camera_id, img_height, img_width):super(myThread, self).__init__()self.camera_id = camera_idself.img_height = img_heightself.img_width = img_widthself.frame = np.zeros((img_height, img_width, 3), dtype=np.uint8)def get_frame(self):return deepcopy(self.frame)def run(self):global thread_exitcap = cv2.VideoCapture(self.camera_id)while not thread_exit:ret, frame = cap.read()if ret:frame = cv2.resize(frame, (self.img_width, self.img_height))thread_lock.acquire()self.frame = framethread_lock.release()else:thread_exit = Truecap.release()def main():global thread_exitcamera_id = 0img_height = 480img_width = 640thread = myThread(camera_id, img_height, img_width)thread.start()while not thread_exit:thread_lock.acquire()frame = thread.get_frame()thread_lock.release()cv2.imshow('Video', frame)if cv2.waitKey(1) & 0xFF == ord('q'):thread_exit = Truethread.join()if __name__ == "__main__":main()

在上面的代码中,为确保资源访问不受冲突,使用threading.Lock进行保护;主线程使用thread_exit全局状态变量控制子线程的运行状态。稍微特别一点的是,thread_exit实际上控制着两个线程的运行状态,因为在上述的处理流程中,两个线程都拥有终止运行流程的话语权,故这样的处理是合理的。

结语

实际上使用多线程并行处理任务,最大程度地利用资源早已是老生常谈的技巧,例如在服务器端,会开辟有专门的线程池用于处理随时可能到来的请求,而在嵌入式通信终端上,也通常采用线程池的方式来处理收到的消息包,以尽可能提升实时性。虽然多线程的处理方式相较单线程而言要稍微复杂一些,但带来的性能提升确是实打实的,所以还是很值得一试。

Python环境下OpenCV视频流的多线程处理方式相关推荐

  1. python环境下opencv安装与一些坑

    这里就只是单纯讲一下opencv的安装与使用时遇到的坑,毕竟作为一个萌新还没资格对一个成熟的框架指手画脚. 安装: 一般直接pip3安装太慢了的话我们可以使用国内的镜像,这里我用的是清华源 pip3 ...

  2. opencv在python环境下的安装_关于python环境下的opencv安装

    吐槽: 这一天我终于记起了这个博客.今天搞python环境下的opencv,又弄了一天,很烦躁.之前配置VS的opencv也是花了好久的时间,然后突然发现之前记录在电脑上的文档都找不到了,于是决定还是 ...

  3. Anaconda环境下OpenCV的安装

    Anaconda环境下OpenCV的安装 本人小白,初学OpenCV,结果在安装的时候就遇到了麻烦,总是出错.尝试过 方案一:直接conda install OpenCV,方案二:在官网直接下载Ope ...

  4. 图像处理/计算机视觉/ python环境下如何用滤波器(/逆滤波/均值滤波/低通滤波/高通滤波)处理图片【附代码】

    计算机视觉滤波器实操 基础知识 一. 计算机视觉技术中常见的几种滤波器 二.滤波器相关知识 应用一:算术均值.几何均值.谐波逆谐波 一.问题分析 二.结果图 三.代码附录 应用二:维纳滤波,逆滤波 一 ...

  5. python捷豹_图像处理基本工具——Python 环境下的 Pillow( PIL )

    由于笔者近期的研究课题与图像后处理有关,需要通过图像处理工具对图像进行变换和处理,进而生成合适的训练图像数据.该系列文章即主要记录笔者在不同的环境下进行图像处理时常用的工具和库.在 Python 环境 ...

  6. python后端脚手架_flask-adminlte-scaffold是一个Python环境下的WEB后台管理系统脚手架...

    flask-adminlte-handler 简介 flask-adminlte-handler是一个Python环境下的WEB后台管理系统脚手架,目标是用极少量的代码,快速构建小型WEB应用.请勿在 ...

  7. Python环境下用中文做了个《王者荣耀》AI脚本

    <王者荣耀>AI最早的巅峰应该是在2018年 "AI(人工智能)"VS"人类明星战队" 以此为目标在python环境下开发了AI脚本自动打<王 ...

  8. python环境下,XGBoost模型文件转pmml格式用于部署

    一. python环境下生成PMML 1. sklearn接口的xgboost 需要用sklearn2pmml包来生成pmml文件,一共有两种方法: 方法一: 在管道pipeline中进行fit后保存 ...

  9. 图像处理/计算机视觉/python环境下/如何用四种不同滤波器处理噪声【附代码、亲测有效】

    计算机视觉实操之图像处理 一.问题描述 二.效果图 三.代码附录 四.相关链接 一.问题描述 向图片中分别加入椒盐噪声.高斯噪声,使用四种不同的滤波器观察图片的处理效果(算术均值滤波.几何均值滤波 . ...

最新文章

  1. 告诉你,Spring Boot 真是个牛逼货!
  2. 终于有人把JAVA虚拟机讲清楚了!
  3. ItChat与图灵机器人的结合
  4. webpack环境搭建使用
  5. android 那几种动画,Android 动画实现几种方案
  6. transferto的流这么关闭_Java 9中InputStream的transferTo()方法的重要性?
  7. 回溯算法解决八皇后_4皇后问题和使用回溯算法的解决方案
  8. bootstrap 简介
  9. golang文件夹位置判断
  10. 黄聪:wordpress教程
  11. Python之面向对象进阶篇
  12. 2021年山东省安全员A证考试题及山东省安全员A证考试试卷
  13. 软件渗透测试:定义、需求、过程
  14. 面试官常问 webpack 面试题
  15. 怎样能用计算机打出表白数字,数字表白大全 怎么用数字表白
  16. 三、python数据序列1-列表
  17. php 时间配置,php 配置正确的时间
  18. 【Splay 总结】
  19. mysql.lib 是mtd mdd_VS运行时 /MD、/MDd 和 /MT、/MTd之间的区别
  20. e3 v3服务器芯片组,最保值的E3-1230 v3遇上锐龙5:结果惊讶!

热门文章

  1. 数学建模:微分方程模型—常微分方程数值解算法及 Python 实现
  2. 调试大普RTC芯片驱动-ins5699s
  3. Windows 7下硬盘安装Ubuntu 14.04图文教程
  4. 一个网站SEO优化主管必须具备的能力
  5. 计算机更新并关机能关闭吗,win10关机不想更新并关机而是直接关机步骤设置
  6. kali linux nmap扫描(二)_商洛学院司徒荆_新浪博客
  7. python毫秒级别抢购_Python 实现毫秒级淘宝抢购脚本
  8. BP神经网络C语言实现
  9. centos配置网桥以及brctl命令的使用
  10. 解读!10篇人机交互领域高引论文合集