OpenCV imshow入門!waitKeyとdestroyAllWindowsも合わせて解説
はじめに:画像処理の世界への第一歩
コンピュータビジョンや画像処理の分野に足を踏み入れたとき、多くの人が最初に出会うライブラリが「OpenCV」です。OpenCV (Open Source Computer Vision Library) は、画像や動画の処理、解析、機械学習など、コンピュータビジョンに関する膨大な機能を提供する、非常に強力でオープンソースのライブラリです。Python、C++、Javaなど、さまざまな言語で利用できますが、特にPythonとの親和性の高さから、研究開発からホビープロジェクトまで幅広く活用されています。
さて、画像処理を学ぶ上で最も基本的かつ重要なことは何でしょうか?それは「画像を画面に表示して、自分の目で見ること」です。アルゴリズムを適用した結果がどうなったのか、正しく処理できているのかを確認するためには、画像の表示が不可欠です。
この記事では、OpenCVを使って画像を表示するための最も基本的な3つの関数、cv2.imshow()
、cv2.waitKey()
、そして cv2.destroyAllWindows()
に焦点を当て、その機能と使い方を徹底的に解説します。
「たかが画像を表示するだけだろう?」と思うかもしれません。しかし、この3つの関数は、単に画像を表示する以上の、深い役割と相互関係を持っています。特に cv2.waitKey()
は、多くの初心者がつまずきやすいポイントでありながら、OpenCVのGUI操作の「心臓部」とも言える重要な関数です。
なぜこの3つの関数は、常にセットで使われるのでしょうか?
– cv2.imshow()
: 画像を表示する「司令塔」
– cv2.waitKey()
: ウィンドウの描画を更新し、ユーザーからの入力を待つ「イベントマネージャー」
– cv2.destroyAllWindows()
: 使い終わったウィンドウを片付ける「清掃係」
この記事を読み終える頃には、あなたは以下のことを理解し、自在に操れるようになっているはずです。
- 画像を読み込み、ウィンドウに表示する方法
- 表示したウィンドウがすぐに消えてしまわないようにする方法
- 特定のキーが押されたらウィンドウを閉じる、といったインタラクティブな操作の実装方法
- 動画やWebカメラの映像をリアルタイムで表示する仕組み
- 複数のウィンドウを管理する方法
この記事は、PythonとOpenCVを学び始めたばかりの方を対象としています。さあ、OpenCVによる画像表示の基本をマスターし、コンピュータビジョンのエキサイティングな世界への扉を開きましょう。
1. 準備:OpenCVのインストールと画像の読み込み
まずは、画像を表示するための準備を整えましょう。OpenCVライブラリのインストールと、表示対象となる画像の読み込み方法について説明します。
1.1. OpenCVのインストール
Python環境にOpenCVをインストールするのは非常に簡単です。ターミナル(Windowsの場合はコマンドプロンプトやPowerShell)を開き、以下のpipコマンドを実行してください。
bash
pip install opencv-python
通常はこのパッケージで十分ですが、GUI機能や動画コーデックなど、より多くの機能が含まれた貢献(contrib)モジュールも同時にインストールしたい場合は、以下を実行します。
bash
pip install opencv-contrib-python
この記事の内容は、どちらのパッケージでも問題なく動作します。インストールが完了したら、Pythonのスクリプトやインタラクティブシェルで import cv2
と入力し、エラーが出なければ成功です。
1.2. 表示する画像の準備
練習用に、適当な画像ファイル(JPEGやPNGなど)を用意してください。もし手元にない場合は、インターネットで「フリー画像」などと検索してダウンロードしましょう。この記事では、cat.jpg
という名前の猫の画像が、実行するPythonスクリプトと同じディレクトリに保存されているものとして話を進めます。
1.3. cv2.imread()
: 画像をプログラムに読み込む
画像ファイルを表示するには、まずそのデータをプログラムのメモリ上に読み込む必要があります。その役割を担うのが cv2.imread()
関数です。
基本的な使い方
“`python
import cv2
‘cat.jpg’という名前の画像を読み込む
第1引数: ファイルパス
第2引数: 読み込みフラグ(後述)
image = cv2.imread(‘cat.jpg’, cv2.IMREAD_COLOR)
読み込みが成功したかどうかのチェック
if image is None:
print(“エラー: 画像ファイルを読み込めませんでした。パスを確認してください。”)
else:
print(“画像は正常に読み込まれました。”)
# imageは画像データを格納したNumPy配列
print(f”画像の形状 (高さ, 幅, チャンネル数): {image.shape}”)
print(f”画像のデータ型: {image.dtype}”)
“`
cv2.imread()
は、指定されたパスから画像を読み込み、その画像データをNumPy配列として返します。NumPyはPythonで数値計算を行うための非常に重要なライブラリであり、OpenCVでは画像はすべてこのNumPy配列として扱われます。
- 戻り値:
- 読み込みに成功した場合:画像データを格納したNumPy配列(通常は3次元配列
(高さ, 幅, チャンネル数)
)。 - 読み込みに失敗した場合(ファイルが存在しない、ファイルが破損しているなど):
None
を返します。
プログラムを書く際は、imread
の後に必ず if image is None:
のようなチェック処理を入れることを強くお勧めします。これにより、「画像がない」という単純なミスでプログラム全体がエラーで停止するのを防ぐことができます。
読み込みフラグ
第2引数では、画像をどのように読み込むかを指定できます。代表的なものは以下の通りです。
cv2.IMREAD_COLOR
(または1
): カラー画像として読み込みます。画像の透明度(アルファチャンネル)は無視されます。これがデフォルトの動作です。cv2.IMREAD_GRAYSCALE
(または0
): グレースケール(白黒)画像として読み込みます。cv2.IMREAD_UNCHANGED
(または-1
): アルファチャンネルを含む、画像が持つ全てのチャンネルをそのまま読み込みます。PNG画像などで透明度を扱いたい場合に使用します。
これで、画像を表示する準備が整いました。いよいよ本題の cv2.imshow()
に進みましょう。
2. cv2.imshow()
:画像表示の主役
cv2.imshow()
は、その名の通り、画像データ(NumPy配列)を受け取り、それを画面上のウィンドウに表示するための関数です。
2.1. 基本的な使い方
cv2.imshow()
は2つの引数を取ります。
python
cv2.imshow(window_name, image)
window_name
(第一引数): 表示するウィンドウに付ける名前を文字列で指定します。この名前はウィンドウのタイトルバーに表示され、後からそのウィンドウを操作するための識別子として機能します。例えば"My Image"
や"Result"
のように、分かりやすい名前を付けましょう。image
(第二引数): 表示したい画像データ、つまりcv2.imread()
で読み込んだNumPy配列を渡します。
では、先ほど読み込んだ画像を表示するコードを書いてみましょう。
“`python
import cv2
画像を読み込む
image = cv2.imread(‘cat.jpg’)
if image is not None:
# ‘Cat Image’ という名前のウィンドウに画像を表示
cv2.imshow(‘Cat Image’, image)
# この後の処理が重要 (後述)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print(“エラー: 画像ファイルを読み込めませんでした。”)
“`
このコードを実行すると、Cat Image
というタイトルのウィンドウが開き、猫の画像が表示されるはずです。しかし、ここで cv2.waitKey(0)
と cv2.destroyAllWindows()
をコメントアウトして実行すると、何が起こるでしょうか? おそらく、ウィンドウが一瞬だけ表示されてすぐに消えるか、あるいは全く表示されないかもしれません。これはなぜでしょうか?その答えは、次のセクションで解説する cv2.waitKey()
が握っています。
2.2. cv2.imshow()
の詳細な挙動
cv2.imshow()
のもう少し詳しい挙動を見ていきましょう。
- ウィンドウの自動生成:
imshow
を呼び出したとき、指定したwindow_name
のウィンドウがまだ存在しなければ、OpenCVは自動的に新しいウィンドウを生成します。 -
ウィンドウの更新: もし同じ
window_name
を持つウィンドウが既に存在する場合、imshow
は新しいウィンドウを作るのではなく、既存のウィンドウの表示内容を新しいimage
データで更新します。これは、動画やWebカメラの映像を連続的に表示する際の基本原理です。ループ処理の中でimshow
を繰り返し呼び出すことで、パラパラ漫画のように映像を表示できるのです。 -
対応するデータ型:
- 8ビット符号なし整数 (
uint8
): 最も一般的なデータ型です。ピクセルの各色の値が0(黒)から255(白/各色の最大輝度)の範囲で表現されます。imread
で読み込んだ画像は通常この形式です。 - 浮動小数点数 (
float32
やfloat64
): 画像処理の計算過程で、ピクセル値が0.0から1.0の範囲に正規化されることがあります。この形式の画像もimshow
で表示できます。ただし、値が0.0から1.0の範囲にあることが前提です。この範囲外の値は、0.0または1.0にクリップ(丸め込み)されて表示されます。例えば、値が2.5
であっても1.0
(白) として表示されます。意図しない表示になる場合は、表示前にデータ範囲を確認しましょう。
2.3. ウィンドウのプロパティと cv2.namedWindow()
imshow
はウィンドウを自動生成してくれますが、ウィンドウのプロパティ(例えば、サイズ変更を可能にするかどうか)を事前に細かく設定したい場合があります。そのために cv2.namedWindow()
関数が用意されています。
“`python
import cv2
‘Resizable Window’ という名前で、サイズ変更可能なウィンドウを事前に作成
cv2.namedWindow(‘Resizable Window’, cv2.WINDOW_NORMAL)
image = cv2.imread(‘cat.jpg’)
if image is not None:
# 事前に作成したウィンドウに画像を表示
cv2.imshow(‘Resizable Window’, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
“`
cv2.namedWindow()
の第2引数でフラグを指定します。
– cv2.WINDOW_AUTOSIZE
(デフォルト): ウィンドウサイズが画像サイズに固定され、ユーザーは変更できません。
– cv2.WINDOW_NORMAL
: ユーザーがマウスでウィンドウのサイズを自由に変更できるようになります。大きな画像全体を小さな画面で確認したい場合に便利です。
先に namedWindow
を呼び出しておくことで、ウィンドウの挙動をより細かく制御できます。
2.4. よくあるエラーとその原因
-
error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
:
このエラーは、OpenCVの内部で「画像の幅と高さが0より大きいこと」という条件が満たされなかったことを示しています。最も一般的な原因は、cv2.imread()
が画像の読み込みに失敗し、None
を返したにもかかわらず、そのNone
をcv2.imshow()
に渡してしまったことです。ファイルパスが間違っていないか、ファイルが破損していないかを確認し、前述のif image is None:
のチェックを必ず入れましょう。 -
ウィンドウが一瞬で消える、または表示されない:
これはcv2.waitKey()
がないために起こる現象です。次のセクションで詳しく解説しますが、imshow
はあくまで「表示する」という命令をキューに入れるだけで、実際にウィンドウを描画し、表示を維持するのはwaitKey
の役割です。
3. cv2.waitKey()
:イベント処理と待機のかなめ
cv2.waitKey()
は、OpenCVのGUI操作において最も重要であり、同時に最も誤解されやすい関数です。多くの入門書では「プログラムを一時停止する関数」と説明されますが、それはこの関数の役割の半分に過ぎません。
cv2.waitKey()
の真の役割は、以下の2つです。
- キーボード入力を待つ(Wait for a Key): その名の通り、指定された時間だけキーボードからの入力を待ち受けます。
- GUIイベントを処理する: これが非常に重要です。
cv2.imshow()
で要求されたウィンドウの描画や更新、その他GUIに関する内部的な処理は、cv2.waitKey()
が呼び出されたタイミングで初めて実行されます。この関数を呼ばないと、ウィンドウは表示されなかったり、「応答なし」の状態になったりします。
imshow
がディレクターで、waitKey
がステージマネージャーのような関係だと考えると分かりやすいかもしれません。ディレクターが「この役者(画像)を舞台(ウィンドウ)に出せ!」と指示しても、ステージマネージャーがGOサインを出さなければ、役者は舞台に現れることはできないのです。
3.1. 引数 delay
の意味
cv2.waitKey()
は、引数に delay
(遅延時間)をミリ秒単位で取ります。この値によって挙動が大きく変わります。
python
key = cv2.waitKey(delay)
delay > 0
の場合(例:cv2.waitKey(25)
):
指定したdelay
ミリ秒の間、キーボード入力を待ちます。- 時間内にキーが押された場合: そのキーのASCIIコード(整数値)を返して、すぐに次の処理に進みます。
- 時間内にキーが押されなかった場合:
-1
を返して、指定時間が経過した後に次の処理に進みます。
この動作は、動画再生でフレームレートを制御するのに最適です。例えば、30fps(1秒間に30フレーム)の動画を再生したい場合、1フレームあたりの表示時間は約33ミリ秒(1000ms / 30fps)です。while
ループの中で cv2.waitKey(33)
のように呼び出すことで、適切な速度で動画を再生しつつ、ユーザーからのキー入力(例: ‘q’キーで終了)も受け付けることができます。もし cv2.waitKey(1)
とすれば、可能な限り最速でフレームを更新しようとします。
delay = 0
またはdelay <= 0
の場合(例:cv2.waitKey(0)
):
キーボード入力があるまで無期限に待ち続けます。プログラムの実行は、ユーザーが何らかのキーを押すまで、この行で完全に停止します。静止画を1枚表示して、ユーザーが何かキーを押すまで待つ、という最も基本的な画像表示のシナリオで使われます。戻り値は、押されたキーのASCIIコードです。
3.2. 戻り値の活用:インタラクティブな操作
cv2.waitKey()
の戻り値を使うことで、プログラムをインタラクティブにすることができます。最も一般的なのは、「特定のキーが押されたらプログラムを終了する」という処理です。
“`python
import cv2
image = cv2.imread(‘cat.jpg’)
if image is not None:
cv2.imshow(‘Cat Image’, image)
# キー入力を待つ
key = cv2.waitKey(0)
# 押されたキーに応じて処理を分岐
if key == 27: # ESCキーのASCIIコードは27
print("ESCキーが押されたので、プログラムを終了します。")
elif key == ord('s'): # 's'キーが押された場合
# ord()は文字をASCIIコードに変換するPythonの組み込み関数
print("'s'キーが押されました。画像を保存します。")
cv2.imwrite('cat_saved.png', image)
else:
print(f"キーコード {key} が押されました。")
cv2.destroyAllWindows()
“`
この例では、waitKey(0)
でユーザーのキー入力を待ち、その戻り値を変数 key
に格納しています。
– もし key
が 27
(ESCキー) ならば、終了メッセージを表示します。
– もし key
が ord('s')
と一致するならば(つまりユーザーが’s’キーを押したならば)、画像を保存する処理を行います。
– ord()
関数は、文字をそのASCIIコード(整数)に変換する便利なPythonの標準関数です。
& 0xFF
というおまじない
動画処理のループなどで、以下のようなコードをよく見かけます。
“`python
動画再生ループ内
if cv2.waitKey(1) & 0xFF == ord(‘q’):
break
“`
この & 0xFF
は何でしょうか?これは、waitKey
の戻り値の下位8ビットだけを取り出すためのビット演算です。多くの環境では waitKey
は8ビットのASCIIコードをそのまま返しますが、特定の64ビット環境や、NumLockキーなどがONの場合に、上位ビットに余分な情報が付加されて返されることがあります。その場合、ord('q')
との単純比較が失敗してしまいます。& 0xFF
は、そのような環境差異を吸収し、確実に下位8ビットのASCIIコードのみを比較するための、一種の「お作法」や「定型句」として覚えておくと良いでしょう。
3.3. waitKey()
がないとどうなるか?(再確認)
もう一度、なぜ waitKey()
が不可欠なのかをまとめます。
cv2.imshow("window", img)
を呼び出しても、OpenCVは「”window”という名前のウィンドウにimgを表示する準備をしなさい」という命令をOSのGUIシステムに送るだけです。実際にウィンドウを描画し、ピクセルを画面に表示する処理は、GUIイベントループの中で行われます。
cv2.waitKey()
は、このGUIイベントループの処理をOpenCVに代行させる役割を担っています。この関数が呼び出されて初めて、溜まっていた描画命令が実行され、私たちの目にウィンドウと画像が見えるようになるのです。waitKey()
がないと、描画命令が実行される機会がなく、プログラムが一瞬で終了してしまうため、ウィンドウが見えなかったり、表示されても中身が描画されず真っ白なままになったりするのです。
4. cv2.destroyAllWindows()
:後片付けの作法
プログラムが終了するときには、作成したリソースを適切に解放するのが良いプログラミングの習慣です。cv2.imshow()
で作成したウィンドウもその一つです。
4.1. 基本的な役割
cv2.destroyAllWindows()
は、その名の通り、OpenCVによって作成されたすべてのGUIウィンドウを破棄し、閉じます。
“`python
import cv2
image = cv2.imread(‘cat.jpg’)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # グレースケールに変換
2つのウィンドウを表示
cv2.imshow(‘Color’, image)
cv2.imshow(‘Grayscale’, gray_image)
cv2.waitKey(0)
この1行で、’Color’と’Grayscale’の両方のウィンドウが閉じる
cv2.destroyAllWindows()
“`
この関数を呼び出すことで、プログラムが終了する際にウィンドウが画面に残り続けるのを防ぎ、関連するメモリリソースを解放します。
4.2. cv2.destroyWindow(window_name)
との違い
destroyAllWindows()
がすべてのウィンドウを閉じるのに対し、cv2.destroyWindow()
は引数で指定した名前のウィンドウだけを閉じます。
“`python
… (上のコードの続き)
cv2.waitKey(0)
‘Grayscale’ウィンドウだけを閉じる
cv2.destroyWindow(‘Grayscale’)
‘Color’ウィンドウはまだ表示されている状態で、再度キー入力を待つ
cv2.waitKey(0)
残りのウィンドウもすべて閉じる
cv2.destroyAllWindows()
“`
このように、アプリケーションのロジックに応じて、特定のウィンドウだけを閉じたい場合に destroyWindow()
を使います。
4.3. なぜ destroyAllWindows()
が必要か?
単純なスクリプトをコマンドラインから実行した場合、プログラムが終了すればOSが自動的にウィンドウを閉じてくれることも多く、この関数のありがたみを感じにくいかもしれません。
しかし、以下のような状況では、明示的にウィンドウを閉じることが非常に重要になります。
- Jupyter Notebook や Google Colab などのインタラクティブ環境: これらの環境では、セルを実行し終えてもカーネルは動き続けています。
destroyAllWindows()
を呼ばないと、ウィンドウがハングアップしたり、次のセルでimshow
を呼び出したときに予期せぬ動作をしたりする原因になります。 - 複雑なアプリケーション: 長時間実行されるアプリケーションや、GUIの表示/非表示を動的に切り替えるアプリケーションでは、不要になったウィンドウを適切に破棄しないと、メモリリーク(不要なメモリを確保し続ける問題)につながる可能性があります。
結論として、OpenCVでGUIウィンドウを使った後は、プログラムの最後に cv2.destroyAllWindows()
を呼び出すことを常に習慣づけておきましょう。これは、安全でクリーンなコードを書くための「お作法」です。
5. 実践的なサンプルコード
これまでに学んだ3つの関数を使った、典型的ないくつかのパターンを見ていきましょう。
パターン1:最もシンプルな画像表示
静止画を1枚表示し、何かキーが押されたら終了する、最も基本的なコードです。
“`python
import cv2
1. 画像の読み込み
img = cv2.imread(‘cat.jpg’)
読み込みチェック
if img is None:
print(“画像を読み込めませんでした。”)
else:
# 2. ウィンドウに画像を表示
# ウィンドウ名: ‘Image Display’
# 表示する画像: img
cv2.imshow(‘Image Display’, img)
# 3. キー入力を無期限に待つ
# これがないとウィンドウは一瞬で消える
# ユーザーが何かキーを押すと、プログラムが次に進む
cv2.waitKey(0)
# 4. すべてのウィンドウを閉じる
# 後片付け
cv2.destroyAllWindows()
“`
この「imread
→ imshow
→ waitKey(0)
→ destroyAllWindows
」の流れが、静止画表示の黄金パターンです。
パターン2:特定のキーでウィンドウを閉じる
ESCキーが押された場合のみウィンドウを閉じる、少しインタラクティブな例です。
“`python
import cv2
img = cv2.imread(‘cat.jpg’)
if img is not None:
cv2.imshow(‘Press ESC to close’, img)
while True:
# 無限にキー入力を待つ
key = cv2.waitKey(0)
# もし押されたキーがESC (ASCIIコード 27) ならループを抜ける
if key == 27:
break
cv2.destroyAllWindows()
``
while
この例ではループを使っていますが、静止画一枚の場合は
waitKey(0)を一回呼ぶだけでも十分です。この
while` ループの構造は、次の動画表示のパターンで真価を発揮します。
パターン3:動画ファイルからのフレーム表示
動画ファイル(例: movie.mp4
)を1フレームずつ読み込み、連続表示する例です。
“`python
import cv2
動画ファイルをキャプチャ
ファイルが存在しない場合、capは正しく初期化されない
cap = cv2.VideoCapture(‘movie.mp4’)
if not cap.isOpened():
print(“エラー: 動画ファイルを開けませんでした。”)
else:
while True:
# 1. 動画から1フレームを読み込む
# ret: 読み込みが成功したかどうかのブール値 (True/False)
# frame: 読み込まれたフレーム画像 (NumPy配列)
ret, frame = cap.read()
# 動画の終端に達したら、retはFalseになる
if not ret:
print("動画の再生が終了しました。")
break
# 2. フレームをウィンドウに表示
cv2.imshow('Video Player', frame)
# 3. 25ミリ秒待つ & キー入力を受け付ける
# 'q'キーが押されたらループを抜ける (再生を終了)
# 0xFFとのビットANDは環境互換性のためのお作法
if cv2.waitKey(25) & 0xFF == ord('q'):
break
4. リソースの解放
cap.release() # ビデオキャプチャを解放
cv2.destroyAllWindows() # すべてのウィンドウを閉じる
``
while
このコードの心臓部はループです。
cap.read()
1.で動画から1コマの画像(フレーム)を取り出します。
cv2.imshow()
2.でそのフレームを表示します。前回と同じ名前のウィンドウなので、内容は更新されます。
cv2.waitKey(25)
3.で約25ミリ秒(約40fps相当)だけ処理を止め、その間に
qキーが押されていないかチェックします。この短い待機時間が、動画を適切な速度で再生する役割と、ウィンドウの描画イベントを処理する役割の両方を担っています。
VideoCapture
4. ループの最後には、使い終わったオブジェクトを
cap.release()で解放し、
destroyAllWindows()` でウィンドウを閉じます。
パターン4:Webカメラからのリアルタイム表示
Webカメラからの映像を表示するのも、驚くほど簡単です。cv2.VideoCapture
の引数をファイル名からカメラのデバイスID(通常は 0
)に変えるだけです。
“`python
import cv2
デフォルトのWebカメラ (ID: 0) をキャプチャ
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print(“エラー: Webカメラを開けませんでした。”)
else:
while True:
# 1. Webカメラから1フレームを読み込む
ret, frame = cap.read()
if not ret:
break
# 2. フレームをウィンドウに表示
cv2.imshow('Webcam Live', frame)
# 3. 1ミリ秒待つ & 'q'キーで終了
if cv2.waitKey(1) & 0xFF == ord('q'):
break
4. リソースの解放
cap.release()
cv2.destroyAllWindows()
``
VideoCapture` という抽象化されたインターフェースのおかげで、入力ソースがファイルでもカメラでも同じように扱えるのがOpenCVの強力な点です。
コードの構造は動画ファイルの場合と全く同じです。
6. まとめ:三位一体の重要性
この記事では、OpenCVのGUI操作における最も基本的な3つの関数、cv2.imshow()
、cv2.waitKey()
、cv2.destroyAllWindows()
について、その役割と使い方を詳しく見てきました。
最後にもう一度、彼らの役割を振り返りましょう。
-
cv2.imshow(window_name, image)
: 画像を表示するための「司令塔」。どのウィンドウに、どの画像を表示するかを指示します。しかし、この命令だけではウィンドウは描画されません。 -
cv2.waitKey(delay)
: GUIの「心臓部」であり「イベントマネージャー」。この関数が呼び出されることで、初めてimshow
の命令が実行され、ウィンドウが描画・更新されます。同時に、指定された時間だけキー入力を待ち受け、プログラムをインタラクティブにするための鍵となります。単なる「待機」関数ではない、ということを決して忘れないでください。 -
cv2.destroyAllWindows()
: プログラムの「清掃係」。使用しなくなったすべてのウィンドウを閉じ、リソースを解放する重要な役割を担います。クリーンで安全なコードのための、締めくくりの「お作法」です。
この3つの関数は、まさに三位一体です。どれか一つが欠けても、OpenCVのGUIは正しく機能しません。静止画の表示から、動画やWebカメラのリアルタイムストリーミングまで、あらゆるビジュアルアプリケーションの基礎となるこの連携をしっかりと理解することが、OpenCVをマスターするための揺るぎない第一歩となります。
ここから先、あなたはマウス操作を検知する cv2.setMouseCallback
や、ウィンドウ上にスライダー(トラックバー)を追加する cv2.createTrackbar
など、より高度なGUI機能へと進んでいくことになるでしょう。そのすべての土台に、今回学んだ imshow
と waitKey
の関係性が存在します。
さあ、この知識を武器に、あなた自身のアイデアを形にする画像処理アプリケーションの開発を始めてみてください。コンピュータビジョンの世界は、あなたが思っている以上に広く、そして奥深いものです。