【OpenCV 基础知识 7】模板匹配

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.
  • 26
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D-Nolan

请我喝杯咖啡吧,鼓励一下创作!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值