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::Mat(empty() == 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::imwrite — 画像をファイルに保存する。
imreadとセットで使います → cv::imwrite の使い方【OpenCV/C++】 - cv::cvtColor — 読み込んだ画像のカラー空間を変換する → OpenCV/C++ cvtColor の使い方
- cv::imdecode — メモリ上のバッファから画像をデコードする(日本語パス問題の回避にも有効)
- cv::imshow — 読み込んだ画像をウィンドウに表示する
- cv::Mat —
imreadの戻り値型。ROI や型変換など基本操作は cv::Mat ROI で画像の一部を切り出す方法 で解説しています
まとめ
cv::imreadは第2引数のフラグで読み込み形式(カラー・グレー・アルファ付き)を切り替えられます。- 失敗時は例外ではなく空の
cv::Matが返るため、empty()チェックは必須です。 - Windows での日本語パス問題・Visual Studio での作業ディレクトリのずれは頻出なので、最初に確認する習慣をつけてください。
🛠 画像処理のプロが開発するSDK/API
本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/API(C++製・OpenCV 4.10)を開発しています。顔認証システムへの組み込み実績多数。

