日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv多线程显示的问题和解决方法

發(fā)布時間:2024/4/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv多线程显示的问题和解决方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

opencv多線程顯示的問題和解決方法

?


1.問題描述

由于業(yè)務需求,需要在多線程中,使用OpenCV讀取圖片并顯示,實現(xiàn)很簡單,只需要調用python的threading創(chuàng)建線程,并在線程中顯示圖片即可,但會出現(xiàn)一個問題: 只能顯示第一張圖圖片,第二張圖圖片就會阻塞掉!!!

這是最初的精簡的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()# 等待線程執(zhí)行完畢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)這里阻塞,不會執(zhí)行下去

?


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()# 等待線程執(zhí)行完畢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多线程显示的问题和解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。