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;
}

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

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

以上

では!