Magicode logo
Magicode
3 min read

【opecnv-python】cv2.imshow エラー対処法

https://cdn.apollon.ai/media/notebox/blob_qhRcpl2

opencvでよくエラーが出る話

エラーと無縁のプログラマーはおらず、日々エラーと奮闘しながら対処に望んでいるわけですが……
cv2.imshow()で頻繁にエラーが起きるため、備忘録も兼ねてcv2でのエラー原因とその対処法をまとめてみました。
  • エラー段階
    • 1.エラーメッセージを見た瞬間にわかるエラー
    • 2.プログラマーに非があるエラー
    • 3.プログラマーに非がないエラー
    • 4.対処法はわかるが原因不明のエラー(調査不足)

プログラマーに非があるエラー

python
import cv2 #0.つけ忘れ、及びpipで未インストール

image = "" #1.pathに間違いなきこと

img = cv2.imread(image) #2.変数への代入

cv2.imshow("title", img) #3.タイトルつけ忘れ

cv2.waitKey(0)             #4.これがないと即座にウインドウが閉じてしまいます
cv2.destroyAllWindows()
VScodeで書いていたら、あまりない失敗から、たまにしてしまう失敗
特に3,4ではちょくちょく問題やエラーを起こしてしまう。
また、pathに関しても日本語が混ざっているとエラーが起きるので気をつけたいところ
ただ、これらはエラーメッセージを見た瞬間に対処できたり、自身に非があるのでプログラムに問題はありません。(パスは合っているのにひらがな混じりがだめなのはバグでは?)
ですが、プログラムに問題がないのにうまくいかないことが多々あるのでそのケースと対処法がここからです。

コードに問題はないのにエラーが起きる――cv2.imshow()

タイトルをちゃんとつけて、パス周りも問題ない。
cv2もimshowまできっちり動作するのに、imshowではubuntuとか表示を出しつつエラーが出て動かない。
理由その1

numpyのバージョン

opencvをインストールすると自動的にnumpyもダウンロードされるのですが、アップデートする場合、
自動でnumpyをアップデートしてくれるわけではない。
これがcv2.imshowでのエラー原因となります。
C:\>pip install -U numpy
これで解決――する場合と、しない場合があります。
numpy
opencv-python
ともに最新版であるにも関わらず、どうしてもエラーが出たので、
新たに仮想環境を作成し、プログラムを走らせてみたところ、想定道理に起動しました。
やったね 嬉しいか?
理由その2

他のライブラリ存在そのもの

一応、本当に他のライブラリが原因か、Pythonがいかれてるかを試すために、
installしたpipすべてをuninstallすることに
C:\Magicode>pip freeze > requirements.txt
requirements.txtは慣習に則っただけで、実際はunintallするための下準備です。
またCドライブ直下では書き出せなかったため、magicodeフォルダーを作成し、その中に入れています。
中に、これまでinstallしてきたpip list & versionが出力されます。
C:\magicode>pip uninstall -y -r requirements.txt
一つuninstallするたびに(y/n)を聞いてくるため、-yを入れて、一旦全て綺麗にした後、
C:\>pip install opencv-python
他のライブラリーを必要としない場合、これだけでcv2.imshowは動くはずです(numpyは自動でインストールされる)
それからは、必要に応じたライブラリーを見直し、ダウンロードして行けば完了です。
気になるライブラリーがあれば、即座にダウンロード

最終的に放置
こうしてデタラメにライブラリーを増やしているとエラーが起きる――にしても、cv2.imshowは本当にエラーを吐きやすい気がする。

最後に反省

このようなことがよく起こるため、お試しでinstall環境と必須ライブラリーだけを固めた環境で分けるべきでしたね。
エラーが起きた時は、コードやパスの見直しも大事ですが、これまでとの環境の差が問題原因であることも多いため、皆様も運用にはぜひ気をつけてください。
これからの教訓を活かし、もうちょっとまともに仮想環境周りを考えて行こうかと
次回の記事が決まったな では!

Discussion

コメントにはログインが必要です。