【OpenCV 基础知识 7】模板匹配
opencv
OpenCV: 开源计算机视觉库
项目地址:https://gitcode.com/gh_mirrors/opencv31/opencv

·
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.




OpenCV: 开源计算机视觉库
最近提交(Master分支:9 个月前 )
32598639
imgproc: vectorize cv::createHanningWindow #27368
### Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [ ] There is a reference to the original bug report and related work
- [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [ ] The feature is well documented and sample code can be built with the project CMake
11 小时前
7f4c89c7
hal/riscv-rvv: disable integral for now 12 小时前
更多推荐
所有评论(0)