リード開発メモ

大阪のソフトウェア会社です。 技術的な事柄についてのメモとしてブログを始めます。

2015年07月

OpenCV3を使う (その3)

今回は画像を2値化を行う。

2値化とは、濃淡のある画像をある閾値で白か黒に置き換える処理のことで、閾値の決定方法はいくつか存在する。

今回は大津のアルゴリズムを用いて最適な閾値を自動的に決定する方法と、手動で閾値を決定する方法を示す。

手動で閾値を決定する方法では、ウィンドウにスライダーを付け、スライダーを動かすことによって画像が動的に変更される。このスライダーはOpenCVが提供するコントロールである。

main.cpp を以下のように書き換える。

void onTrackbar(int thresh, void* pimg_gray)
{
	cv::Mat img_gray = *(cv::Mat*)pimg_gray;
	cv::Mat img_threshold;
	cv::threshold(img_gray, img_threshold, thresh, 255, CV_THRESH_BINARY);
	imshow("threshold_manual", img_threshold);
}

int main(int argc, char* argv[])
{
	// オリジナル画像の読み込み
	cv::Mat img_org = cv::imread("test1.JPG");
	cv::namedWindow("original");
	imshow("original", img_org);

	// グレースケール
	cv::Mat img_gray;
	cv::cvtColor(img_org, img_gray, CV_BGR2GRAY);
	cv::namedWindow("grayscale");
	imshow("grayscale", img_gray);

	// 画像の二値化(大津)
	cv::Mat img_threshold;
	cv::threshold(img_gray, img_threshold, 0, 255, CV_THRESH_OTSU | CV_THRESH_BINARY);
	cv::namedWindow("threshold_otsu");
	imshow("threshold_otsu", img_threshold);

	// 画像の二値化(手動)
	cv::namedWindow("threshold_manual");
	int value = 0;
	cv::createTrackbar("threshold", "threshold_manual", &value, 255, onTrackbar, &img_gray);
	cv::setTrackbarPos("threshold", "threshold_manual", 60);

	cv::waitKey(0);
	cv::destroyAllWindows();
	return 0;
}


実行すると、ダイアログが3つ表示される。これは元画像。
opencv9

threshold_otsu が大津のアルゴリズムを使ったもの。この例では閾値は140くらいだと思うが、「Harry Potter」の文字が若干読みにくい。「Graphic Designer」に至っては判別できない。
opencv11

こちらはスライダーを用いた手動で閾値を設定するもの。初期値を60にしたところ。「Graphic Designer」は読めるが、「Harry Potter」の文字が白く飛んでしまった。
opencv12

閾値をいくらにしても「Harry Potter」、「Graphic Designer」のどちらかが読めなくなってしまう。 opencv13

以上です。

OpenCV3を使う (その2)

今回は画像を読み込み、グレースケールをかける。

プロジェクトの設定を少し変え、デバッグ実行したとき相対パスで画像ファイルを指定できるようにしておく。

作成したプロジェクトのプロパティを開き、以下の設定を行う。
1. 構成プロパティ - デバッグ - 全般 - 作業ディレクトリに、「$(OutputPath)」を指定する。構成の Debug / Release ともこのようにしておく。

以上で設定は完了。

main.cpp を以下のように書き換える。


int main(int argc, char* argv[])
{
	// オリジナル画像の読み込み
	cv::Mat img_org = cv::imread("test1.JPG");
	cv::namedWindow("original");
	imshow("original", img_org);

	// グレースケール
	cv::Mat img_gray;
	cv::cvtColor(img_org, img_gray, CV_BGR2GRAY);
	cv::namedWindow("grayscale");
	imshow("grayscale", img_gray);

	cv::waitKey(0);
	cv::destroyAllWindows();
	return 0;
}


実行すると、次のようなダイアログが2つ表示される。こちらは元画像。
opencv9

こちらはグレースケール。
opencv10


以上です。

OpenCV3を使う (その1)

OpenCV3 を使ってみる。今回はVisual Studio 2013 で OpenCV3 の環境を作る。

OpenCVは以下からダウンロードする。
http://opencv.org/downloads.html

最新は「VERSION 3.0」なので、これの「OpenCV for Windows」をクリックし、opencv-3.0.0.exeをダウンロードする。

これは圧縮ファイルとなっているので、解凍したら、includeとx86を適当なフォルダに配置する。
今回は32bitアプリケーションを作成する予定のためx86を使った。64bitアプリケーションを作る場合はx64を使う必要がある。

次にVisual Studio 2013でC++のプロジェクトを作成する。
プロジェクトは、「Visual C++」の「Win32 コンソールアプリケーション」で、「空のプロジェクト」として作成する。

作成したプロジェクトのプロパティを開き、以下の設定を行う。
1. 構成プロパティ - C/C++ - 全般 - 追加のインクルードディレクトリに、上で解凍したincludeフォルダを指定する。
2. 構成プロパティ - リンカー - 全般 - 追加のライブラリディレクトリに、上で解凍したx86フォルダ内のvc12/staticlibフォルダを指定する。これは静的リンクをする設定なので、動的リンクをする場合はvc12/libを指定すること。
3. 構成プロパティ - C/C++ - コード生成 - ランタイムライブラリの設定を変更する。設定は Debug / Release で違う。Debug は「マルチスレッド デバッグ (/MTd)」を設定、Release では「マルチスレッド (/MT)」を設定する。
以上で設定は完了。

プロジェクトに以下の内容で main.cpp を追加する。

#include <opencv2/opencv.hpp>

#ifdef _DEBUG        
#pragma comment(lib,"opencv_core300d.lib")
#pragma comment(lib,"opencv_imgproc300d.lib")
#pragma comment(lib,"opencv_highgui300d.lib")
#pragma comment(lib,"opencv_hal300d.lib")
#pragma comment(lib,"opencv_imgcodecs300d.lib")
#pragma comment(lib,"ippicvmt.lib")
#pragma comment(lib,"IlmImfd.lib")
#pragma comment(lib,"libjasperd.lib")
#pragma comment(lib,"libjpegd.lib")
#pragma comment(lib,"libpngd.lib")
#pragma comment(lib,"libtiffd.lib")
#pragma comment(lib,"libwebpd.lib")
#pragma comment(lib,"zlibd.lib")
#else    
#pragma comment(lib,"opencv_core300.lib")
#pragma comment(lib,"opencv_imgproc300.lib")
#pragma comment(lib,"opencv_highgui300.lib")
#pragma comment(lib,"opencv_hal300.lib")
#pragma comment(lib,"opencv_imgcodecs300.lib")
#pragma comment(lib,"ippicvmt.lib")
#pragma comment(lib,"IlmImf.lib")
#pragma comment(lib,"libjasper.lib")
#pragma comment(lib,"libjpeg.lib")
#pragma comment(lib,"libpng.lib")
#pragma comment(lib,"libtiff.lib")
#pragma comment(lib,"libwebp.lib")
#pragma comment(lib,"zlib.lib")  
#endif

int main(int argc, char* argv[])
{
	cv::Mat img(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 0));
	cv::circle(img, cv::Point(80, 80), 60, cv::Scalar(0, 255, 0), 1);
	imshow("opencvtest", img);
	cv::waitKey(0);
	cv::destroyAllWindows();
	return 0;
}

実行すると、次のようなダイアログが表示されれば成功。
opencv8

以上です。

アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

livedoor 天気