Cv2.ImShow は、Mat に格納した画像をウィンドウに表示する関数です。デバッグから結果確認まで、OpenCV 開発で最も頻繁に使います。最小の呼び出しは以下の1行です。
Cv2.ImShow("window", mat);
ただし、Cv2.WaitKey を呼ばないとウィンドウがすぐに閉じる(または表示されない)ため、必ずセットで使います。
動作環境
| 項目 | バージョン |
|---|---|
| OpenCV | 4.x(OpenCV 4.x 時点の API) |
| OpenCvSharp4 | 4.x(NuGet) |
| OpenCvSharp4.runtime.win | 4.x(NuGet・Windows 実行時に必須) |
| .NET | .NET 8 コンソールアプリ |
NuGet パッケージを2つインストールしてください。
dotnet add package OpenCvSharp4
dotnet add package OpenCvSharp4.runtime.win
基本の使い方
using OpenCvSharp;
// 画像ファイルを読み込む
using var mat = Cv2.ImRead("sample.jpg", ImreadModes.Color);
if (mat.Empty())
{
Console.WriteLine("画像の読み込みに失敗しました。");
return;
}
// ウィンドウに表示する
Cv2.ImShow("Sample Image", mat);
// キー入力待ち(0 = 無制限に待つ)
Cv2.WaitKey(0);
// ウィンドウを閉じる
Cv2.DestroyAllWindows();
実行結果
sample.jpg の内容がタイトル「Sample Image」のウィンドウに表示されます。任意のキーを押すとウィンドウが閉じてプログラムが終了します。
行ごとの解説
| 行 | 説明 |
|---|---|
Cv2.ImRead(...) |
画像ファイルを Mat に読み込む。using で確実に解放する |
mat.Empty() |
読み込み失敗チェック。必ず入れる |
Cv2.ImShow("Sample Image", mat) |
第1引数がウィンドウ名、第2引数が表示する Mat |
Cv2.WaitKey(0) |
0 を渡すと無制限に待機。正の整数ならミリ秒待機 |
Cv2.DestroyAllWindows() |
開いているウィンドウを全て閉じる |
引数と戻り値
Cv2.ImShow(string winname, Mat mat)
| 引数 | 型 | 説明 |
|---|---|---|
winname |
string |
ウィンドウの識別名。同じ名前を指定すると同じウィンドウを更新する |
mat |
Mat |
表示する画像。CV_8U(8bit)の 1ch / 3ch / 4ch に対応 |
戻り値: なし(void)
Cv2.WaitKey の引数
| 引数 | 型 | 説明 |
|---|---|---|
delay |
int |
待機時間(ミリ秒)。0 で無制限待機 |
戻り値: 押されたキーの ASCII コード(int)。タイムアウト時は -1
実践例
複数ウィンドウを並べて比較する
処理前後の画像を別ウィンドウで表示して比較するパターンは実務でよく使います。
using OpenCvSharp;
using var src = Cv2.ImRead("sample.jpg", ImreadModes.Color);
if (src.Empty())
{
Console.WriteLine("画像の読み込みに失敗しました。");
return;
}
// グレースケール変換
using var gray = new Mat();
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
// 元画像とグレースケール画像を別ウィンドウで表示
Cv2.ImShow("Original", src);
Cv2.ImShow("Grayscale", gray);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
ウィンドウ名を変えるだけで複数のウィンドウを独立して表示できます。DestroyAllWindows で一括クローズできるため、終了処理がシンプルになります。
動画のフレームをリアルタイムで表示する
using OpenCvSharp;
using var cap = new VideoCapture("sample.mp4");
if (!cap.IsOpened())
{
Console.WriteLine("動画の読み込みに失敗しました。");
return;
}
using var frame = new Mat();
while (true)
{
// フレームを取得
cap.Read(frame);
if (frame.Empty()) break; // 動画終端
Cv2.ImShow("Video", frame);
// 30ms 待機・'q' キーで終了
int key = Cv2.WaitKey(30);
if (key == 'q') break;
}
Cv2.DestroyAllWindows();
WaitKey の戻り値でキー入力を判定できます。30 ミリ秒待機で約 33fps のループになります。
つまずきポイント
⚠️ Cv2.WaitKey を呼ばないとウィンドウが表示されない
Cv2.ImShow だけでは OS にイベントループを回す機会が与えられず、ウィンドウが描画されないまま即座に消えます。表示後は必ず Cv2.WaitKey を呼んでください。コンソールアプリで Console.ReadKey() で代用しようとしてもウィンドウは描画されません。
⚠️ OpenCvSharpExtern の DllNotFoundException が出る
OpenCvSharp4.runtime.win を NuGet でインストールしていない場合に発生します。OpenCvSharp4 だけでは Native DLL が含まれないため、必ずランタイムパッケージを追加してください。Linux/macOS では対応する runtime パッケージが別途必要です。
⚠️ Mat の Dispose 漏れによるネイティブメモリリーク
Mat は IDisposable を実装しており、Dispose を呼ばないとネイティブヒープのメモリが解放されません。using var mat = ... の形式を徹底してください。ループ内で毎フレーム新しい Mat を生成するコードは特に注意が必要です。上記の動画例のように、Mat をループ外で1つ確保して Read で上書きする形にすると安全です。
関連する関数
| 関数 | 用途 |
|---|---|
Cv2.NamedWindow |
ウィンドウを事前に作成し、サイズやフラグを指定する |
Cv2.WaitKey |
キー入力待機。ImShow とセットで必ず使う |
Cv2.DestroyWindow |
指定した名前のウィンドウだけを閉じる |
Cv2.DestroyAllWindows |
開いているウィンドウを全て閉じる |
Cv2.ImRead |
画像ファイルを Mat に読み込む |
まとめ
Cv2.ImShowはwinnameとMatを渡すだけで画像をウィンドウに表示できます。- 必ず
Cv2.WaitKeyをセットで呼ぶことがウィンドウ表示の絶対条件です。 Matはusingで確実に Dispose し、ネイティブメモリリークを防いでください。
🛠 画像処理のプロが開発するSDK/API
本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/APIを開発しています。SDK は C#/.NET 8 に正式対応しており、OpenCvSharp を使うプロジェクトからそのまま組み込めます。

