OpenCVで複数のテンプレートマッチングする方法

こんにちは。
くろんです!

今回はOpenCVを使って画像中から複数のテンプレートマッチングを行います。

今回はサンプル画像はこちら

かえるのうたの歌詞がのった画像を用意しました!!

こちらのサンプルから「ワ」を切り出した下のようなマッチング用画像を作りました、
サンプル画像から「ワ」をすべて抽出したいと思います。


#include <vector>
#include "opencv2/opencv.hpp"

int main()
{
	cv::Mat src = cv::imread("カエルの歌.png");
	cv::Mat key = cv::imread("カエルの歌KEY.png");

	cv::Mat res;
	cv::matchTemplate(src, key, res, cv::TM_CCOEFF_NORMED);

	std::vector<cv::Point> locs;

	for (int y = 0; y < res.rows; y++) {
		for (int x = 0; x < res.cols; x++) {
			uchar* uctemp = &amp;res.data[y * res.cols * 4 + x * 4];
			float* ftemp = (float*)(uctemp);
			if (*ftemp > 0.95) {
				bool isExist = false;
				for (auto ml : locs) {
					// 今までに見つかった場所からある程度離れないと検出扱いにしない.
					int d = pow(y - ml.y, 2) + pow(x - ml.x, 2);
					if (d < 10) {
						isExist = true;
					}
				}

				if (!isExist) {
					locs.push_back(cv::Point(x, y));
				}
			}
		}
	}

	for(auto l : locs) {
		cv::rectangle(src, cv::Rect(l.x, l.y, key.cols, key.rows),
										cv::Scalar(0, 0, 255));
	}

	cv::imshow("result", src);

	cv::waitKey();

	return 0;
}

結果はこんな感じになります。

しっかり「ワ」の場所だけ抽出できているかと思います。

以上

では!

投稿者: くろん

GitHub: https://github.com/ckron

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください