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

发布于:2024-05-22 ⋅ 阅读:(139) ⋅ 点赞:(0)

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.

网站公告

今日签到

点亮在社区的每一天
去签到