템플릿 매칭은 원본 이미지에서 템플릿 이미지와 일치하는 영역을 찾는 알고리즘입니다. 원본 이미지 위에 템플릿 이미지를 놓고 조금씩 이동해가며 이미지 끝에 도달할 때 까지 비교해 찾아갑니다. 이 방식을 통해, 템플릿 이미지와 동일하거나, 가장 유사한 영역을 원본 이미지에서 검출합니다.
OpenCV 함수를 이용하여 템플릿 매칭 을 하는 간단한 코드를 작성 합니다.
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
using namespace cv;
class cvTimerCustom {
public:
cvTimerCustom(string name) {
this->name = name;
tm.start();
}
~cvTimerCustom() {
tm.stop();
double average_time = tm.getTimeSec() / tm.getCounter();
std::cout << name << " - " << "Average time in second per iteration is: " << average_time << std::endl;
}
private:
string name;
TickMeter tm;
};
#define CV_STOPWATCH(arg) cvTimerCustom(arg)
int main()
{
Mat img, templ, result;
double minVal, maxVal;
Point minLoc, maxLoc, matchLoc;
img = imread( "source.jpg", 1 );
templ = imread( "pat.jpg", 1 );
Mat img_display;
img.copyTo( img_display );
int result_cols = img.cols - templ.cols + 1;
int result_rows = img.rows - templ.rows + 1;
result.create( result_rows, result_cols, CV_32FC1 );
matchTemplate( img, templ, result, TM_CCOEFF_NORMED );
normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );
minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
matchLoc = maxLoc;
rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), 0xff00ff, 2, 8, 0 );
imshow( "source", img_display );
imshow( "match", templ );
waitKey(0);
return 0;
return 0;
}
타이머 사용하기 TickMeter class - OpenCV (0) | 2021.02.14 |
---|---|
비사실적 렌더링 Non-Photorealistic Rendering - OpenCV (0) | 2021.02.14 |
OpenCV로 이미지 출력 하기 (0) | 2021.02.14 |
AVI 출력 하기 (0) | 2021.02.14 |
CMYK 가산 혼합 (0) | 2021.02.14 |
댓글 영역