cv::imread の使い方【OpenCV/C++】〜画像ファイルを読み込む〜

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

cv::imread の使い方【OpenCV/C++】〜画像ファイルを読み込む〜

cv::imread は画像ファイルを cv::Mat として読み込む最も基本的な関数です。パスを渡すだけで PNG・JPEG・BMP など主要フォーマットに対応し、読み込んだ結果をそのまま処理に使えます。

cv::Mat img = cv::imread("image.png", cv::IMREAD_COLOR);
if (img.empty()) { /* エラー処理 */ }

動作環境

  • OpenCV 4.x(imgcodecs モジュール)
  • コンパイル例: g++ -std=c++17 main.cpp $(pkg-config --cflags --libs opencv4)

環境構築がまだの方は環境構築ガイドを先にどうぞ。


基本の使い方

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    // 画像をカラーで読み込む
    cv::Mat img = cv::imread("sample.png", cv::IMREAD_COLOR);

    // 読み込み失敗チェック(必須)
    if (img.empty()) {
        std::cerr << "画像の読み込みに失敗しました。パスを確認してください。" << std::endl;
        return -1;
    }

    // 画像情報を出力
    std::cout << "サイズ: " << img.cols << " x " << img.rows << std::endl;
    std::cout << "チャンネル数: " << img.channels() << std::endl;
    std::cout << "型: " << img.type() << std::endl;  // CV_8UC3 なら 16

    // ウィンドウに表示
    cv::imshow("sample", img);
    cv::waitKey(0);

    return 0;
}

実行結果:

サイズ: 640 x 480
チャンネル数: 3
型: 16

ウィンドウに画像が表示され、任意のキーを押すと終了します。

各行のポイント

  • cv::imread("sample.png", cv::IMREAD_COLOR)
    第1引数にファイルパス、第2引数に読み込みフラグを渡します。フラグを省略した場合は cv::IMREAD_COLOR が適用されます。
  • img.empty() チェック
    ファイルが存在しない・権限がない・非対応フォーマットの場合、例外ではなく空の cv::Mat が返ります。empty() チェックは省略禁止です。
  • img.type()16
    CV_8UC3(8bit・3チャンネル)を表します。カラー画像のデフォルト型です。

引数と戻り値

関数シグネチャ

cv::Mat cv::imread(const cv::String& filename, int flags = cv::IMREAD_COLOR);
引数 説明
filename cv::String 読み込む画像ファイルのパス
flags int 読み込み方法を指定するフラグ(下表参照)

戻り値: 読み込んだ画像データを格納した cv::Mat。失敗時は空の cv::Matempty() == true)。

主要フラグ一覧

フラグ定数 説明
cv::IMREAD_COLOR 1 3チャンネルBGRカラーで読み込む(デフォルト)
cv::IMREAD_GRAYSCALE 0 1チャンネルグレースケールで読み込む
cv::IMREAD_UNCHANGED -1 アルファチャンネルを含むそのままの状態で読み込む
cv::IMREAD_ANYDEPTH 2 16bit/32bit 画像をそのビット深度で読み込む
cv::IMREAD_ANYCOLOR 4 ファイルに含まれるチャンネルをそのまま使用

⚠️ OpenCV の画像チャンネル順は BGR(RGB ではない)です。表示や他ライブラリとの連携時に注意してください。


実践例

グレースケールで読み込む

前処理(エッジ検出・二値化など)の前にグレースケールで直接読み込むと、cvtColor を挟む手間が省けます。

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    // グレースケールとして読み込む
    cv::Mat gray = cv::imread("sample.png", cv::IMREAD_GRAYSCALE);
    if (gray.empty()) {
        std::cerr << "画像の読み込みに失敗しました。" << std::endl;
        return -1;
    }

    std::cout << "チャンネル数: " << gray.channels() << std::endl;  // 1

    cv::imshow("gray", gray);
    cv::waitKey(0);
    return 0;
}
チャンネル数: 1

アルファチャンネル付き PNG を読み込む

透過PNGを扱う場合は cv::IMREAD_UNCHANGED を使います。IMREAD_COLOR では透過情報が失われます。

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    // アルファチャンネルを保持したまま読み込む
    cv::Mat img = cv::imread("logo.png", cv::IMREAD_UNCHANGED);
    if (img.empty()) {
        std::cerr << "画像の読み込みに失敗しました。" << std::endl;
        return -1;
    }

    std::cout << "チャンネル数: " << img.channels() << std::endl;  // 4 (BGRA)

    // アルファチャンネルのみ取り出す
    std::vector<cv::Mat> channels;
    cv::split(img, channels);
    cv::imshow("alpha", channels[3]);
    cv::waitKey(0);
    return 0;
}
チャンネル数: 4

読み込んだ cv::Mat をそのまま ROI 処理などに活用できます。詳しくはcv::Mat ROI で画像の一部を切り出す方法【OpenCV/C++】をご覧ください。


つまずきポイント

⚠️ 読み込みに失敗しても例外が出ない

cv::imread はファイルが存在しなくても例外をスローしません。戻り値が空の cv::Mat になるだけです。その後の処理(img.rows 参照など)でアクセス違反やアサートエラーが起きて、原因の特定に迷うことがあります。imread 直後に必ず empty() チェックを入れてください。

// NG: チェックなしで使用
cv::Mat img = cv::imread("not_exist.png");
cv::imshow("test", img);  // ここでクラッシュ

⚠️ 日本語・マルチバイト文字を含むパスが読み込めない

Windows 環境では、日本語パスを cv::imread に渡すと読み込みに失敗するケースがあります(内部で std::string → ロケール変換が行われないため)。回避策として std::wstring 版の cv::imread は存在しないため、パス自体を英数字のみにするか、std::filesystem::path で変換して imdecode を使う方法が現実的です。

// 回避策: ファイルをバイナリ読み込みして imdecode に渡す
std::vector<uchar> buf = ...;  // ファイルをバイナリ読み込み
cv::Mat img = cv::imdecode(buf, cv::IMREAD_COLOR);

⚠️ 作業ディレクトリとパスのずれ

Visual Studio でプロジェクトを実行した場合、カレントディレクトリは .vcxproj があるディレクトリになります。"sample.png" という相対パスを指定しても、実行ファイルと同じフォルダに置いても見つからない場合があります。デバッグ時は絶対パスを使うか、プロジェクトの「作業ディレクトリ」設定を確認してください。


関連する関数


まとめ

  • cv::imread は第2引数のフラグで読み込み形式(カラー・グレー・アルファ付き)を切り替えられます。
  • 失敗時は例外ではなく空の cv::Mat が返るため、empty() チェックは必須です。
  • Windows での日本語パス問題・Visual Studio での作業ディレクトリのずれは頻出なので、最初に確認する習慣をつけてください。

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

本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/API(C++製・OpenCV 4.10)を開発しています。顔認証システムへの組み込み実績多数。

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

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