はじめに
最近、画像認識・機械学習のアルゴリズム開発にscikit-learn, scikit-image, pytorch, tensorRTなどを使っているせいか、OpenCVの機能を使ってコーディングする機会が減っている。
使っている機能
- cv2.imread()
- cv2.imwrite()
- cv2.imshow()
- cv2.VideoCapture()
- cv2.VideoWriter()
opencv のうれしくない点
- opencv はBGR の順序となっているためにRGBを想定しているライブラリとの相性が良くない。
- Unicode 文字列の描画をサポートしていない。
opencv がらみの心配
どのwhl を入れたらいいのか
- opencv-python
- opencv-contrib-python
- opencv-python-headless
- opencv-contrib-python-headless
headlessを利用する場合
- imshowなどのGUIを必要としない場合に選ぶ。
- opencv-python と opencv-python-headless が同時に含まれている状況を作ってはならない。
どちらか一つを残すこと。 - GUIが不要な場合: opencv-python-headless
- GUIが必要な場合: opencv-python
opencv-contrib-pythonを利用する場合
- https://github.com/opencv/opencv_contrib にあるmoodules を利用する場合に選択する。
他のライブラリとの適合性の問題
- numpy
- scikit-learn
- 他の商用ライブラリ
OpenCVへの依存ライブラリが多いので、循環import問題を生じやすくなっている。
OpenCVへの依存ライブラリ、Numpyへの依存ライブラリが多いので、許容されるバージョンの組合せが少なくなる問題。
他のライブラリ
imageio
- imageio.imread()
- imageio.imwrite()
np.ndarray 型の戻り値です。
画像の表示はない。
scikit-image
https://scikit-image.org/docs/stable/api/skimage.io.html
imread()
imsave()
np.ndarray 型の戻り値です。
scikit-imageのうれしいところ
- 画像のnp.float での処理をサポートしている点
- dtype=np.float 型での演算や画像の表示機能が充実しているので、opencv ではできない処理もできることが多い。
PIL Image(pillow)
読み込んだあとのデータ形式がnp.ndarray型にとは異なるライブラリです。
テキストの画像への書き込むがASCIIの範囲に限らない。
現状の私の指針
-
scikit-image, imageio, Pillow のいずれかをimport しているプロジェクトで、画像ファイルのIOにしか用いていない状況では、OpenCVを使わない。
imageIOはPillowを利用する。scikit-imageはimageIOを利用する。
そのため、imageIOのimreadを使った方が、OpenCVを追加しない分だけ簡潔になる。 -
動画ファイル、GStreamerを用いているときは、必ずOpenCVを使う。
-
それ以外の適切なライブラリを知らない。
追記:
def some_func(img: np.ndarry) -> np.ndarray:
とは書かず、
def some_func(rgb_img: np.ndarry) -> np.ndarray:
もしくは
def some_func(bgr_img: np.ndarry) -> np.ndarray:
と書くように心がけている。