前回インストールを行ったOpenCVライブラリを使ってサンプルプログラムをいくつか作成してみましょう。
OpenCVはすごく有名な画像処理ライブラリなのでインターネットで探せばサンプルプログラムはたくさん見つかります。
ざっくり動作確認をしたらあとは利用したい目的に合わせてプログラミングしていくと良さそうです。
今回のプロジェクト作成環境は
・Visual Studio 2017
・C++
としてプロジェクトの作成から確認していきます!
Contents
OpenCVサンプルプログラムのソリューションを作成しよう!
プロジェクトを作成しよう!
さて、まずはC++プロジェクトの作成からしていきましょう。
- Visual Studio 2017を起動し、[ファイル]-[新規]-[プロジェクト]をクリックします。
- [Win32 コンソールアプリケーション]を指定し、任意のプロジェクト名・ソリューション名を入力します。
今回はプロジェクト名「1stChallenge」、ソリューション名「OpenCV」を設定します。
- アプリケーションウィザードダイアログの[ようこそ]画面では、[次へ]をクリック
- アプリケーション設定では、アプリケーションの種類「コンソールアプリケーション」
追加のオプション「空のプロジェクト」にチェックを付け、[完了]クリック
- ソリューションエクスプローラーから「1stChallenge」を右クリックし、[追加]-[新しい項目]をクリック
- ソースファイル「main.cpp」を追加します。
このブログを見に来てくださっている方には冗長かもしれませんネ…。
インクルードディレクトリーの追加やライブラリディレクトリーの追加を行う前に、.cppファイルを追加しておくのが1つのポイントでしょうか。
プロジェクトにOpenCVを認識させる設定を行おう!
続いてOpenCVのヘッダーファイルやライブラリファイルの場所を指定します。
- ソリューションエクスプローラーから「1stChallenge」を右クリックし、[プロパティ]クリック
- 左側メニューから[C/C++]を選択、右側の[追加のインクルードディレクトリ」にOpenCVのヘッダーファイルの場所を指定します。
前回の記事での環境を例にすると「D:\opencv-2.4.13.2\install\include]ですネ。
- 続いて、左側メニューから「リンカー」を選択、「追加のライブラリディレクトリ」にOpenCVのライブラリファイルの場所を指定します。
前回の記事での環境を例にすると「D:\opencv-2.4.13.2\install\x86\vc15\lib]です。
- [OK]ボタンをクリックし、プロパティの設定ダイアログを閉じます。
これでOpenCVを利用するための準備が整いました。
早速サンプルプログラムを作成してみましょう。
サンプルプログラムを作ってみよう!
冒頭でお話した通り、表示や回転などのサンプルプログラムはインターネット上でたくさん見つかるはずです。
ここでは簡単にソースコードを記載し動作の確認のみをしていきます!
今回使用する画像はレナさんにお願いしようと思います。
レナ・ソーダバーグ
レナ(画像データ)
下記のサンプルプログラムのように”lenna.jpg”と指定し、VC上から表示する場合は、プロジェクトファイル(.vcxproj)と同じフォルダーに画像を配置してくださいネ。
実行ファイル(Debug/Releaseフォルダー)から実行する場合は、実行ファイル(.exe)と同じフォルダーに配置してください。
画像を表示してみよう!
0 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 |
#include <iostream> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #if defined _DEBUG #define CV_EXT "d.lib" #else #define CV_EXT ".lib" #endif #pragma comment(lib, "opencv_core2413" CV_EXT) #pragma comment(lib, "opencv_imgproc2413" CV_EXT) #pragma comment(lib, "opencv_highgui2413" CV_EXT) int main() { cv::Mat srcImg = cv::imread("lenna.jpg"); if (srcImg.empty()) return 1; cv::namedWindow("image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO); cv::imshow("image", srcImg); cv::waitKey(); return 0; } |
画像を回転してみよう!
0 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 |
#include <iostream> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #if defined _DEBUG #define CV_EXT "d.lib" #else #define CV_EXT ".lib" #endif #pragma comment(lib, "opencv_core2413" CV_EXT) #pragma comment(lib, "opencv_imgproc2413" CV_EXT) #pragma comment(lib, "opencv_highgui2413" CV_EXT) int main() { cv::Mat srcImg = cv::imread("lenna.jpg"); if (srcImg.empty()) return 1; cv::Point2f center = cv::Point2f( static_cast<float>(srcImg.cols / 2), static_cast<float>(srcImg.rows / 2)); double degree = 45.0; // 回転角度 double scale = 1.0; // 拡大率 // アフィン変換行列 cv::Mat affine; cv::getRotationMatrix2D(center, degree, scale).copyTo(affine); cv::warpAffine(srcImg, srcImg, affine, srcImg.size(), cv::INTER_CUBIC); cv::namedWindow("image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO); cv::imshow("image", srcImg); cv::waitKey(); return 0; } |
画像を拡大・縮小してみよう!
0 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 |
#include <iostream> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #if defined _DEBUG #define CV_EXT "d.lib" #else #define CV_EXT ".lib" #endif #pragma comment(lib, "opencv_core2413" CV_EXT) #pragma comment(lib, "opencv_imgproc2413" CV_EXT) #pragma comment(lib, "opencv_highgui2413" CV_EXT) int main() { cv::Mat srcImg = cv::imread("lenna.jpg"); if (srcImg.empty()) return 1; cv::Point2f center = cv::Point2f( static_cast<float>(srcImg.cols / 2), static_cast<float>(srcImg.rows / 2)); double degree = 0.0; // 回転角度 double scale = 1.5; // 拡大率(1.5倍) //double scale = 0.5; // 拡大率(0.5倍) // アフィン変換行列 cv::Mat affine; cv::getRotationMatrix2D(center, degree, scale).copyTo(affine); cv::warpAffine(srcImg, srcImg, affine, srcImg.size(), cv::INTER_CUBIC); cv::namedWindow("image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO); cv::imshow("image", srcImg); cv::waitKey(); return 0; } |
1.5倍
0.5倍
画像を二値化してみよう!
0 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 |
#include <iostream> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #if defined _DEBUG #define CV_EXT "d.lib" #else #define CV_EXT ".lib" #endif #pragma comment(lib, "opencv_core2413" CV_EXT) #pragma comment(lib, "opencv_imgproc2413" CV_EXT) #pragma comment(lib, "opencv_highgui2413" CV_EXT) int main() { cv::Mat srcImg = cv::imread("lenna.jpg", cv::IMREAD_GRAYSCALE); if (srcImg.empty()) return 1; // 閾値以下は0に、それ以外は第4引数で指定した値にして二値化 // 閾値は大津アルゴリズムにより最適な値を設定 cv::threshold(srcImg, srcImg, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU); cv::namedWindow("image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO); cv::imshow("image", srcImg); cv::waitKey(); return 0; } |
まとめ
うまく実行できたでしょうか?
各関数の詳しい説明などは省いていますが、使用している関数を検索すると有益な情報が多々得られると思うので、+αの処理を行いたい場合などはぜひ調べてみてくださいネ。