Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python imshow的奇怪cv2行为_Python_Python 3.x_Numpy_Opencv - Fatal编程技术网

Python imshow的奇怪cv2行为

Python imshow的奇怪cv2行为,python,python-3.x,numpy,opencv,Python,Python 3.x,Numpy,Opencv,我正在Kubuntu 20.04上使用Python 3.8.2 cv2是最新的可用版本,NumPy和pip也是: 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)

我正在Kubuntu 20.04上使用Python 3.8.2

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

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)
这是我的密码:

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的奇怪的小图像,打开第二个窗口之前OpenCV会阻塞,导致我不得不终止进程Ctrl+C无效,发送SIGTERM也无效

我试过:

正在将0传递给cv2.imshow。同样的结果

将1传递给cv2.imshow。这实际上会按预期显示白色图像,但也会显示黑色图像或其奇怪的95x25替代图像。据我所知,cv2.imshow应该替换已经打开的窗口的内容(如果存在同名窗口)

我记得OpenCV在Python3.7及以下版本中运行良好,尽管我无法用它进行测试,因为这些版本不再可以安装在我的Ubuntu版本上

这两个结果在我的机器上都是可复制的,但在它们之间切换不需要更改代码。这里发生了什么,我该怎么解决

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

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

第一个奇怪的窗口:

关闭第一个窗口后,无OpenCV窗口打开的空闲悬挂:

Konsole my terminal emulator在关闭第一个窗口后也挂起:

Ctrl-C无法在终端中结束Python:


如果需要,我还可以提供视频演示。

您可以使用cv2.destroyWindowTest或cv2.destroyAllWindows来正确关闭窗口。

您可以使用cv2.destroyWindowTest或cv2.destroyAllWindows来正确关闭窗口。

我认为您面临两个问题:

代码有时以错误的大小显示黑色图像。 当它发生时,跑步会在这里停止。 2的问题是cv2.imshow默认接受关闭窗口的关键事件,即通过x符号关闭窗口将导致永远卡在等待步骤中

作为一种解决方案,您可以添加一个if语句,以便在按下某个键时关闭窗口,并明确告诉程序如果按下x符号/按钮关闭窗口。因此,您可以编写如下内容:

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()

我认为你们面临两个问题:

代码有时以错误的大小显示黑色图像。 当它发生时,跑步会在这里停止。 2的问题是cv2.imshow默认接受关闭窗口的关键事件,即通过x符号关闭窗口将导致永远卡在等待步骤中

作为一种解决方案,您可以添加一个if语句,以便在按下某个键时关闭窗口,并明确告诉程序如果按下x符号/按钮关闭窗口。因此,您可以编写如下内容:

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()

在Python3.8.5的更新版本发布之后,我更新了Python、pip和PyOpenCV。现在一切都按预期运行,证实了我的怀疑,这是一个模糊的bug,不是由我的代码直接引起的

更新包:

Requirement already satisfied: pip in ./.local/lib/python3.8/site-packages (20.3.3)
Requirement already satisfied: opencv-contrib-python in /usr/local/lib/python3.8/dist-packages (4.4.0.46)
Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.8/dist-packages (from opencv-contrib-python) (1.19.1)

也许这可以帮助那些过时软件包的用户在将来遇到同样的问题。

在Python 3.8.5的更新版本发布之后,我更新了Python、pip和PyOpenCV。现在一切都按预期运行,证实了我的怀疑,这是一个模糊的bug,不是由我的代码直接引起的

更新包:

Requirement already satisfied: pip in ./.local/lib/python3.8/site-packages (20.3.3)
Requirement already satisfied: opencv-contrib-python in /usr/local/lib/python3.8/dist-packages (4.4.0.46)
Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.8/dist-packages (from opencv-contrib-python) (1.19.1)

也许这可以帮助那些使用过时软件包的人在将来遇到同样的问题。

在使用cv2时,不要忘记在结尾处写:cv2.destroyAllWindows。谢谢你的提示,尽管在Python 3.8之前我似乎不必使用它。当通过q键或esc键关闭窗口/imshow时,你不会遇到问题,对吧?程序的执行永远不会到达那里。cv2在等待键期间会在某个地方阻塞。我在回答中提供的解决方案如何?在使用cv2时,不要忘记在结尾处写:cv2.destroyAllWindows。感谢您的提示,尽管在Python 3.8之前我似乎不必使用它。当通过键q或esc关闭窗口/imshow时,您不会遇到问题,对吧?程序的执行永远不会到达那里。cv2在等待过程中会在某个地方阻塞。我在回答中提供的解决方案如何?窗口关闭不是我的问题,尽管下次我会记得这样做
工作根据文档,OpenCV的行为不正常。它在不打开窗口的情况下无限期地阻塞,有时会显示错误的图像。窗口关闭不是我的问题,尽管我会记得在下次工作时这样做。根据文档,OpenCV的行为不正常。它在不打开窗口的情况下无限期地阻塞,有时会显示错误的图像。