Cv2.ImRead の使い方【OpenCV/C#(OpenCvSharp)】〜画像ファイルを読み込む〜
Cv2.ImRead は、JPEG・PNG・BMP など主要な画像フォーマットを Mat として読み込む関数です。OpenCV を使った画像処理の起点となる最も基本的な関数で、まずここを押さえることで後続の処理がすべて繋がります。
最小限のコードは次のとおりです。
using var img = Cv2.ImRead("sample.jpg", ImreadModes.Color);
動作環境
| 項目 | バージョン |
|---|---|
| OpenCV | 4.x 系(OpenCV 4.x 時点の情報) |
| NuGet | OpenCvSharp4 + OpenCvSharp4.runtime.win(Windows 実行時) |
| .NET | .NET 8 コンソールアプリ |
基本の使い方
完全なサンプルプログラム
using OpenCvSharp;
// 画像をカラーで読み込む
using var img = Cv2.ImRead("sample.jpg", ImreadModes.Color);
// 読み込み失敗チェック(Empty で判定)
if (img.Empty())
{
Console.WriteLine("画像の読み込みに失敗しました。パスを確認してください。");
return;
}
Console.WriteLine($"幅: {img.Width}, 高さ: {img.Height}, チャンネル数: {img.Channels()}");
// ウィンドウに表示
Cv2.ImShow("Loaded Image", img);
Cv2.WaitKey(0);
実行結果
幅: 640, 高さ: 480, チャンネル数: 3
ウィンドウに読み込んだ画像が表示されます(WaitKey(0) で任意キー入力待ち)。
行ごとの解説
| 行 | 説明 |
|---|---|
Cv2.ImRead("sample.jpg", ImreadModes.Color) |
カラー(BGR 3ch)で読み込む。using で自動解放 |
img.Empty() |
読み込み失敗時(ファイル不在・非対応形式)は true になる |
img.Width / Height / Channels() |
Mat のサイズとチャンネル数を確認する定番デバッグ |
Cv2.WaitKey(0) |
0 を渡すと無限待機。ウィンドウが即閉じするのを防ぐ |
引数と戻り値
Mat Cv2.ImRead(string filename, ImreadModes flags = ImreadModes.Color)
| 引数 / 戻り値 | 型 | 説明 |
|---|---|---|
filename |
string |
読み込む画像ファイルのパス |
flags |
ImreadModes |
読み込みモード(下表参照) |
| 戻り値 | Mat |
読み込んだ画像データ。失敗時は空の Mat |
ImreadModes の主要な値
| 値 | 説明 |
|---|---|
ImreadModes.Color |
カラー(BGR 3ch)で読み込む(デフォルト) |
ImreadModes.Grayscale |
グレースケール(1ch)で読み込む |
ImreadModes.Unchanged |
アルファチャンネルを含むそのままの形式で読み込む |
ImreadModes.AnyDepth |
16bit・32bit 画像をビット深度そのままで読み込む |
ImreadModes.AnyColor |
チャンネル数を変換しない |
⚠️
ImreadModes.Colorを指定すると、PNG の透過(アルファ)情報は破棄されます。透過を保持したい場合はUnchangedを使ってください。
実践例
グレースケールで読み込んで保存する
using OpenCvSharp;
// グレースケールとして直接読み込む(カラー変換のコストを省ける)
using var gray = Cv2.ImRead("sample.jpg", ImreadModes.Grayscale);
if (gray.Empty())
{
Console.WriteLine("読み込み失敗");
return;
}
// グレースケール画像をファイルに保存
Cv2.ImWrite("output_gray.png", gray);
Console.WriteLine("グレースケール画像を保存しました: output_gray.png");
ImreadModes.Color で読み込んでから Cv2.CvtColor で変換する方法もありますが、最初からグレースケールで読み込むほうがシンプルで高速です。
PNG のアルファチャンネルを保持して読み込む
using OpenCvSharp;
// Unchanged で読み込むとアルファチャンネル(4ch)が保持される
using var img = Cv2.ImRead("logo.png", ImreadModes.Unchanged);
if (img.Empty())
{
Console.WriteLine("読み込み失敗");
return;
}
Console.WriteLine($"チャンネル数: {img.Channels()}"); // 4ch(BGRA)になる
// アルファチャンネルを分離して確認
Mat[] channels = Cv2.Split(img);
foreach (var ch in channels) ch.Dispose();
Unchanged を使うことで BGRA(4ch)のまま扱えます。合成処理やマスク生成の起点として有用です。
つまずきポイント
✅ ImRead は読み込み失敗しても例外を投げない
C# 開発者がはまりやすい点として、Cv2.ImRead はファイルが存在しなくても例外をスローせず、空の Mat(Empty() == true)を返します。そのまま後続処理に渡すとアクセス違反やクラッシュの原因になるため、必ず Empty() チェックをセットで書く習慣をつけてください。
if (img.Empty()) { /* 必ずチェック */ }
✅ Mat の using 忘れによるネイティブメモリリーク
Mat は IDisposable を実装しており、GC だけに頼るとネイティブ側のメモリが解放されないまま残ります。Cv2.ImRead の戻り値は 必ず using で受け取るか、明示的に Dispose() を呼んでください。
// NG: GC 任せ
var img = Cv2.ImRead("sample.jpg");
// OK: using で確実に解放
using var img = Cv2.ImRead("sample.jpg");
✅ DllNotFoundException が出る場合は runtime パッケージを確認する
OpenCvSharp4 だけを NuGet でインストールしてもネイティブ DLL が含まれません。Windows で実行する場合は OpenCvSharp4.runtime.win も必ずインストールしてください。Linux の場合は OpenCvSharp4.runtime.ubuntu.20.04-x64 など OS に合ったパッケージが必要です。
関連する関数
| 関数 | 概要 |
|---|---|
Cv2.ImWrite |
Mat を画像ファイルに保存する |
Cv2.ImShow |
Mat をウィンドウに表示する |
Cv2.CvtColor |
色空間変換(BGR → Grayscale など) |
Cv2.WaitKey |
キー入力待機・ウィンドウのイベントループを回す |
まとめ
Cv2.ImReadは画像ファイルをMatとして読み込む OpenCV の基本関数で、ImreadModesで読み込み形式を切り替えられます。- 読み込み失敗時は例外でなく空の
Matが返るため、Empty()チェックは必須です。 Matはusingで確実に解放し、NuGet にはOpenCvSharp4.runtime.winもセットでインストールしてください。
🛠 画像処理のプロが開発するSDK/API
本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/APIを開発しています。SDK は C#/.NET 8 に正式対応しており、OpenCvSharp を使うプロジェクトからそのまま組み込めます。

