cvMatchTemplate
在OpenCV中,cvMatchTemplate 函数用于在图像中搜索模板的位置。该函数通过在输入图像上滑动模板图像,并在每个位置计算相似性度量来实现模板匹配。相似性度量的计算方式由用户指定。
以下是 cvMatchTemplate 函数的基本语法:
result = cv2.matchTemplate(image, templ, method[, result[, mask]])
- image:输入图像,大图。
- templ:模板图像,要在输入图像中搜索的小图。
- method:相似性度量的计算方法,可以是 cv2.TM_SQDIFF、cv2.TM_SQDIFF_NORMED、cv2.TM_CCORR、cv2.TM_CCORR_NORMED、cv2.TM_CCOEFF 或 cv2.TM_CCOEFF_NORMED 之一。
- result(可选):输出的匹配结果图像。
- mask(可选):用于指定要在输入图像上执行模板匹配的区域。如果不指定,整个图像将被使用。
完整示例代码
program cv_MatchTemplate;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
ocv.highgui_c,
ocv.core_c,
ocv.core.types_c,
ocv.imgproc_c,
ocv.imgproc.types_c,
uResourcePaths,
CnDebug;
var
imgBg, imgMove, imgMat: PIplImage;
imgBg_gray, imgMove_gray: PIplImage;
min: double;
p1, p2: TCvPoint;
bg_edge, move_edge: PIplImage;
gray, dst: PIplImage;
const
cResourceMedia1 = 'c:\';
begin
imgBg := cvLoadImage(cResourceMedia1 + '111.png');
imgMove := cvLoadImage(cResourceMedia1 + '222.png');
// 创建图像存放灰度图
imgBg_gray := cvCreateImage(cvGetSize(imgBg), IPL_DEPTH_8U, 1);
imgMove_gray := cvCreateImage(cvGetSize(imgMove), IPL_DEPTH_8U, 1);
// 创建图像存放边缘图
bg_edge := cvCreateImage(cvGetSize(imgBg), IPL_DEPTH_8U, 1);
move_edge := cvCreateImage(cvGetSize(imgMove), IPL_DEPTH_8U, 1);
// 两张图像灰度化
cvCvtColor(imgBg, imgBg_gray, CV_RGB2GRAY);
cvCvtColor(imgMove, imgMove_gray, CV_RGB2GRAY);
// 边缘检测
cvCanny(imgBg_gray, bg_edge, 10, 100, 3);
cvCanny(imgMove_gray, move_edge, 10, 100, 3);
// 创建稍小一点的图片 必须IPL_DEPTH_32F不然报错
imgMat := cvCreateImage(CvSize(bg_edge.Width - move_edge.Width + 1, bg_edge.Height - move_edge.Height + 1), IPL_DEPTH_32F, 1);
try
cvNamedWindow('bg_edge');
cvNamedWindow('move_edge');
cvNamedWindow('Match');
cvNamedWindow('Result');
cvShowImage('bg_edge', bg_edge);
cvShowImage('move_edge', move_edge);
cvMatchTemplate(bg_edge, move_edge, imgMat, CV_TM_CCOEFF_NORMED);
cvShowImage('Match', imgMat);
// 寻找结果矩阵中的最小值
cvMinMaxLoc(imgMat, @min, @min, nil, @p1, nil);
p2.X := p1.X + move_edge.Width - 1;
p2.Y := p1.Y + move_edge.Height - 1;
// 画一个红色矩形
cvRectangle(imgBg_gray, p1, p2, CV_RGB(255, 0, 0));
cvShowImage('Result', imgBg_gray);
cvWaitKey(0);
finally
cvReleaseImage(bg_edge);
cvReleaseImage(move_edge);
cvReleaseImage(imgMat);
cvDestroyAllWindows;
end;
end.