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多线程显示的问题和解决方法相关推荐

  1. java frame 不显示_win7系统下eclipse不显示JFrame界面的解决方法

    有不少win7旗舰版系统用户在使用eclipse的时候,遇到了不显示JFrame界面的情况,想必很多用户有遇到过这样的情况吧,接下来给大家讲解一下win7系统下eclipse不显示JFrame界面的解 ...

  2. ThinkPHP5验证码不显示的原因及解决方法

    ThinkPHP5验证码不显示的原因及解决方法 参考文章: (1)ThinkPHP5验证码不显示的原因及解决方法 (2)https://www.cnblogs.com/shengxihui/p/112 ...

  3. 打印机尚未链接到此计算机,win10系统无法连接打印机显示未指定设备的解决方法...

    有不少win10系统用户在使用打印机的时候,发现无法连接打印机,显示未指定设备,造成无法正常使用打印机,遇到这样的问题该如何处理呢,下文就给大家整理一下win10系统无法连接打印机显示未指定设备的解决 ...

  4. linux命令框显示中文乱码_CentOS终端命令行显示中文乱码的解决方法

    这篇文章主要介绍了CentOS终端命令行显示中文乱码的解决方法,以及测试方法和缺少中文字体时的解决方法,需要的朋友可以参考下 安装CentOS的时候选择了中文,结果在终端不能显示中文,都是乱码,解决方 ...

  5. SQL Server2008附加数据库之后显示为只读时解决方法

    SQL Server2008附加数据库之后显示为只读时解决方法 啰嗦的话就不多说了,直入主题吧! 方案一: 碰到这中情况一般是使用的sa账户登录的,只要改为Windows身份验证,再附加数据库即可搞定 ...

  6. android 前台服务自定义布局不显示_Android自定义LinearLayout布局显示不完整的解决方法...

    发现问题 原需求,在一个伸缩列表中,自定义LinearLayout继承LinearLayout动态添加布局. 然而实现的时候:一共遍历了30条数据,却只显示了一条 断点查看代码:遍历addView() ...

  7. Chrome不显示OPTIONS请求的解决方法2021版chrome90

    在chrome90上之前展示跨域请求预检请求的方法失效了: 在chrome地址栏总输入 chrome://flags/#out-of-blink-cors 将其设置为Disabled后重启浏览器 在c ...

  8. PLSQL 查询结果只显示年月日不显示时分秒的解决方法

    PLSQL 14查询结果只显示年月日不显示时分秒的解决方法 如果plsql里面日期显示出现混乱,并且按照一般的调整首选项里日期格式调整不了,可以修改环境变量,新建环境变量,变量名:nls_date_f ...

  9. python画图显示不了中文_Python使用matplotlib绘图无法显示中文问题的解决方法

    本文实例讲述了Python使用matplotlib绘图无法显示中文问题的解决方法.分享给大家供大家参考,具体如下: 在python中,默认情况下是无法显示中文的,如下代码: import matplo ...

最新文章

  1. TestBird烧烤趴,几维安全专属报名通道
  2. XmlSerializer 对象序列化成XML 自定义编码格式(gb2312)
  3. 【转】VS 安全开发生命周期(SDL)检查
  4. docker logs 容器日志文件路径查看
  5. 计算机主机磁盘怎么开,电脑bios怎么设置硬盘启动
  6. intx update task - IB_IBINTX_UPDATE
  7. Scala 写第一个程序HelloWorld
  8. jquery:临时禁止鼠标滚动 How to disable scrolling temporarily?
  9. Android程序开发0基础教程(一)
  10. 2017年计算机期刊目录,【2017年整理】核心期刊目录一览表.doc
  11. 关于最近很火的“快用苹果助手”和“pp助手”使用正版软件闪退问题的说明
  12. Tomcat原理整理
  13. 英特尔oneAPI—开发生物序列聚类工具
  14. css进行布局时,同一行多个元素摆放后,设置margin-right让他们之间产生间距,那么最后一个元素设置margin-right是多余的
  15. 全球及中国贴片电容行业市场竞争态势及投资风险预测报告2022-2028年
  16. dd linux 格式化u盘启动盘_linux dd命令刻录启动U盘详解
  17. TCP四次挥手断开连接
  18. Kali linux2020.4下载与安装教程(超级详细)
  19. 生鲜蔬菜生产称重管理系统
  20. axure9总是崩_有没有人和我一样,觉得axure9 很难用

热门文章

  1. Syntax error, parameterized types are only available if source level is 1.5
  2. 物理磁盘空间使用已满导致数据库hang起
  3. HTML 5核心内容
  4. Shiro缓存使用Redis、Ehcache、自带的MpCache实现的三种方式实例
  5. 写了这么久前端,你知道浏览器原理吗?
  6. mongo笔记 // 一字一句的写下来,工作点滴片段
  7. 常用的android弹出对话框
  8. Event/window.Event属性和方法
  9. 填坑利器?Redis如何弥补传统MySQL架构的不足
  10. django form choice