我在google或stackoverflow上检查其他问题,他们正在谈论在脚本中运行cv2.imshow,但我的代码在jupyter笔记本中运行。
这是我的配置:
ubuntu 16.4x64
python 3.5
opencv 3.1.0
我启动了一个jupyter笔记本:这是我把它放在笔记本上的代码:
%pylab notebook
import cv2
cvim2disp = cv2.imread('data/home.jpg')
cv2.imshow('HelloWorld', cvim2disp)
cv2.waitKey() #image will not show until this is called
cv2.destroyWindow('HelloWorld') #make sure window closes cleanly
当我执行这些代码时。图像将显示在弹出窗口中,但是我无法通过单击右上角的x关闭此窗口,片刻之后,系统会提示我窗口没有响应,它会给我2个选择:等待“,”退出“。如果我点击等待,那么它将在稍后显示相同的提示,如果我点击'退出',那么jupyter笔记本内核会死掉,我必须重新开始。
我谷歌周围,许多解决方案建议我应该添加此代码
cv2.startWindowThread()
在imshow
之前,但情况变得更糟,内核永远挂起!
任何人都知道发生了什么。
答案 0 :(得分:9)
%matplotlib inline
#The line above is necesary to show Matplotlib's plots inside a Jupyter Notebook
import cv2
from matplotlib import pyplot as plt
#Import image
image = cv2.imread("input_path")
#Show the image with matplotlib
plt.imshow(image)
plt.show()
答案 1 :(得分:3)
我遇到了类似的问题,在Jupyter笔记本电脑中使用cv2.imshow()
无法解决问题。我遵循this stackoverflow answer,只是使用matplotlib显示图像。
import matplotlib.pyplot as plt
# load image using cv2....and do processing.
plt.imshow(cv2.cvtColor(image, cv2.BGR2RGB))
# as opencv loads in BGR format by default, we want to show it in RGB.
plt.show()
答案 2 :(得分:3)
很简单。您需要了解正在发生的事情。
import cv2
cvim2disp = cv2.imread('data/home.jpg')
cv2.imshow('HelloWorld', cvim2disp)
cv2.waitKey(0)
cv2.destroyWindow('HelloWorld')
waitKey(0)
方法正在无限等待输入。当您看到相应图像的框架时,请勿尝试使用右上角的关闭来关闭图像。
请按一些键。 waitkey
方法会将其作为输入,并将返回一个值。此外,您还可以检查按下了哪个键来关闭框架。
另外,waitKey(33)
将使框架保持活动状态33 ms,然后自动将其关闭。
destroyWindow()
将破坏当前帧。
destroyAllWindows()
将破坏当前存在的所有帧。
这将解决。
答案 3 :(得分:2)
API documentation for cv2.waitKey()注意到以下内容:
此函数是HighGUI中唯一可以获取和处理事件的方法,因此需要定期调用它以进行正常事件处理,除非在负责事件处理的环境中使用HighGUI。
所以也许在无限循环中调用函数会使窗口响应?我还没有对此进行过测试,但也许你想尝试以下方法:
import cv2
cvim2disp = cv2.imread('data/home.jpg')
cv2.imshow('img', cvim2disp)
while(True):
k = cv2.waitKey(33)
if k == -1: # if no key was pressed, -1 is returned
continue
else:
break
cv2.destroyWindow('img')
答案 4 :(得分:1)
从Jupyter打开的新窗口使用与Notebook相同的内核。只需将以下代码添加到代码中,即可正常工作。
cv2.waitKey(0)
cv2.destroyAllWindows()
答案 5 :(得分:1)
image = cv2.imread(file_path)
while True:
# Press 'q' for exit
exit_key = ord('q')
if cv2.waitKey(exit_key) & 255 == exit_key:
cv2.destroyAllWindows()
break
cv2.imshow('Image_title', image)
答案 6 :(得分:1)
如果你在 google collab 中遇到问题,你可以使用这个补丁
from google.colab.patches import cv2_imshow
cv2_imshow(img)
答案 7 :(得分:0)
以下代码在Jupyter中可以正常显示一张图片
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
cap = cv2.VideoCapture(videoFName)
ret, image = cap.read()
image=cv2.resize(image,None,fx=0.25,fy=0.25,interpolation=cv2.INTER_AREA)
plt.imshow(image)
plt.show()
如果要在单独的窗口中显示视频而不是图像,请使用以下代码:
import cv2
cap = cv2.VideoCapture(videoFName)
while cap.isOpened():
ret, image = cap.read()
image=cv2.resize(image,None,fx=0.25,fy=0.25,interpolation=cv2.INTER_AREA)
cv2.imshow('image',image)
k = cv2.waitKey(30) & 0xff # press ESC to exit
if k == 27 or cv2.getWindowProperty('image', 0)<0:
break
cv2.destroyAllWindows()
cap.release()
确保窗口名称匹配,否则将不起作用。在这种情况下,我使用“图像”作为窗口名称。
答案 8 :(得分:-1)
我不确定您是否可以从Jupyter Notebook打开一个窗口。 cv2.imshow期望一个在Jupyter中不起作用的waitKey。
这是我所做的(使用OpenCV 3.3):
from IPython.display import display, HTML
import cv2
import base64
def imshow(name, imageArray):
_, png = cv2.imencode('.png', imageArray)
encoded = base64.b64encode(png)
return HTML(data='''<img alt="{0}" src="data:image/png;base64, {1}"/>'''.format(name, encoded.decode('ascii')))
img = cv2.imread('./media/baboon.jpg',cv2.IMREAD_COLOR)
imshow('baboon', img)
如果您不需要使用cv2,只需:
from IPython.display import Image
Image('./media/baboon.jpg')