【Python】OpenCVで画像の読み込み、GUIでの表示をしてみた

2021.02.28

こんにちは、CX事業本部の若槻です。

画像処理ライブラリであるOpenCVを使うことにより、画像データに対して変換や物体検出などの処理を行ったり、これらの処理を機械学習を適用して行ったりすることができます。

今回はOpenCVの基本的な使い方として、画像ファイルを読み込んでウィンドウでGUI表示する方法を確認してみました。

環境、インストール

Mac Book Pro上で動作を確認しました。

% sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H15

言語はPythonを使用しました。

% python -V
Python 3.8.6

pipでOpenCVをインストールしました。

% pip install opencv-python

OpenCVのバージョンは4.5.1です。

% python 
Python 3.8.6 (default, Oct  8 2020, 14:06:32) 
[Clang 12.0.0 (clang-1200.0.32.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.5.1'

やってみる

ローカルに用意したjpg画像ファイルcoins.jpgを対象に確認してみます。

画像ファイルの読み込み

画像ファイルの読み込みはimread()を使用します。引数にファイル名とImreadModesフラグを指定すると画像データをMat型として返すメソッドです。

ファイル名のみを指定すると画像がカラーで読み込まれます。

>>> img_color = cv2.imread('coins.jpg')

第2引数のフラグに0(=cv2.IMREAD_GRAYSCALE)を指定すると画像がグレースケールで読み込まれます。

>>> img_gray = cv2.imread('coins.jpg', cv2.IMREAD_GRAYSCALE)

画像のGUI表示

画像(Matデータ)のGUI表示はimshow()を使用します。引数にGUIのウィンドウ名とMatデータを指定すると画像をウィンドウ上で表示できます。

ただしimshow()を実行するだけでは画像は表示されず、合わせてwaitKey()を実行する必要があります。これにより表示されるウィンドウがキー入力を待ち受けする状態で表示されます。引数には待受時間をミリ秒で指定しますが、0を指定することにより無限に待ち受けさせることもできます。

imshow()に続けてwaitKey(0)を実行します。

>>> cv2.imshow('color', img_color) #この時点ではウィンドウは表示されない
>>> cv2.waitKey(0) #ここで初めてウィンドウが表示される

するとウィンドウで画像(カラーで読み込んだ方)がGUI表示されました。またwaitKey(0)コマンドを実行したプロンプトは待受状態となっています。

待受状態であればウィンドウをマウス操作で移動させたりサイズを変えたりすることができます。

ウィンドウ画面がアクティブな状態で何らかのキーを入力すると、プロンプトの待受状態が終了します。そして(画像からは分かり辛いですが)ウィンドウにマウスオーバーをするとBusy状態(カーソルがぐるぐる)となります。

そしてこの状態であればプロンプトが次のコマンドを受け付けられるので、下記のようにして別のウィンドウで画像を表示させることもできるようになります。

>>> cv2.imshow('gray', img_gray)
>>> cv2.waitKey(0)

カラー画像に加えてグレースケール画像がウィンドウでGUI表示できました。もちろん待受状態であればいずれのウィンドウも移動やサイズ変更させられます。

GUI表示を終了する

GUI表示の終了はdestroyWindow()でウィンドウを閉じて行います。引数にウィンドウ名を指定します。

先程のグレースケール画像の表示ウィンドウ名grayを指定してdestroyWindow()を実行し、続けてwaitKey(1)を実行して待受状態をすぐに終了するようにします。

>>> cv2.destroyWindow('gray') #この時点ではウィンドウは消えない
>>> cv2.waitKey(1) #ここで初めてウィンドウが消える
-1
>>>

引数で指定した画像の表示ウィンドウを終了させられました。

また、destroyAllWindows()を使えばすべてのウィンドウを一括で終了させることができます。

>>> cv2.destroyAllWindows()
>>> cv2.waitKey(1)
-1
>>>

GUI表示を終了する際の注意点

destroyWindow()destroyAllWindows()のあとに実行するwaitKey()の引数を0や無しとすると、「ウィンドウは閉じられるがウィンドウがキー入力を無期限に待ち続ける」という状態となり、プロンプトも待受け状態のまま何のキー入力も受け付けなくなる(場合がある)ためシェルなどのプロセスごと終了せざるを得なくなるので注意してください。

>>> cv2.destroyAllWindows()
>>> cv2.waitKey()

おわりに

OpenCVの基本的な使い方として、画像ファイルを読み込んでウィンドウでGUI表示する方法を確認してみました。

画像を表示させるためにwaitKey()の実行が必要だというのは少し戸惑いましたが、OpenCVは画像データから物体検出を簡単に行うことができるとても便利なライブラリなので使いこなしていきたいです。

参考

以上