首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奇异的cv2行为

奇异的cv2行为
EN

Stack Overflow用户
提问于 2020-07-26 19:26:17
回答 3查看 449关注 0票数 2

我在Kubuntu 20.04上使用Python3.8.2。

cv2是最新的可用版本,NumPy和pip也是如此:

代码语言:javascript
运行
复制
Requirement already up-to-date: pip in /usr/local/lib/python3.8/dist-packages (20.1.1)
Requirement already up-to-date: opencv-contrib-python in /usr/local/lib/python3.8/dist-packages (4.3.0.36)
Requirement already satisfied, skipping upgrade: numpy>=1.17.3 in /usr/local/lib/python3.8/dist-packages (from opencv-contrib-python) (1.19.1)
Requirement already up-to-date: numpy in /usr/local/lib/python3.8/dist-packages (1.19.1)

这是我的代码:

代码语言:javascript
运行
复制
import numpy as np
import cv2

black_image = np.zeros((480, 640, 3))
cv2.imshow("Test", black_image)
cv2.waitKey()

white_image = np.ones((480, 640, 3))
cv2.imshow("Test", white_image)
cv2.waitKey()

这个简单的测试程序,在空闲运行时,有时会显示一个小的黑色映像(95x25),而不是我传递给imshow的640x480黑色映像。其他时候,它会显示正确的图像。在这两种情况下,当这个窗口关闭时,OpenCV将永远阻塞,而不是显示第二个图像,我必须通过空闲的shell窗口关闭进程。

当在终端中运行时,结果是一样的:有时,大小为95x25的奇怪的小映像在打开第二个窗口之前会阻塞,导致我不得不终止进程(Ctrl+C什么也不做,发送SIGTERM也不能工作)。

我试过:

cv2.imshow()传递0。同样的结果。

传递1到cv2.imshow()。这实际上显示白色图像,但黑色图像(或其怪异的95x25替代品)也会显示出来。据我所知,如果使用相同的名称,cv2.imshow()应该替换已经打开的窗口的内容。

我记得OpenCV在Python3.7和更低版本中工作得很好,尽管我不能用它进行测试,因为这些版本不再可以在我的Ubuntu版本上安装。

这两种结果在我的机器上都是可复制的,但在它们之间切换不需要任何代码更改。这是怎么回事,我该怎么解决?

编辑:还尝试关闭窗口(通过名称和通过cv2.destroyAllWindows())并等待特定的按键。主要问题仍然存在:图像显示不一致,OpenCV有时会永远挂起。普通程序和我粘贴的其他代码不能正常工作。

编辑2:现在附上的是我问题的截图。

第一个奇怪的窗口:

关闭第一个窗口后没有打开OpenCV窗口的空闲挂起:

Konsole (我的终端仿真器)也在关闭第一个窗口后挂起:

Ctrl没有在终端中结束Python:

我也可以提供视频证明,如果需要。

EN

Stack Overflow用户

发布于 2020-07-26 21:03:48

我认为你面临两个问题:

  1. 代码有时以错误的大小显示黑色图像。
  2. ,当它出现时,运行在这里。

2的问题是,cv2.imshow接受(默认情况下)关闭窗口的关键事件(即通过x标志关闭窗口将导致永远停留在等待步骤中)。

作为解决这一问题的方法,您可以添加一个if语句来关闭窗口,如果按下了键,就可以显式地告诉程序,如果按下x符号/按钮就关闭窗口。因此,您可以编写如下内容:

代码语言:javascript
运行
复制
import numpy as np
import cv2

black_image = np.zeros((480, 640, 3))
white_image = np.ones((480, 640, 3))

images = [black_image, white_image]

for image in images:   
    while True:
        cv2.imshow('Frame', image)
        if cv2.waitKey(1) & 0xFF == 27 or cv2.getWindowProperty("Frame", 0) == -1: # "0xFF == 27" for Esc-key in Windows
            break
cv2.destroyAllWindows()
票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63104705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档