web-dev-qa-db-ja.com

opencv.imshowはjupyterノートブックのクラッシュを引き起こします

私はグーグルまたはstackoverflowに関する他の質問をチェックします、彼らはスクリプトでcv2.imshowを実行することについて話しているが、私のコードはjupyterノートブックで実行されます。

私の設定は次のとおりです。

  1. ubuntu 16.4x64

  2. python 3.5

  3. opencv 3.1.0

Jupyter Notebookを起動します。Notebookに配置したコードは次のとおりです。

%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

17
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()
14
Ritu dhoot

私は同様の問題を抱えていましたが、Jupyter Notebookのcv2.imshow()で良い解決策を見つけることができませんでした。 このstackoverflow answer に従い、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()
7
mannyglover

そのシンプル。何が起こっているのかを理解する必要があります。

_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()は、現在存在するすべてのフレームを破棄します。

これで解決します。

4
Vivek Kumar

cv2.waitKey()のAPIドキュメント では、次のことに注意してください。

この関数は、イベントを取得して処理できる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
Saibot

Jupyterから開く新しいウィンドウは、ノートブックと同じカーネルを使用します。これをコードに追加するだけで問題なく動作します。

cv2.waitKey(0)
cv2.destroyAllWindows()
1
Abhinav Bangia

次のコードはJupyterで正常に機能し、1つの画像を表示します

%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