openCv之模型匹配及遇到的一些疑惑

图像处理之 模型匹配有关知识
在这里插入图片描述

1.相关API:在这里插入图片描述
2.模板匹配的几种算法:
在这里插入图片描述
在这里插入图片描述
1.平方差匹配method=CV_TM_SQDIFF,
2.标准平方差匹配method=CV_TM_SQDIFF_NORMED
(这类方法利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大.)

3.相关匹配method=CV_TM_CCORR,
4.标准相关匹配method=CV_TM_CCORR_NORMED
(这类方法采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果.)

5.相关系数匹配method=CV_TM_CCOEFF。这类方法将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列).

6.标准相关系数匹配method=CV_TM_CCOEFF_NORMED

备注:除了1,2两种平方差匹配值越低匹配度越好,其余几种值越高越好
程序

#include "stdafx.h"

//本节讲述 图像处理之 模型匹配;
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace std;
using namespace cv;

void hist_And_Backprojection(int, void*);

Mat src, test1, test2, dst, gray_src,temp;
char input_title[] = "原图";
int match_method = CV_TM_SQDIFF;
int max_track = 5;
void Match_Demo(int,void*);

int main(int argc, char**argv)
{
	src = imread("C:/Users/Rubison.DELL/Desktop\\杂物/壁纸/女团.jpg");    //待检测图 
	temp = imread("C:/Users/Rubison.DELL/Desktop\\杂物/壁纸/女团2.png");  //特征
	if (src.empty()||temp.empty())
	{
		printf("could not load image...\r\n");
		return -1;
	}

	namedWindow(input_title, CV_WINDOW_AUTOSIZE);
	imshow(input_title, src);
	imshow("目标", temp);

//	const char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
	const char*trackbar_title = "Match Alog Type ";
	createTrackbar(trackbar_title, input_title, &match_method, max_track, Match_Demo);
	Match_Demo(0, 0);
	
	waitKey(0);
	destroyAllWindows();
	return 0;

}

void Match_Demo(int, void*)
{
	int width = src.cols - temp.cols + 1;    //模板的宽和高
	int height = src.rows - temp.rows + 1;
	Mat result(width,height,CV_32FC1);

	matchTemplate(src, temp, result, match_method);
	normalize(result,result,0,1,NORM_MINMAX);
	//找出匹配位置
	Point minLoc;
	Point maxLoc;
	Point temLoc;
	double max, min;
	src.copyTo(dst);
	minMaxLoc(result,&min,&max,&minLoc,&maxLoc);     //在矩阵中需找全局的最大最小数。
	if (match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED)
	{
		temLoc = minLoc;
	}
 //几种不同的匹配方法,结果不同,利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大.
	else
	{
		temLoc = maxLoc;
	}

	rectangle(dst, Rect(temLoc.x, temLoc.y,temp.cols,temp.rows),Scalar(0,2555,0),2,8);
	rectangle(result, Rect(temLoc.x, temLoc.y, temp.cols, temp.rows), Scalar(0, 2555, 0), 2, 8);
	imshow("结果",result);
	imshow("匹配", dst);
}
	

程序运行结果
在这里插入图片描述
疑问:temp是姚明,为什么却变成了老黑?换张图试试
在这里插入图片描述
问题还是存在,然后扩大选择的区域,即temp尺寸变大在这里插入图片描述
完成:原因;可能是目标特征不够明显,尽量选择较大尺寸或区域。

备注:
1.理论参考文章:参考1
2.minMaxLoc()函数知识补充minMaxLoc 和 minMaxIdx的比较
3.补充:,当前的模板匹配算法都是使用固定大小的模板图,将模板图覆盖在待匹配图.上不断移动,再使用相似度度量方法来确定模板图移动到待匹配图的哪个位置时与重叠的区域最为相似,最相似的
重叠区域即是提取到的ROI,这样只匹配一次的方法提取到的ROI大小和模板图的大小完全相等。在实际拍摄时,当相机距离目标较远,
该匹配算法在进行匹配时,模板图与待匹配图中的目标由于尺寸大小不同,就会导致匹配失败,从而造成上述匹配失败的结果。(2022.1.12)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
OpenCV(Open Source Computer Vision Library)是一个广泛使用的计算机视觉库,提供了许多强大的功能,包括模型匹配模型匹配主要是为了在图像中寻找预定义的对象或模板。OpenCV中的模型匹配算子主要包括以下几个: 1. **Brute-Force Matcher**(暴力匹配器):这是最基础的匹配方法,通过逐个比较模板中的每个像素点来寻找最佳匹配。虽然效率不高,但对于小尺寸模板和简单场景适用。 2. **Flann-Based Matcher**(基于FLANN的匹配器):FLANN (Fast Library for Approximate Nearest Neighbors) 提供了高效的近似最近邻搜索算法,适用于大尺寸模板或实时应用,能够快速找到可能的匹配。 3. **ORB (Oriented FAST and Rotated BRIEF)**:ORB结合了特征检测(FAST关键点)和描述符(BRIEF),适合于旋转不变性和性能的要求。 4. **SIFT (Scale-Invariant Feature Transform)** 和 **SURF (Speeded Up Robust Features)**:这两种高级的特征提取和描述符方法对尺度变化和图像旋转有很好的鲁棒性,但计算量较大。 5. **HOG (Histogram of Oriented Gradients)**:在行人检测等任务中常用,根据梯度方向直方图来描述图像区域。 6. **Template Matching**(模板匹配):直接将模板与图像进行逐像素的比较,有诸如`matchTemplate()`、`minMaxLoc()`这样的函数支持。 7. **特征金字塔**:为了解决不同尺度下的匹配问题,可以构建特征金字塔,先从低分辨率开始匹配,再逐步细化到高分辨率。 8. **Match Descriptor Extractor**:用于从图像中提取描述符,并与模板描述符进行匹配,如BFMatcher配合LBPHFaceRecognizer。 选择哪种算子取决于具体的应用场景、性能需求以及图像内容的特点。通常需要根据实际情况进行测试和优化。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

w5875895

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值