現在、作成中…
もくじ
- 静止画ファイルの入出力
- 動画ファイルの入出力
- パソコンに接続したカメラからの入力
- マウスとキーボードからの入力
1. 静止画ファイルの入出力
1.1 ファイルから画像を読み込んで表示する
プログラム内で指定されている画像ファイルから画像データを読み込み、ウィンドウに貼り付けて画面に表示する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <opencv2/opencv.hpp> int main(void) { // 画像を格納するオブジェクトを宣言する cv::Mat image; // 画像ファイルから画像データを読み込む image = cv::imread("C:/opencv/sources/samples/data/lena.jpg"); if (image.empty() == true) { // 画像データが読み込めなかったときは終了する return 0; } // ウィンドウに画像を表示する // # ここではウィンドウに「画像」という識別名を付けている cv::imshow("画像", image); // 何かキーが押されるまで待つ cv::waitKey(); return 0; } |
1.2 複数の画像を同時に表示する
「りんご」と「みかん」の二つの画像をそれぞれ別のウィンドウに貼り付けて画面に表示する。その後、何かキーが押されたら「りんご」のウィンドウを閉じる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <opencv2/opencv.hpp> int main(void) { // 画像を格納するオブジェクトを宣言する cv::Mat image1, image2; // 画像ファイルから画像データを読み込む image1 = cv::imread("C:/opencv/sources/samples/data/apple.jpg"); image2 = cv::imread("C:/opencv/sources/samples/data/orange.jpg"); if (image1.empty() == true || image2.empty() == true) { // 画像データが読み込めなかったときは終了する return 0; } // ウィンドウに画像を表示する cv::imshow("りんご", image1); cv::imshow("みかん", image2); // 何かキーが押されるまで待つ cv::waitKey(); // ウィンドウを閉じる cv::destroyWindow("りんご"); // 何かキーが押されるまで待つ cv::waitKey(); return 0; } |
1.3 複数の画像を切り替えて表示する
一つのウィンドウに5枚の画像を順番に表示する。何かキーを押すたびに画像が切り替わる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <opencv2/opencv.hpp> int main(void) { // 画像ファイル名の配列 std::vector<std::string> files{ "lena", "board", "building", "home", "starry_night" }; // 画像を格納するオブジェクトを宣言する cv::Mat image; // 画像を順番に読み込む for (int i = 0; i < files.size(); i++) { // 画像ファイルから画像データを読み込む image = cv::imread("C:/opencv/sources/samples/data/" + files[i] + ".jpg"); if (image.empty() == true) { // 画像データが読み込めなかったときは終了する return 0; } // ウィンドウに画像を表示する cv::imshow("画像", image); // 何かキーが押されるまで待つ cv::waitKey(); } return 0; } |
1.4 画像をファイルに保存する
読み込んだ画像を上下反転の画像変換をして、それをJPEGフォーマットとPNGフォーマットの二つのファイルに保存する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <opencv2/opencv.hpp> int main(void) { // 画像を格納するオブジェクトを宣言する cv::Mat srcImage, dstImage; // 画像ファイルから画像データを読み込む srcImage = cv::imread("C:/opencv/sources/samples/data/lena.jpg"); if (srcImage.empty() == true) { // 画像データが読み込めなかったときは終了する return 0; } // 画像変換(画像の上下反転) // # srcImage を画像変換した結果を dstImage に入れる cv::flip(srcImage, dstImage, 0); // ウィンドウに画像を表示する cv::imshow("原画像", srcImage); cv::imshow("変換後画像", dstImage); // 画像を保存する // # ファイルフォーマットはファイル名の拡張子で自動判別される // # 保存先をフルパスで指定していないときは、ソースプログラムと同じフォルダに保存される cv::imwrite("変換後画像.jpg", dstImage); // JPEGフォーマットで保存 cv::imwrite("変換後画像.png", dstImage); // PNGフォーマットで保存 // 何かキーが押されるまで待つ cv::waitKey(); return 0; } |
1.5 JPEGの画質を設定して保存する
JPEGで保存するときに画質の良さを 0~100 の値で設定できる(0が最低画質、100が最高画質、特に指定しない場合は95になる)。同じ画像で、画質を 0、10、50、95、100 の五つでそれぞれファイルに保存する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include <opencv2/opencv.hpp> int main(void) { // 画像を格納するオブジェクトを宣言する cv::Mat image; // 画像ファイルから画像データを読み込む image = cv::imread("C:/opencv/sources/samples/data/lena.jpg"); if (image.empty() == true) { // 画像データが読み込めなかったときは終了する return 0; } // ウィンドウに画像を表示する cv::imshow("原画像", image); // 画像を保存する cv::imwrite("JPEG画質デフォルト.jpg", image); // 画像圧縮のパラメータを設定して保存する // # IMWRITE_JPEG_QUALITY : JPEGで保存するときの画質 0:最低 ~ 100:最高 // # imwrite でパラメータを指定しないときは、画質 95 になる std::vector<int> params(2); params[0] = cv::IMWRITE_JPEG_QUALITY; params[1] = 0; cv::imwrite("JPEG画質__0.jpg", image, params); params[1] = 10; cv::imwrite("JPEG画質_10.jpg", image, params); params[1] = 50; cv::imwrite("JPEG画質_50.jpg", image, params); params[1] = 95; // デフォルトと同じになる cv::imwrite("JPEG画質_95.jpg", image, params); params[1] = 100; cv::imwrite("JPEG画質100.jpg", image, params); // 何かキーが押されるまで待つ cv::waitKey(); return 0; } |
1.6 ファイルから読み込むときに画像変換する
imread関数では、画像を読み込むときに、カラーまたはグレイスケールに変換したり、画像サイズを縮小したりすることができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <opencv2/opencv.hpp> int main(void) { // 画像を格納するオブジェクトを宣言する cv::Mat image1, image2, image3, image4; // 画像ファイルから画像データを読み込む // # IMREAD_COLOR カラー(BGR)に変換して読み込む(デフォルト) // # IMREAD_GRAYSCALE グレイスケールに変換して読み込む // # IMREAD_REDUCED_COLOR_2 画像サイズを1/2に縮小してカラーで読み込む // # IMREAD_REDUCED_COLOR_4 画像サイズを1/4に縮小してカラーで読み込む // # IMREAD_REDUCED_COLOR_8 画像サイズを1/8に縮小してカラーで読み込む image1 = cv::imread("C:/opencv/sources/samples/data/lena.jpg", cv::IMREAD_COLOR); image2 = cv::imread("C:/opencv/sources/samples/data/lena.jpg", cv::IMREAD_GRAYSCALE); image3 = cv::imread("C:/opencv/sources/samples/data/lena.jpg", cv::IMREAD_REDUCED_COLOR_2); image4 = cv::imread("C:/opencv/sources/samples/data/lena.jpg", cv::IMREAD_REDUCED_COLOR_4); if (image1.empty() == true) { // 画像データが読み込めなかったときは終了する return 0; } // ウィンドウに画像を表示する cv::imshow("COLOR", image1); cv::imshow("GRAYSCALE", image2); cv::imshow("REDUCED_COLOR_2", image3); cv::imshow("REDUCED_COLOR_4", image4); // 何かキーが押されるまで待つ cv::waitKey(); return 0; } |
2. 動画ファイルの入出力
2.1 動画ファイルから映像を読み込んで表示する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <opencv2/opencv.hpp> int main(void) { // 動画ファイルを取り込むためのオブジェクトを宣言する cv::VideoCapture cap; // 動画ファイルを開く cap.open("C:/opencv/sources/samples/data/Megamind.avi"); if (cap.isOpened() == false) { // 動画ファイルが開けなかったときは終了する return 0; } // 画像を格納するオブジェクトを宣言する cv::Mat frame; for (;;) { // cap から frame へ1フレームを取り込む cap >> frame; if (frame.empty() == true) { // 画像が読み込めなかったとき、無限ループを抜ける break; } // ウィンドウに画像を表示する cv::imshow("再生中", frame); // 30ミリ秒待つ // # waitKeyの引数にキー入力の待ち時間を指定できる(ミリ秒単位) // # 引数が 0 または何も書かない場合は、キー入力があるまで待ち続ける cv::waitKey(30); } return 0; } |
2.2 簡単な動画再生ソフト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#include <opencv2/opencv.hpp> int main(void) { // 動画ファイルを取り込むためのオブジェクトを宣言する cv::VideoCapture cap; // 動画ファイルを開く cap.open("C:/opencv/sources/samples/data/Megamind.avi"); if (cap.isOpened() == false) { // 動画ファイルが開けなかったときは終了する return 0; } // 全フレーム数を取得する int total = (int)cap.get(cv::CAP_PROP_FRAME_COUNT); // fpsから1フレームの表示時間 period(ミリ秒)を計算する double fps = cap.get(cv::CAP_PROP_FPS); int period = (int)(1000 / fps); // 画像を格納するオブジェクトを宣言する cv::Mat frame; for (;;) { // cap から frame へ1フレームを取り込む cap >> frame; if (frame.empty() == true) { // 画像が読み込めなかったとき、無限ループを抜ける break; } // ウィンドウに画像を表示する cv::imshow("再生中", frame); // period(ミリ秒)待つ // キー入力されたら key へ文字コードを代入する int key = cv::waitKey(period); // 現在のフレーム番号(先頭から何フレーム目か)を表示する int n = (int)cap.get(cv::CAP_PROP_POS_FRAMES); // フレームの位置を取得 std::cout << "\rフレーム番号" << std::setw(4) << n << '/' << total << std::flush; if (key == ' ') { // スペースキーが押されたら一時停止する std::cout << "\n一時停止" << std::endl; cv::waitKey(); } else if (key == 'r') { // Rキーが押されたら先頭から再生しなおす std::cout << "\nリスタート" << std::endl; cap.set(cv::CAP_PROP_POS_FRAMES, 0); // フレームの位置を0に設定 } else if (key == 's') { // Sキーが押されたら30フレームスキップする std::cout << "\nスキップ" << std::endl; cap.set(cv::CAP_PROP_POS_FRAMES, n + 30); // n+30に設定 } else if (key == 0x1b) { // ESCキーが押されたら終了する break; } } return 0; } |
2.3 映像を動画ファイルに保存する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#include <opencv2/opencv.hpp> int main(void) { // 動画ファイルを取り込むためのオブジェクトを宣言する cv::VideoCapture cap; // 動画ファイルを開く cap.open("C:/opencv/sources/samples/data/Megamind.avi"); if (cap.isOpened() == false) { // 動画ファイルが開けなかったときは終了する return 0; } // 作成する動画ファイルの諸設定 int width, height, fourcc; double fps; width = (int)cap.get(cv::CAP_PROP_FRAME_WIDTH); // フレーム横幅を取得 height = (int)cap.get(cv::CAP_PROP_FRAME_HEIGHT); // フレーム縦幅を取得 fps = cap.get(cv::CAP_PROP_FPS); // フレームレートを取得 // ビデオフォーマットの指定 fourcc = cv::VideoWriter::fourcc('X', 'V', 'I', 'D'); // Xvid / ファイル拡張子 .avi // 参考:その他のフォーマット // fourcc = cv::VideoWriter::fourcc('D', 'I', 'V', 'X'); // DivX / .avi // fourcc = cv::VideoWriter::fourcc('H', '2', '6', '4'); // H.264 / .wmv // fourcc = cv::VideoWriter::fourcc('V', 'P', '9', '0'); // VP9 / .avi // fourcc = cv::VideoWriter::fourcc('W', 'M', 'V', '2'); // WMV8 / .wmv // fourcc = cv::VideoWriter::fourcc('W', 'M', 'V', '3'); // WMV9 / .wmv // fourcc = cv::VideoWriter::fourcc('m', 'p', '4', 'v'); // ISO MPEG-4 / .mp4 // fourcc = cv::VideoWriter::fourcc('M', 'P', '4', '3'); // MS MPEG-4 / .avi // fourcc = cv::VideoWriter::fourcc('D', 'I', 'B', ' '); // RGB非圧縮 / .avi // 動画ファイルを書き出すためのオブジェクトを宣言する cv::VideoWriter writer; writer.open("ビデオ.avi", fourcc, fps, cv::Size(width, height)); // 画像を格納するオブジェクトを宣言する cv::Mat frame, dst; for (;;) { // cap から frame へ1フレームを取り込む cap >> frame; // 画像から空のとき、無限ループを抜ける if (frame.empty() == true) { break; } // ウィンドウに画像を表示する cv::imshow("変換中", frame); // 画像処理(画像を左右反転して dst に書き込む) cv::flip(frame, dst, 1); // 画像 dst を動画ファイルへ書き出す writer << dst; // 1ミリ秒待つ cv::waitKey(1); } return 0; } |
3. パソコンに接続したカメラからの入力
3.1 カメラから映像を取り込んで表示する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include <opencv2/opencv.hpp> int main(void) { // 映像を取り込むためのオブジェクトを宣言する cv::VideoCapture cap; // カメラに接続する // # open の引数にカメラ番号を指定する(通常は0) cap.open(0); if (cap.isOpened() == false) { // カメラの接続ができなかったときは終了する return 0; } // 画像情報を取得 int width = (int)cap.get(cv::CAP_PROP_FRAME_WIDTH); // フレーム横幅を取得 int height = (int)cap.get(cv::CAP_PROP_FRAME_HEIGHT); // フレーム縦幅を取得 std::cout << "画像サイズ " << width << "x" << height << std::endl; // 画像を格納するオブジェクトを宣言する cv::Mat frame; for (;;) { // 1フレームを取り込む cap >> frame; // 画像から空のとき、無限ループを抜ける if (frame.empty() == true) { break; } // ウィンドウに画像を表示する cv::imshow("入力中", frame); // 30ミリ秒待つ int key = cv::waitKey(30); // 何かキーが押されたら終了する if (key > 0) { break; } } return 0; } |
3.2 簡単な映像録画ソフト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#include <opencv2/opencv.hpp> int main(void) { // 映像を取り込むためのオブジェクトを宣言する cv::VideoCapture cap; // カメラに接続する // # open の引数にカメラ番号を指定する(通常は0) cap.open(0); if (cap.isOpened() == false) { // カメラの接続ができなかったときは終了する return 0; } // 画像情報を取得 int width = (int)cap.get(cv::CAP_PROP_FRAME_WIDTH); // フレーム横幅を取得 int height = (int)cap.get(cv::CAP_PROP_FRAME_HEIGHT); // フレーム縦幅を取得 std::cout << "画像サイズ " << width << "x" << height << std::endl; // 動画ファイルを書き出すためのオブジェクトを宣言する cv::VideoWriter writer; // 画像を格納するオブジェクトを宣言する cv::Mat frame; bool record = false; for (;;) { // 1フレームを取り込む cap >> frame; // 画像から空のとき、無限ループを抜ける if (frame.empty() == true) { break; } // ウィンドウに画像を表示する cv::imshow("入力中", frame); if (record == true && writer.isOpened() == true) { writer << frame; } // 30ミリ秒待つ int key = cv::waitKey(30); if (key == ' ') { if (record == true) { // 録画中であれば録画を終了する writer.release(); record = false; std::cout << "終了" << std::endl; } else { // 録画中でなければ録画を開始する int width = (int)cap.get(cv::CAP_PROP_FRAME_WIDTH); // フレーム横幅を取得 int height = (int)cap.get(cv::CAP_PROP_FRAME_HEIGHT); // フレーム縦幅を取得 int fourcc = cv::VideoWriter::fourcc('X', 'V', 'I', 'D'); // Xvid writer.open("ビデオ.avi", fourcc, 30.0, cv::Size(width, height)); record = true; std::cout << "録画中... " << std::flush; } } // ESCキーが押されたら終了する if (key == 0x1b) { if (writer.isOpened() == true) { writer.release(); } break; } } return 0; } |
4. マウスとキーボードからの入力
4.1 マウスコールバック関数の使い方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
#include <opencv2/opencv.hpp> // コールバック関数 void mouseCallback(int event, int x, int y, int flags, void *userdata) { // マウスの座標を出力 std::cout << "x=" << x << ", y=" << y << " "; // イベントの種類を出力 switch (event) { case cv::EVENT_MOUSEMOVE: std::cout << "マウスが動いた"; break; case cv::EVENT_LBUTTONDOWN: std::cout << "左ボタンを押した"; break; case cv::EVENT_RBUTTONDOWN: std::cout << "右ボタンを押した"; break; case cv::EVENT_LBUTTONUP: std::cout << "左ボタンを離した"; break; case cv::EVENT_RBUTTONUP: std::cout << "右ボタンを離した"; break; case cv::EVENT_RBUTTONDBLCLK: std::cout << "右ボタンをダブルクリック"; break; case cv::EVENT_LBUTTONDBLCLK: std::cout << "左ボタンをダブルクリック"; break; } // マウスボタンと特殊キーの押下状態を出力 std::string str; if (flags & cv::EVENT_FLAG_ALTKEY) { str += "Alt "; // ALTキーが押されている } if (flags & cv::EVENT_FLAG_CTRLKEY) { str += "Ctrl "; // Ctrlキーが押されている } if (flags & cv::EVENT_FLAG_SHIFTKEY) { str += "Shift "; // Shiftキーが押されている } if (flags & cv::EVENT_FLAG_LBUTTON) { str += "左ボタン "; // マウスの左ボタンが押されている } if (flags & cv::EVENT_FLAG_RBUTTON) { str += "右ボタン"; // マウスの右ボタンが押されている } if (!str.empty()) { std::cout << " 押下: " << str; } std::cout << std::endl; } int main(void) { // 画像を格納するオブジェクトを宣言する cv::Mat image; // 画像ファイルから画像データを読み込む image = cv::imread("C:/opencv/sources/samples/data/lena.jpg"); if (image.empty() == true) { // 画像データが読み込めなかったときは終了する return 0; } // ウィンドウに画像を表示する cv::imshow("画像", image); // コールバック関数を登録する // # このプログラムでは、コールバック関数名を mouseCallBack としている cv::setMouseCallback("画像", mouseCallback); // ESCキーが押されるまで待つ while(cv::waitKey() != 0x1b); return 0; } |
4.2 ウィンドウに表示された画像にマウスで図形を描く
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#include <opencv2/opencv.hpp> // コールバック関数 void mouseCallback(int event, int x, int y, int flags, void *userdata) { static int x0 = 0, y0 = 0; cv::Mat &image = *(cv::Mat *)userdata; switch (event) { case cv::EVENT_LBUTTONDOWN: // 左ボタンを押したとき if (flags & cv::EVENT_FLAG_SHIFTKEY) { // SHIFTキーが押されていたら直線を引く cv::line(image, cv::Point(x0, y0), cv::Point(x, y), cv::Scalar::all(255), 1, cv::LINE_AA); } cv::circle(image, cv::Point(x, y), 5, cv::Scalar::all(255), -1, cv::LINE_AA); cv::imshow("画像", image); x0 = x; y0 = y; break; case cv::EVENT_RBUTTONDOWN: // 右ボタンを押したとき break; case cv::EVENT_LBUTTONUP: // 左ボタンを離したとき break; case cv::EVENT_RBUTTONUP: // 右ボタンを離したとき break; } } // メイン関数 int main(void) { // 画像を格納するオブジェクトを宣言する cv::Mat image; // 画像ファイルから画像データを読み込む image = cv::imread("C:/opencv/sources/samples/data/lena.jpg"); if (image.empty() == true) { // 画像データが読み込めなかったときは終了する return 0; } // ウィンドウに画像を表示する cv::imshow("画像", image); // コールバック関数を登録する // # このプログラムでは、コールバック関数名を mouseCallback としている // # コールバック関数から画像データにアクセスできるように、imageをポインタで渡す cv::setMouseCallback("画像", mouseCallback, (void *)&image); // ESCキーが押されるまで待つ while(cv::waitKey() != 0x1b); return 0; } |
4.3 簡単な拡大機能つき画像表示ソフト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#include <opencv2/opencv.hpp> #define SCALE 10 #define SIZE 12 // コールバック関数 void mouseCallback(int event, int mx, int my, int flags, void *userdata) { static cv::Mat zoomImage; if (zoomImage.empty() == true) { // 拡大表示用の画像を用意する zoomImage = cv::Mat_<cv::Vec3b>((SIZE * 2 + 1)*SCALE, (SIZE * 4 + 2)*SCALE, cv::Vec3b::all(0)); } cv::Mat &image = *(cv::Mat *)userdata; // ポインタuserdataが指す画像をimageで参照する int addx = 0; if (event == cv::EVENT_LBUTTONDOWN) { // 左ボタンが押されたとき、ズームウィンドウの右側に表示する addx = SIZE * 2 + 1; } for (int y = my - SIZE; y <= my + SIZE; y++) { for (int x = mx - SIZE; x <= mx + SIZE; x++) { cv::Scalar color; if (x < 0 || y < 0 || x >= image.cols || y >= image.rows) { // 座標(x,y)が画像の範囲外であれば、黒色を設定する color = cv::Scalar::all(0); } else { // 座標(x,y)の画素値を取り出す color = image.at<cv::Vec3b>(y, x); } // 拡大表示用画像に、モザイク状に色を付ける int zx = (x - mx + SIZE + addx) * SCALE; int zy = (y - my + SIZE) * SCALE; cv::rectangle(zoomImage, cv::Rect(zx, zy, SCALE, SCALE), color, -1, cv::LINE_4); } } cv::imshow("ズーム&比較", zoomImage); } // メイン関数 int main(void) { // 画像を格納するオブジェクトを宣言する cv::Mat image; // 画像ファイルから画像データを読み込む image = cv::imread("C:/opencv/sources/samples/data/lena.jpg", cv::IMREAD_COLOR); if (image.empty() == true) { // 画像データが読み込めなかったときは終了する return 0; } // ウィンドウに画像を表示する cv::imshow("画像", image); // コールバック関数を登録する // # このプログラムでは、コールバック関数名を mouseCallback としている // # コールバック関数から画像データにアクセスできるように、imageをポインタで渡す cv::setMouseCallback("画像", mouseCallback, (void *)&image); // 何かキーが押されるまで待つ cv::waitKey(); return 0; } |