opencv多线程显示的问题和解决方法
生活随笔
收集整理的這篇文章主要介紹了
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多线程显示的问题和解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 世界坐标系,相机坐标系和图像坐标系的转换
- 下一篇: conda重命名环境env