🫠
UbuntuのPython仮想環境venvでcv2.imshowが表示されない件(エラーログも表示されない)
はじめに
UbuntuのPython仮想環境venvでcv2.imshowが表示されない件(エラーログも表示されない)について調べたので、そのメモです。
(タイトルは参考URLと同じにさせて頂きました。というのも、cv2.imshow関連で検索した場合、大抵cv2.waitKey()
を書き忘れてる件ばかりがヒットするからです。このタイトルが一番しっくりきました。)
参考
以前からPythonの仮想環境中でopenCVを使うときに、cv2.imshowが表示されないことがありました。
その場合、pyenvでPythonのバージョンを変更すると表示されるようになる場合があり、しかしそれも再現性がなく困っていました。
仕方がないので、PySimpleGUIを使って画像を表示するようにしていました。
PySimpleGUIは非常に使い勝手が良いのですが、処理が重くなるのが難点です。
この図はSSD(Single Shot Multibox Detector)を実装し、snakeviz
で可視化したときのものです。
全体の処理のうち、
処理を軽くしようと努力してるのに、PySimpleGUIのせいで処理が重くなっているのは悲しいです。
ということで重い腰を上げ、cv2.imshowが表示されない問題を解決することにしました。
環境
Python 3.8.10 (default, May 26 2023, 14:05:08)
$ inxi -SCGxx --filter
System: Kernel: 5.15.0-78-generic x86_64 bits: 64 compiler: N/A Desktop: Gnome 3.36.9 wm: gnome-shell dm: GDM3
Distro: Ubuntu 20.04.6 LTS (Focal Fossa)
CPU: Topology: Quad Core model: AMD Ryzen 5 1400 bits: 64 type: MT MCP arch: Zen rev: 1 L2 cache: 2048 KiB
flags: avx avx2 lm nx pae sse sse2 sse3 sse4_1 sse4_2 sse4a ssse3 svm bogomips: 60797
Speed: 3800 MHz min/max: N/A Core speeds (MHz): 1: 3800 2: 3800 3: 3800 4: 3800 5: 3800 6: 3800 7: 3800 8: 3800
Graphics: Device-1: NVIDIA TU116 [GeForce GTX 1660 Ti] vendor: Micro-Star MSI driver: nvidia v: 525.85.12 bus ID: 08:00.0
chip ID: 10de:2182
Display: x11 server: X.Org 1.20.13 driver: fbdev,nouveau unloaded: modesetting,vesa compositor: gnome-shell
resolution: 2560x1440~60Hz
OpenGL: renderer: NVIDIA GeForce GTX 1660 Ti/PCIe/SSE2 v: 4.6.0 NVIDIA 525.85.12 direct render: Yes
結論
- Python仮想環境から、opencv-pythonをアンインストール
- aptにて、python3-opencvをインストール
- openCVのライブラリパスを取得し、sys.pathに追加
それぞれの手順を説明します。
- Python仮想環境から、opencv-pythonをアンインストール
$ pip uninstall opencv-python
- aptにて、python3-opencvをインストール
$ sudo apt install python3-opencv
- openCVのライブラリパスを取得し、sys.pathに追加
- openCVのライブラリパスを取得
$ python3 Python 3.8.10 (default, May 26 2023, 14:05:08) [GCC 9.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> print(cv2) <module 'cv2' from '/usr/lib/python3/dist-packages/cv2.cpython-38-x86_64-linux-gnu.so'>
- sys.pathに追加
import sys sys.path.append('/usr/lib/python3/dist-packages') import cv2
参考URLには「opencvのソースコードを取得してビルドする」という過程がありますが、その必要はありませんでした。
cv2.imshow()を使用する場合には、上記のようにsys.pathに追加すればよいようです。
以上です。ありがとうございました。
Discussion