Cv2.ImRead の使い方【OpenCV/C#(OpenCvSharp)】〜画像ファイルを読み込む〜

OpenCV for C#
📌 準備: OpenCV の環境構築がまだの方はこちら → C++ 環境構築ガイドC#(OpenCvSharp)セットアップ

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 はファイルが存在しなくても例外をスローせず、空の MatEmpty() == true)を返します。そのまま後続処理に渡すとアクセス違反やクラッシュの原因になるため、必ず Empty() チェックをセットで書く習慣をつけてください。

if (img.Empty()) { /* 必ずチェック */ }

✅ Mat の using 忘れによるネイティブメモリリーク

MatIDisposable を実装しており、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() チェックは必須です。
  • Matusing で確実に解放し、NuGet には OpenCvSharp4.runtime.win もセットでインストールしてください。

🛠 画像処理のプロが開発するSDK/API

本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/APIを開発しています。SDK は C#/.NET 8 に正式対応しており、OpenCvSharp を使うプロジェクトからそのまま組み込めます。

→ なりすまし判定SDK/APIの詳細を見る
→ API仕様書・サンプルコード

タイトルとURLをコピーしました