opencv.imshow приведет к сбою ноутбука jupyter

Я проверяю другой вопрос на google или stackoverflow, они говорят о запуске cv2.imshow в скрипте, но мой код работает в ноутбуке jupyter.

Вот моя конфигурация:

  1. ubuntu 16.4x64

  2. python 3.5

  3. 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')