@nobu6787 (nobunobuta)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

opencvでつまづいてます!

こんにちは。今回vscodeでopencvを利用して画像処理を行おうと思うのですが、処理実行したところ、画像は表示されるものの、処理は終了しません。 Macを利用しています。

尚、Python実践データ分析100本ノックのノック81を参照しております。
コードは、

import cv2
img = cv2.imread("img/img01.jpg")
height, width = img.shape[:2]
print("画像幅: " + str(width))
print("画像高さ: " + str(height))
cv2.imshow("img",img)
cv2.waitKey(0)

です。

カーネルは、

base(Python 3.9.10) ~/opt/miniconda3/bin/python

です。

Conda list で確認したところ、

opencv 4.5.5 py39h6e9494a_0 conda-forge

となっていることから、opencvもインストールされているとの認識です。

また、ネットで解決方法を確認したところ、コマンドパレットから
[Jupyter: Create New Blank Notebook]コマンドを実行して、jupyter notebook を利用するよう解説しているサイトが複数あったのですが、[Jupyter: Create New Blank Notebook]を入力しても、コマンドパレットの検索結果に表示されませんでした。

現状、私の置かれている状況がどのような状況で、それをどのように解決できるか宜しければ教えて下さい。
尚、投稿が初めてで至らない部分が多いと思いますが、
よろしくお願いいたします。

0 likes

2Answer

画像は表示されるものの、処理は終了しません。

画像が表示されたウィンドウがアクティブな状態で(最前面にある状態で)何かしらのキーを押下すると処理が終了すると思いますが、試してみていただけますか?

cv2.waitKey はキーの押下を待つ関数で、戻り値として押下されたキーを返します。また、引数で待つ時間を指定できますが、当該コードでは0(=無限に待つ)となっています。

参考

0Like

Comments

  1. @nobu6787

    Questioner

    ご返答ありがとうございます!ただ、私の認識が間違っているのか、最前面の状態でキーを押しても特段反応なく処理が続いてしまいます。
    その後、処理の容量が大きいことが原因と考え、GPUが利用できるColaboratoryで同様の作業を行ってみたところ、

    from google.colab import drive
    drive.mount('/content/drive')
    →Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).

    drive.mount("/content/drive", force_remount=True)
    →Mounted at /content/drive

    import cv2
    img = cv2.imread("img01.jpg")
    height, width = img.shape[:2]
    print("画像幅: " + str(width))
    print("画像高さ: " + str(height))
    cv2.imshow("img",img)
    cv2.waitKey(0)
    →AttributeError Traceback (most recent call last)
    <ipython-input-6-3250cb22ad22> in <module>()
    1 import cv2
    2 img = cv2.imread("img01.jpg")
    ----> 3 height, width = img.shape[:2]
    4 print("画像幅: " + str(width))
    5 print("画像高さ: " + str(height))
    AttributeError: 'NoneType' object has no attribute 'shape'

    となってしまい、画像が読み込めなくなってしまいました。
    尚、img = cv2.imread("img01.jpg")については、imgフォルダを作らなかったので、
    img = cv2.imread("img/img01.jpg")としませんでした。

    考える方向が間違っていってしまっているかも知れませんが、引き続きご指導いただけたら幸いです。宜しくお願いします。
  2. Jupyter NotebookやColaboratoryではなく、ターミナルからスクリプトファイルを実行してみてください。 `cv2.imshow` はGUIのウィンドウを作ろうとするので、Jupyter NotebookやColaboratoryのような環境では正常に動作しません。
  3. Jupyter NotebookやColaboratoryで画像を表示したい場合は、他のパッケージを使う必要がありそうです。例えば次の記事が参考になります。

    OpenCVを用いて、Jupyter Notebook上で画像を表示させたい(mac) - Qiita
    https://qiita.com/narumi-github/items/63715853394bd4d110d6

次のようにして正常に動作することを確認しました。

環境

  • macOS Big Sur 11.6.4
  • Python 3.9.10
  • opencv-python 4.5.5

手順

% cd
% mkdir qiita_3ad5434e0b34e21ab8fb  # 作業用の適当なディレクトリを作成
% cd qiita_3ad5434e0b34e21ab8fb
% touch sample.py
# 【その後sample.pyを編集する。内容は以降に記載】
% mkdir img

# 【ディレクトリimg以下に、適当なjpgファイルを保存。ファイル名はimg01.jpg】

# 実行
% python sample.py
sample.py
# 質問本文に記載されたコードそのままです
import cv2
img = cv2.imread("img/img01.jpg")
height, width = img.shape[:2]
print("画像幅: " + str(width))
print("画像高さ: " + str(height))
cv2.imshow("img",img)
cv2.waitKey(0)
0Like

Comments

  1. @nobu6787

    Questioner

    ご指導頂いたコードで正常に動作しました!
    大変参考になりました。
    ありがとうございます!

Your answer might help someone💌