opencv.imshow приведет к сбою ноутбука jupyter
Я проверяю другой вопрос на 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 варианта: wait "," fore quit ". если я нажму на ожидание, тогда он покажет одно и то же сообщение позже. Если я ударил "fore quit", тогда ядро jupyter ноутбука умрет, и я должен начать все сначала.
Я google вокруг, многие решения предлагают мне добавить этот код
cv2.startWindowThread()
до imshow
, но ситуация ухудшается, ядро висит навсегда !. кто-нибудь знает, что происходит.
Вот моя ошибка: ![enter image description here]()
Ответы
Ответ 1
%matplotlib inline
#The line above is necesary to show Matplotlib 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()
Ответ 2
У меня была похожая проблема, и я не смог найти хорошее решение с cv2.imshow()
в Jupyter Notebook. Я следовал fooobar.com/questions/1248540/..., просто используя matplotlib для отображения изображения.
import matplotlib.pyplot as plt
# load image using cv2....and do processing.
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# as opencv loads in BGR format by default, we want to show it in RGB.
plt.show()
Ответ 3
Документация API для 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
Это просто. Вам нужно понять, что происходит.
import cv2
cvim2disp = cv2.imread('data/home.jpg')
cv2.imshow('HelloWorld', cvim2disp)
cv2.waitKey(0)
cv2.destroyWindow('HelloWorld')
waitKey(0)
ожидает ввода бесконечно. Когда вы видите рамку соответствующего изображения, не пытайтесь закрыть изображение с помощью кнопки "Закрыть" в верхнем правом углу.
Вместо этого нажмите какую-нибудь клавишу. Метод waitkey
примет это как вход и вернет обратно значение. Далее вы также можете проверить, какая клавиша была нажата, чтобы закрыть рамку.
Кроме того, waitKey(33)
будет держать кадр активным в течение 33 мс, а затем автоматически его закроет.
destroyWindow()
уничтожит текущий кадр, если он есть. destroyAllWindows()
уничтожит все имеющиеся в настоящее время кадры.
Это решит.
Ответ 5
Новое окно, которое открывается из Jupyter, использует то же ядро, что и ноутбук. Просто добавьте это ниже к коду, и он будет работать нормально.
cv2.waitKey(0)
cv2.destroyAllWindows()
Ответ 6
Следующий код прекрасно работает в 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()
Убедитесь, что имя окна совпадает, иначе оно не будет работать. В этом случае я использую "изображение" в качестве имени окна.
Ответ 7
Я не уверен, что вы можете открыть окно из ноутбука Jupyter. cv2.imshow ожидает waitKey, который не работает в Jupyter.
Вот что я сделал (используя 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')