it-swarm.com.ru

opencv.imshow вызовет сбой ноутбука jupyter

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

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

  1. ubuntu 16,4x64

  2. питон 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 варианта: " подождите "," прежде чем выйти ". если я нажму «подождать», то позже появится тот же запрос. Если я нажму «до выхода», то ядро ​​ноутбука jupyter умрет, и я должен начать все сначала.

Я гуглю, многие решения предлагают мне добавить этот код 

cv2.startWindowThread()

до imshow, но ситуация ухудшается, ядро ​​зависает навсегда !. Кто-нибудь знает, что происходит.

Вот картинка моей ошибки:  enter image description here

10
scott huang
%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()
7
Ritu dhoot

У меня была похожая проблема, и я не смог найти хорошее решение с помощью cv2.imshow() в Jupyter Notebook. Я следовал этот ответ от stackoverflow , просто используя 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()
3
mannyglover

Это просто. Вам нужно понять, что происходит.

import cv2
cvim2disp = cv2.imread('data/home.jpg')
cv2.imshow('HelloWorld', cvim2disp)
cv2.waitKey(0) 
cv2.destroyWindow()

метод waitKey (0) ожидает ввода бесконечно. Когда вы видите рамку соответствующего изображения, не пытайтесь закрыть изображение с помощью кнопки «Закрыть» в верхнем правом углу. 

Вместо этого нажмите какую-нибудь клавишу. Метод waitkey примет это как ввод и вернет обратно значение. Далее вы также можете проверить, какая клавиша была нажата, чтобы закрыть рамку.

Кроме того, waitKey (33) будет держать кадр активным в течение 33 мс, а затем автоматически его закроет.

destroyWindow () уничтожит текущий кадр, если там . destroyAllWindows () уничтожит все существующие в данный момент кадры.

Это решит.

1
Vivek Kumar

Документация 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')
1
Saibot

Следующий код прекрасно работает в 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()

Убедитесь, что имя окна совпадает, иначе оно не будет работать. В этом случае я использую «изображение» в качестве имени окна.

0
Kardi Teknomo