OpenCVでBmpやJpegなどの画像ファイルを開くには、imread関数を用います。
開いた画像データはimshow関数でウィンドウ付きで画像を表示します。
実際に画像が表示されるのは、waitKey関数が呼ばれたタイミングとなります。
以下に最もシンプルなサンプルを示します。
import cv2
# 画像ファイルの読み込み(カラー画像(3チャンネル)として読み込まれる)
img = cv2.imread("Mandrill.bmp")
# 画像の表示
cv2.imshow("Image", img)
# キー入力待ち(ここで画像が表示される)
cv2.waitKey()
(実行結果)
ここに示したサンプルでは、画像データは必ず8bit x 3ch のデータとなり、表示されたウィンドウはリサイズすることができません。
そのようにしないためには、各関数のオプションを設定します。
詳細は、各関数ごとに説明します。
imread()
bmp, jpeg, png, tiff などの画像ファイルを開きます。
cv2.imread( filename[, flags] ) -> retval
引数 | 説明 |
filename | 画像のファイル名を指定します。 ただし、日本語は使えません。 |
flags | ファイルを開く際に、カラーデータとして開くか?モノクロデータとして開くか?などを指定します。 指定しない場合、カラーデータ(BGRの3チャンネル)として画像ファイルを開きます。 cv2.IMREAD_UNCHANGED 画像ファイルのフォーマットのまま、画像ファイルを開きます。 cv2.IMREAD_GRAYSCALE グレースケールに変換して画像ファイルを開きます。 cv2.IMREAD_COLOR カラーデータ(BGRの3チャンネル)に変換して画像ファイルを開きます。 cv2.IMREAD_ANYDEPTH 画像ファイルのビット深度のまま画像ファイルを開きます。 cv2.IMREAD_ANYCOLOR 画像ファイルの色(チャンネル数)のまま画像ファイルを開きます。(参考)ImreadModes |
戻り値 | 画像の輝度値がnumpyのndarray配列に格納されて返されます。 画像データは画像の左上から格納されています。 グレースケールの場合、[高さ, 幅]の二次元配列になります。 カラーの場合、[高さ, 幅, 色]の三次元配列になります。色の順番は、B,G,R,B,G,R・・・の順で格納されています。 |
画像ファイル名に日本語ファイルを使いたい場合は、NumPyやPillowを使って日本語ファイルを読み込む事も可能です。詳細は以下のページを参照ください。
また、imread()関数では、画像ファイルが見つからない場合など、画像ファイル読み込み時にエラーが発生しがちです。その場合の対応は以下のページを参照ください。
(参考)
https://docs.opencv.org/4.5.5/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56
imshow()
画像をウィンドウ付きで表示します。
実際に画面に画像が表示されるのは、cv2.waitKey()関数が呼ばれたタイミングで表示されます。
cv2.imshow( winname, mat ) -> None
引数 | 説明 |
winname | 表示するウィンドウのタイトルを指定します。 namedWindow()関数で作成したウィンドウと同じwinnameを指定することで、画像を表示するウィンドウを切り替えることもできます。 winnameで指定したウィンドウが無い場合、新しいウィンドウで画像を表示します。 日本語を指定すると文字化けします。 |
mat | 表示する画像データを指定します。 |
戻り値 | なし |
(参考)
https://docs.opencv.org/4.5.5/d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563
waitKey()
指定時間(mSec)分、キー入力を待ちます。
OpenCVで生成したウィンドウのキー入力イベント待ちとなります。
引数 | 説明 |
delay | キー入力までの待ち時間をmSec単位で指定します。 値を省略、もしくは 0以下 を指定した場合、無限待ちとなります。 |
戻り値 | 入力したキーコードが戻されます。 |
(参考)
https://docs.opencv.org/4.5.5/d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7
namedWindow()
imshow()関数で表示するためのウィンドウを生成します。
cv2.namedWindow( winname[, flags] ) -> None
引数 | 説明 |
winname | 表示するウィンドウのタイトルを指定します。 日本語を指定すると文字化けします。 |
flags | ウィンドウのリサイズに関する設定を指定します。 cv2.WINDOW_NORMAL リサイズ可能なウィンドウを生成します。 表示されている画像はウィンドウサイズに合わせてリサイズされます。 cv2.WINDOW_AUTOSIZE 画像のサイズに合わせてウィンドウサイズを調整します。 ウィンドウのリサイズはできません。 他に cv2.WINDOW_FREERATIO, cv2.WINDOW_KEEPRATIO, cv2.WINDOW_GUI_NORMAL, cv2.WINDOW_GUI_EXPANDED の設定がありますが、少なくともWindows環境ではcv2.WINDOW_NORMALと同じ (参考)WindowFlags |
戻り値 | なし |
生成したウィンドウはdestroyWindow()関数で指定したウィンドウを削除するか、destroyAllWindows()関数で全てのウィンドウを削除するようにします。
(参考)
https://docs.opencv.org/4.5.5/d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b
destroyWindow()
ウィンドウタイトル名を指定してウィンドウを閉じます。
cv2.destroyWindow( winname ) -> None
引数 | 説明 |
winname | 閉じるウィンドウのタイトルを指定します。 |
戻り値 | なし |
(参考)
https://docs.opencv.org/4.5.5/d7/dfc/group__highgui.html#ga851ccdd6961022d1d5b4c4f255dbab34
destroyAllWindows()
表示されているウィンドウ全てを閉じます。
cv2.destroyAllWindows() -> None
(参考)
https://docs.opencv.org/4.5.5/d7/dfc/group__highgui.html#ga6b7fc1c1a8960438156912027b38f481
各種設定を行ったサンプルプログラム
import cv2
# 画像ファイルの読み込み(ファイルフォーマットのまま読み込み)
img1 = cv2.imread("Mandrill.bmp", cv2.IMREAD_UNCHANGED)
img2 = cv2.imread("Text.bmp", cv2.IMREAD_UNCHANGED)
# リサイズ可能なウィンドウの作成
cv2.namedWindow("Image1", cv2.WINDOW_NORMAL)
cv2.namedWindow("Image2", cv2.WINDOW_NORMAL)
# 画像の表示
cv2.imshow("Image1", img1)
cv2.imshow("Image2", img2)
# キー入力待ち(ここで画像が表示される)
cv2.waitKey()
# すべて全てのウィンドウを削除
cv2.destroyAllWindows()
(実行結果)