OpenCV/C++ imread・imshow の使い方 〜画像を読み込んで表示する〜
C++ で OpenCV を使った画像処理の第一歩は「画像を読み込んで表示する」ことです。cv::imread でファイルを cv::Mat に読み込み、cv::imshow でウィンドウに表示するだけで完結します。最小構成は次のとおりです。
cv::Mat img = cv::imread("sample.jpg");
cv::imshow("window", img);
cv::waitKey(0);
動作環境
| 項目 | バージョン |
|---|---|
| OpenCV | 4.x |
| 言語規格 | C++17 |
| OS | Linux / macOS / Windows |
ビルド・実行コマンド(Linux / macOS):
g++ -std=c++17 main.cpp `pkg-config --cflags --libs opencv4` -o main
./main
基本の使い方
完全プログラム
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
// 画像ファイルを読み込む(実行ディレクトリに sample.jpg を置く)
cv::Mat img = cv::imread("sample.jpg");
// 読み込み失敗チェック(パス誤りや対応外フォーマットで空になる)
if (img.empty()) {
std::cerr << "画像の読み込みに失敗しました。パスを確認してください。" << std::endl;
return 1;
}
// ウィンドウタイトルを "OpenCV Sample" として画像を表示
cv::imshow("OpenCV Sample", img);
// キー入力があるまでウィンドウを維持する(0 = 無限待機)
cv::waitKey(0);
return 0;
}
実行結果
sample.jpg が正常に読み込まれると、「OpenCV Sample」というタイトルバーを持つウィンドウが開き、画像が表示されます。ウィンドウにフォーカスを当てた状態で任意のキーを押すとウィンドウが閉じてプログラムが終了します。
読み込みに失敗した場合(ファイルが存在しない等)は以下がターミナルに出力されます。
画像の読み込みに失敗しました。パスを確認してください。
行ごとの解説
cv::imread("sample.jpg")
指定したパスの画像ファイルを読み込み、cv::Mat として返します。デフォルトでカラー(BGR 3チャンネル)として読み込まれます。ファイルが存在しない・非対応フォーマットの場合は空の cv::Mat を返し、例外はスローされません。そのため直後の empty() チェックが必須です。
cv::imshow("OpenCV Sample", img)
第1引数のタイトルで GUI ウィンドウを生成し、cv::Mat の内容をそのまま表示します。同じタイトルで複数回呼ぶと同一ウィンドウが更新されます(動画ループ等に利用)。
cv::waitKey(0)
引数 0 はキー入力を無限に待ちます。正の整数を渡すとミリ秒単位のタイムアウトになります(例: cv::waitKey(1000) で1秒後に自動で抜ける)。cv::imshow を呼んだだけではウィンドウのイベントループが動かないため、必ずセットで呼び出す必要があります。
引数と戻り値
cv::imread
| 引数 / 戻り値 | 型 | 説明 |
|---|---|---|
filename |
const std::string& |
読み込む画像ファイルのパス |
flags |
int |
読み込みモード(省略時: cv::IMREAD_COLOR) |
| 戻り値 | cv::Mat |
読み込んだ画像。失敗時は空の Mat |
flags の主な値:
| 定数 | 値 | 説明 |
|---|---|---|
cv::IMREAD_COLOR |
1 | カラー(BGR)で読み込む(デフォルト) |
cv::IMREAD_GRAYSCALE |
0 | グレースケールで読み込む |
cv::IMREAD_UNCHANGED |
-1 | アルファチャンネル含む元のまま読み込む |
cv::imshow
| 引数 | 型 | 説明 |
|---|---|---|
winname |
const std::string& |
ウィンドウのタイトル(ウィンドウ識別子を兼ねる) |
mat |
cv::InputArray |
表示する画像(cv::Mat 等) |
| 戻り値 | void |
なし |
cv::waitKey
| 引数 | 型 | 説明 |
|---|---|---|
delay |
int |
待機時間(ミリ秒)。0 で無限待機 |
| 戻り値 | int |
押されたキーのアスキーコード。タイムアウト時は -1 |
実践例
グレースケールで読み込んで表示する
カラー不要な処理(エッジ検出・二値化など)では、読み込み時からグレースケールにしておくと後続処理が軽くなります。
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
// IMREAD_GRAYSCALE を指定してグレースケールで読み込む
cv::Mat gray = cv::imread("sample.jpg", cv::IMREAD_GRAYSCALE);
if (gray.empty()) {
std::cerr << "画像の読み込みに失敗しました。" << std::endl;
return 1;
}
cv::imshow("Grayscale", gray);
cv::waitKey(0);
return 0;
}
実行すると、モノクロのウィンドウが表示されます。gray.type() は CV_8UC1(1チャンネル8ビット)になります。
押したキーを判定してウィンドウを閉じる
cv::waitKey の戻り値でキーを判定できます。s キーで別名保存、q キーで終了するパターンは実務でよく使います。
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
cv::Mat img = cv::imread("sample.jpg");
if (img.empty()) {
std::cerr << "画像の読み込みに失敗しました。" << std::endl;
return 1;
}
cv::imshow("Press S to save / Q to quit", img);
while (true) {
int key = cv::waitKey(0);
if (key == 's' || key == 'S') {
// 'S' キーで画像を保存
cv::imwrite("output.jpg", img);
std::cout << "output.jpg に保存しました。" << std::endl;
} else if (key == 'q' || key == 'Q' || key == 27) {
// 'Q' キーまたは ESC で終了
break;
}
}
return 0;
}
つまずきポイント
⚠️ imread が空の Mat を返す
最も多いハマりどころです。cv::imread はファイルが見つからなくても例外を投げず、空の cv::Mat を返します。その後 cv::imshow に渡すと assertion エラーでクラッシュします。
主な原因と確認方法:
- 作業ディレクトリのズレ: IDE(Visual Studio / CLion 等)でビルドすると、実行時のカレントディレクトリがソースの場所とは異なることがあります。絶対パスで確認するか、
std::filesystem::current_path()で実行時ディレクトリを出力して確認してください。 - 日本語・スペースを含むパス: ファイルパスに日本語が含まれると
cv::imreadが失敗するケースがあります(特に Windows)。ASCII のみのパスに移動して試してください。 - 拡張子とフォーマットの不一致: 拡張子を
.jpgにしていても中身が PNG のファイルは読み込めます(逆も同様)が、完全に壊れたファイルは失敗します。
⚠️ cv::imshow 後に waitKey を呼ばないとウィンドウが表示されない(またはすぐ消える)
cv::imshow は表示命令をキューに積むだけで、cv::waitKey を呼ぶまでイベントループが動きません。waitKey なしで main が終了すると、ウィンドウが一瞬も表示されずにプログラムが終わります。
⚠️ Windows での リンクエラー(unresolved external symbol)
Visual Studio でビルドする際、Debug ビルド用のライブラリ(opencv_world4XXd.lib)と Release ビルド用(opencv_world4XX.lib)を取り違えるとリンクエラーになります。プロジェクト設定のビルド構成(Debug / Release)と追加の依存ファイルに指定したライブラリ名が一致しているか確認してください。また、x64 / x86 の取り違えも同様にリンクエラーの原因になります。
関連する関数
cv::imwrite:cv::Matをファイルに書き出す。imread の逆操作。cv::namedWindow: ウィンドウのサイズ変更可否などのオプションを事前に設定する。cv::imshowだけでウィンドウは自動生成されるが、リサイズ可能にしたい場合などはnamedWindowを先に呼ぶ。cv::destroyAllWindows: 開いているすべてのウィンドウを閉じる。複数ウィンドウを開くプログラムの終了時に使う。cv::Mat: OpenCV における画像データの基本型。チャンネル数・ビット深度・サイズをまとめて管理する。
まとめ
cv::imreadでファイルをcv::Matに読み込み、cv::imshowでウィンドウに表示するのが C++ 画像処理の基本形です。imread直後のempty()チェックとimshow後のwaitKey呼び出しはセットで忘れずに入れてください。- グレースケール読み込みやキー入力判定など、実務で使う応用もフラグや戻り値を変えるだけで対応できます。
🛠 画像処理のプロが開発するSDK/API
本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/API(C++製・OpenCV 4.10)を開発しています。顔認証システムへの組み込み実績多数。

