opencv多线程显示的问题和解决方法
opencv多线程显示的问题和解决方法
1.问题描述
由于业务需求,需要在多线程中,使用OpenCV读取图片并显示,实现很简单,只需要调用python的threading创建线程,并在线程中显示图片即可,但会出现一个问题: 只能显示第一张图图片,第二张图图片就会阻塞掉!!!
这是最初的精简的BUG代码
import os
import cv2
import glob
import threadingclass DisplayTask(object):""""""def __init__(self, ):""":param width::param height:"""self.win_name = "frame"def show(self, image_path):print("block here 1")frame = cv2.imread(image_path)print("block here 2")cv2.imshow(self.win_name, frame)print("block here 3")cv2.waitKey(1000)cv2.destroyAllWindows()def display_task(th_id, image_path):print("start thread-{}".format(th_id))dt = DisplayTask()dt.show(image_path)def demo(image_dir):image_list = glob.glob(os.path.join(image_dir, "*.jpg"))print("have image:{}".format(len(image_list)))for th_id, image_path in enumerate(image_list):thread = threading.Thread(target=display_task, args=(th_id, image_path,))thread.start()# 等待线程执行完毕thread.join()print("finish thread-{}".format(th_id))if __name__ == "__main__":image_dir = "/media/dm/dm1/git/python-learning-notes/data"demo(image_dir)
运行结果:
have image:4
start thread-0
block here 1
block here 2
block here 3
finish thread-0
start thread-1
block here 1
block here 2
存在问题: 第一次启动线程,可以正常显示图片,但第二个线程就会在cv2.imshow(self.win_name, frame)这里阻塞,不会执行下去
2.解决方法
opencv中imshow等显示操作只能在主线程中显示,不能在子线程中显示,那为什么第1个子线程可以正常显示咧? 原因嘛?
解决方法也很简单,既然不能在子线程中显示,但没说不能在多进程中显示呀
所有把threading改为multiprocessing,问题解决:
# -*-coding: utf-8 -*- """@Project: python-learning-notes@Author : panjq@E-mail : pan_jinquan@163.com@Date : 2020-04-10 18:24:06 """import os import cv2 import glob # import threading import multiprocessingclass DisplayTask(object):""""""def __init__(self, ):""":param width::param height:"""self.win_name = "frame"def show(self, image_path):print("block here 1")frame = cv2.imread(image_path)print("block here 2")cv2.imshow(self.win_name, frame)print("block here 3")cv2.waitKey(1000)cv2.destroyAllWindows()def display_task(th_id, image_path):print("start thread-{}".format(th_id))dt = DisplayTask()dt.show(image_path)def demo(image_dir):image_list = glob.glob(os.path.join(image_dir, "*.jpg"))print("have image:{}".format(len(image_list)))for th_id, image_path in enumerate(image_list):# thread = threading.Thread(target=display_task, args=(th_id, image_path,))thread = multiprocessing.Process(target=display_task, args=(th_id, image_path,))thread.start()# 等待线程执行完毕thread.join()print("finish thread-{}".format(th_id))if __name__ == "__main__":image_dir = "/media/dm/dm1/git/python-learning-notes/data"demo(image_dir)
opencv多线程显示的问题和解决方法相关推荐
- java frame 不显示_win7系统下eclipse不显示JFrame界面的解决方法
有不少win7旗舰版系统用户在使用eclipse的时候,遇到了不显示JFrame界面的情况,想必很多用户有遇到过这样的情况吧,接下来给大家讲解一下win7系统下eclipse不显示JFrame界面的解 ...
- ThinkPHP5验证码不显示的原因及解决方法
ThinkPHP5验证码不显示的原因及解决方法 参考文章: (1)ThinkPHP5验证码不显示的原因及解决方法 (2)https://www.cnblogs.com/shengxihui/p/112 ...
- 打印机尚未链接到此计算机,win10系统无法连接打印机显示未指定设备的解决方法...
有不少win10系统用户在使用打印机的时候,发现无法连接打印机,显示未指定设备,造成无法正常使用打印机,遇到这样的问题该如何处理呢,下文就给大家整理一下win10系统无法连接打印机显示未指定设备的解决 ...
- linux命令框显示中文乱码_CentOS终端命令行显示中文乱码的解决方法
这篇文章主要介绍了CentOS终端命令行显示中文乱码的解决方法,以及测试方法和缺少中文字体时的解决方法,需要的朋友可以参考下 安装CentOS的时候选择了中文,结果在终端不能显示中文,都是乱码,解决方 ...
- SQL Server2008附加数据库之后显示为只读时解决方法
SQL Server2008附加数据库之后显示为只读时解决方法 啰嗦的话就不多说了,直入主题吧! 方案一: 碰到这中情况一般是使用的sa账户登录的,只要改为Windows身份验证,再附加数据库即可搞定 ...
- android 前台服务自定义布局不显示_Android自定义LinearLayout布局显示不完整的解决方法...
发现问题 原需求,在一个伸缩列表中,自定义LinearLayout继承LinearLayout动态添加布局. 然而实现的时候:一共遍历了30条数据,却只显示了一条 断点查看代码:遍历addView() ...
- Chrome不显示OPTIONS请求的解决方法2021版chrome90
在chrome90上之前展示跨域请求预检请求的方法失效了: 在chrome地址栏总输入 chrome://flags/#out-of-blink-cors 将其设置为Disabled后重启浏览器 在c ...
- PLSQL 查询结果只显示年月日不显示时分秒的解决方法
PLSQL 14查询结果只显示年月日不显示时分秒的解决方法 如果plsql里面日期显示出现混乱,并且按照一般的调整首选项里日期格式调整不了,可以修改环境变量,新建环境变量,变量名:nls_date_f ...
- python画图显示不了中文_Python使用matplotlib绘图无法显示中文问题的解决方法
本文实例讲述了Python使用matplotlib绘图无法显示中文问题的解决方法.分享给大家供大家参考,具体如下: 在python中,默认情况下是无法显示中文的,如下代码: import matplo ...
最新文章
- TestBird烧烤趴,几维安全专属报名通道
- XmlSerializer 对象序列化成XML 自定义编码格式(gb2312)
- 【转】VS 安全开发生命周期(SDL)检查
- docker logs 容器日志文件路径查看
- 计算机主机磁盘怎么开,电脑bios怎么设置硬盘启动
- intx update task - IB_IBINTX_UPDATE
- Scala 写第一个程序HelloWorld
- jquery:临时禁止鼠标滚动 How to disable scrolling temporarily?
- Android程序开发0基础教程(一)
- 2017年计算机期刊目录,【2017年整理】核心期刊目录一览表.doc
- 关于最近很火的“快用苹果助手”和“pp助手”使用正版软件闪退问题的说明
- Tomcat原理整理
- 英特尔oneAPI—开发生物序列聚类工具
- css进行布局时,同一行多个元素摆放后,设置margin-right让他们之间产生间距,那么最后一个元素设置margin-right是多余的
- 全球及中国贴片电容行业市场竞争态势及投资风险预测报告2022-2028年
- dd linux 格式化u盘启动盘_linux dd命令刻录启动U盘详解
- TCP四次挥手断开连接
- Kali linux2020.4下载与安装教程(超级详细)
- 生鲜蔬菜生产称重管理系统
- axure9总是崩_有没有人和我一样,觉得axure9 很难用
热门文章
- Syntax error, parameterized types are only available if source level is 1.5
- 物理磁盘空间使用已满导致数据库hang起
- HTML 5核心内容
- Shiro缓存使用Redis、Ehcache、自带的MpCache实现的三种方式实例
- 写了这么久前端,你知道浏览器原理吗?
- mongo笔记 // 一字一句的写下来,工作点滴片段
- 常用的android弹出对话框
- Event/window.Event属性和方法
- 填坑利器?Redis如何弥补传统MySQL架构的不足
- django form choice