Функция сравнения регионов изображения cvMatchTemplate / OpenCV / Recog.ru - Распознавание образов для программистов


Функция сравнения регионов изображения cvMatchTemplate

void cvMatchTemplate(
	const CvArr* image,
	const CvArr* templ,
	CvArr* result,
	int method 
);

Параметры:
image – изображение, где будет осуществляться поиск (8 битное или 32-битное floating-point);
templ – искомый шаблон изображения, не больше чем image и того же типа;
result — карта результатов сравнения, одноканальный 32-битный массив с плавающей точкой. Если размеры image WxH, а templ wxh, то размер result (W-w+1)x(H-h+1);
method – метод сравнения шаблона.

Эта функция аналогична cvCalcBackProjectPatch. Она скользит по изображению, сравнивая перекрывающиеся участки размеров wxh с templ используя метод method, сохраняя результат в result. Ниже описаны формулы для сравнения (I – image, T – templ, R – result). Суммирование проводится по шаблону и/или по региону изображения по следующему пути: x' = 0..w-1, y' = 0..h-1.
method=CV_TM_SQDIFF

Здесь вычисляется квадрат отклонения, считая каждый пиксель.
method=CV_TM_SQDIFF_NORMED

Здесь вычисляется квадрат отклонения, считая каждый пиксель, но затем результат нормируется.
method=CV_TM_CCORR

Корреляция результатов в расчете на максимальный результат.

method=CV_TM_CCORR_NORMED

Корреляция результатов в расчете на максимальный результат, но затем результат нормируется.

method=CV_TM_CCOEFF

Корреляция результатов. Где

method=CV_TM_CCOEFF_NORMED


После завершения функции наилучший результат находится с помощью функции cvMinMaxLoc, причем как минимум для SQDIFF-методов, а для остальных как максимум. В случае цветного изображения каналы суммируются.

Поскольку функция перебирает все возможные результаты, то естественно она должна быть не очень быстрой. Ну и естественно она будет чувствительна к изменению наклона и размера изображения. В общем обычное «тупое» сравнении регионов изображения с шаблоном.

Ниже приведен пример работы данной функции.

IplImage *src, *templ,*result;

src = cvLoadImage("lena.JPG",1);

templ = cvLoadImage("lena_eye.JPG",1);

result = cvCreateImage(cvSize( src->width - templ->width + 1,src->height - templ->height + 1),32,1);

cvMatchTemplate( src, templ, result, CV_TM_CCOEFF_NORMED);
cvNormalize( result, result, 1, 0, CV_MINMAX );

cvShowImage( "Image", result );
double min,max;
CvPoint minpos, maxpos;
cvMinMaxLoc(result,&min,&max,&minpos,&maxpos);
printf("%5.3f; x = %d; y = %d",max,maxpos.x,maxpos.y);
cvWaitKey(0);


Шаблон:

Изображение для поиска


Результат с отмеченным точкой максимумом:


В консоль программа выдала следующее:
1.000; x = 308; y = 243

Что и следовало доказать – все работает в идеальном случае.

Комментарии (2)

RSS свернуть / развернуть
+
0
Увидел изображение для поиска с шаблоном и вдруг навеяло «автокорелляция»)))))
avatar

kweilin

  • 01 июня 2012, 13:15
+
0
Ага. Я понял о чем ты :)
avatar

vidikon

  • 01 июня 2012, 13:28

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.