Python 多线程中 OpenCV imshow 方法失效、不显示、不刷新、卡死的解决方法

这篇具有很好参考价值的文章主要介绍了Python 多线程中 OpenCV imshow 方法失效、不显示、不刷新、卡死的解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题

近日在做项目的时候,需要使用多线程来合成画面,然后一个子线程通过 OpenCV 中的 imshow() 模块显示在窗口上。

但是遇到一个问题:虽然程序能够正常运行,但是没有窗口,在 Dock 栏上只有一个白色的图标表明有这个程序在运行。翻阅了好多的博客,许多都说加入下面的代码就能够正常显示画面。

cv2.namedWindow("Flag Operating System")
cv2.imshow("Flag Operating System", image)
key = cv2.waitKey(1)

我加上了,但是依旧没有反应,这就奇怪了,按道理使用 imshow 就应该能创建窗口。我把 waitKey(1) 中的1 改成了 0 ,这时窗口是出现了,但是是黑屏,画面不刷新。

最终,在经历了近两天的查找与修改,终于发现问题出现在多线程上!!!

大概的意思是:OpenCV-Pythonimshow() 方法不能在子线程上使用,也就是说子线程里使用这个方法无法正确地创建、刷新画面。

解决方法与程序框架

为了解决这个问题,需要加入一个 Queue 将子线程里面的 frame 画面提取到主线程里,然后再在主线程里面显示。大体的程序框架见下面的程序所示。文章来源地址https://www.toymoban.com/news/detail-557671.html

import queue
import threading

# 处理画面的子线程
class RenderFrame(threading.Thread):
    def __init__(self, thread_name, render_queue):
        threading.Thread.__init__(self, name=thread_name)
        self.render_data = render_queue  # 完成合成的帧缓存列队
		...
        ...
        Your Code
        ...
		...

    def run(self) -> None:
		...
        ...
        Your Code
        ...
        ...
        while True:
            ...
            ...
			frame  # 这个是 OpenCV 处理完的画面,将这个画面存入缓存列队
            self.render_data.put(image)  # 将处理完的画面存入缓存列队

 def main():
    render_frame_queue = queue.Queue()  # 创建一个渲染完成的缓冲队列
    '''
    用于缓存 RenderFrame 合成出来的画面,用作缓存列队
    '''
    display_frame = RenderFrame("RenderFrame", render_frame_queue)
    display_frame.start()  # 开始线程

    # 在主线程处理渲染完成的画面
    '''
    由于 OpenCV 的限制,无法在子线程中使用 nameWindow 或者 imshow 等方法
    只能新建一个多线程列队将渲染完成的信息加入到列队,然后再在主线程中展示出来
    '''
    while True:
        frame = render_frame_queue.get()
        start_time = time.time()
        # 如果获取的帧不为空
        cv2.namedWindow('Window', cv2.WINDOW_KEEPRATIO)
        cv2.imshow('Window', frame)
        cv2.waitKey(1)
        end_time = time.time()
        print("FPS: ", 1 / (end_time - start_time))
        # break
    cv2.destroyAllWindows()
    display_frame.join()


if __name__ == '__main__':
    main()

到了这里,关于Python 多线程中 OpenCV imshow 方法失效、不显示、不刷新、卡死的解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python中图片读取和保存以及plt.imshow()与cv2.imshow()显示图像颜色错误解决方案

    最近调试程序的时候,发现要保存的图片颜色与原图片有色差(显示图像变蓝),郁闷良久,终于发现问题,望诸君避坑。 🧸在用plt.imshow和cv2.imshow显示同一幅图时可能会出现颜色差别很大的现象。 🎯原因:opencv的接口使用BGR,而matplotlib.pyplot 则是RGB模式。 单独使用图像是

    2024年02月11日
    浏览(48)
  • Ubuntu下OpenCV编译安装全攻略:解决Python imshow与C++读取视频问题

    计算机视觉是一门涉及图像处理、机器学习和人工智能的学科,旨在让计算机理解并解释数字图像或视频中的内容。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了大量的算法来处理图像和视频,包括但不限于物体识别、人脸识别、运动追踪等。由

    2024年02月03日
    浏览(42)
  • 一种在 Python 中实现更快 OpenCV 视频流的多线程方法

    概述 在本文中,我们将看到两个没有多线程的 Python 代码示例,用于从摄像头读取视频帧。我们将看到使用/不使用多线程获得的 FPS 的差异。 什么是多线程? 线程是进程中的一个执行单元。多线程是指通过在线程之间快速切换对 CPU 的控制(称为上下文切换)来并发执行多个

    2024年02月16日
    浏览(58)
  • 解决python3安装完OpenCV后没有cv2.imshow、cv2.imread等函数的问题

    发现cv2中没有函数可用,此时打开cv2所在的文件夹, 找到 cv2.pyd 文件,复制到所用python环境中的site-packages文件夹中 关闭项目工程文件重新打开,就可以调用cv2中的函数了。

    2024年02月03日
    浏览(83)
  • python--pyQt5 页面刷新\线程刷新\界面卡顿 --- 多线程处理(线程的开始/暂停/恢复/取消)同时运行两个不同的线程 pyside6

    参考:https://blog.csdn.net/zx520113/article/details/86598658 PyQt5中使用QTimer定时刷新:当要执行可能会超过设定时间的代码 刷新界面命令:QApplication.processEvents() 对于执行很耗时的程序来说,由于PyQt需要等待程序执行完毕才能进行下一步,这个过程表现在界面上就是卡顿,而如果需要

    2024年03月25日
    浏览(50)
  • 【Qt 多线程+opencv 读取和显示图像】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 提示:以下是本篇文章正文内容,下面案例可供参考 加入了信号与槽机制来处理多线程中的图像数据: 创建工作线程类 :首先创建一个工作线程类,它从

    2024年02月19日
    浏览(42)
  • 【已解决】安装cv2时Building wheel for opencv-python终端卡死

    环境: Ubuntu20.04 Python3.6 现象:终端输出类似下面的命令,并卡住不动 首先, OpenCV 较旧的Python版本不需要进行滚轮编译,因此造成编译在 处停止。为了防止因为pip版本较旧引起干扰,首先运行 更新 pip 版本,接着再次安装 接着大概率能解决 Building wheel for opencv-python (PEP 51

    2024年02月03日
    浏览(71)
  • Plt图片不显示,不弹出,Pycharm图片独立显示与imshow()无法显示

    问题一:Pycharm 图片在独立窗口显示(或者是图片压根不显示) pycharm从2017.3版之后,将 matplotlib 的绘图的结果默认显示在 SciView 窗口中, 而不是弹出独立的窗口。可以通过如下方式修改,弹出独立窗口 File | Settings | Tools | Python Scientific | Show plots in tool window 取消勾选 问题二:py

    2024年02月13日
    浏览(80)
  • matlab的imshow()如何以合适大小显示图片

    如果使用imshow(a)则显示出来的图像过小,我们可以使用下句,来显示合适大小的图像 imshow(a,InitialMagnification = \\\'fit\\\')

    2024年02月16日
    浏览(43)
  • opencv使用imshow()输出时怎样设置窗口大小

    在学习OpenCV的过程中,第一步就是要读取图片并输出,但在输出过程中我发现简单地使用cv2.imshow(\\\'winname\\\',path)输出得到的图片常常不能窥全貌,被默认函数一自适应,就显示不完,还太大,因此,我想要自动拉伸窗口尺寸且不改变宽高比。 创建窗口函数cv2.namedwindow()介绍 其中

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包