前言
-
本文主要介绍opencv中图像匹配函数
-
并用示例解释和演示6中匹配方式
-
imshow的说明(为后续部分结果归一化后再显示说明原因)
1,如果原始图片是8位无符号整数,就按照原来的数字进行显示。也就是数字范围是[0,255]2,如果原始图片是16位无符号整数或者32位整数,就除以256进行显示。也就是说0到256*256的范围被压缩到0到255。
3,如果图片是32位或者64位的浮点类型数据,那么像素值就会乘以255。也就是说,0到1的范围被映射到0到255.
函数讲解
- opencv实现了一部分通过模板与目标图像进行寻找最佳匹配的方面matchTemplat() , 函数声明如下所示
void cv::matchTemplate(
cv::InputArray image, // 用于搜索的输入图像
cv::InputArray teml, // 用于匹配的模板,和image类型相同
cv::OutputArray result, // 匹配结果图像, 类型 32F
int method // 用于比较的方法,opencv提供6种
}
- 函数调用方式为
- source_image是原图
- template_image是选取的需要匹配的特征图
- target_image是存储匹配值的结果图
matchTemplate(source_image, template_image, target_image, TM_CCOEFF_NORMED);//匹配函数调用
double minVal, maxVal; //用于存储匹配值的最大值和最小值
Point minLoc, maxLoc; //用于存储匹配最大值的位置和最小值的位置
//寻找最佳匹配位置
minMaxLoc(target_image, &minVal, &maxVal, &minLoc, &maxLoc);
//画圈标出匹配点,这里使用maxLoc还是minLoc和选择的匹配method有关
circle(source_image, Point(maxLoc.x + template_image.cols / 2, maxLoc.y + template_image.rows / 2), 10, Scalar(0, 0, 255), 2, 8, 0);
我们将尝试用不同方式来匹配图片中的黄色物品

opencv支持的比较方法有6种
TM_SQDIFF
- 基本概念:该方法使用平方差进行匹配,因此最佳的匹配结果在结果为0处,值越大匹配结果越差。
- 该方法使用基本的平方差,就是将要匹配的template图片放在一张图上扫描,最好的匹配结果就是0

- 右图是将匹配矩阵中的值映射到0 ---- 1之间显示的,因为需要使用 imshow 对其进行显示
- 可以看到,左图显示,用该方法能够较好实现匹配。匹配的值越大,图像越亮。从右图中,我们可以看到匹配结果,手中物品匹配结果呈黑色,因此差距很小。
- 该方法使用基本的平方差,就是将要匹配的template图片放在一张图上扫描,最好的匹配结果就是0
TM_SQDIFF_NORMED
-
基本概念:该方法使用归一化的平方差进行匹配,最佳匹配也在结果为0处。
-
这个公式中可以将 T , I T , I T,I 的每个值排列起来看作一个向量,公式可以转化为 R = ∣ T − I ∣ 2 ∣ T ∣ ∣ I ∣ R = \frac{|T-I|^2}{|T|\,|I|} R=∣T∣
-

本文深入介绍了OpenCV中的图像匹配函数`matchTemplate()`,通过6种不同的匹配方法(TM_SQDIFF, TM_SQDIFF_NORMED, TM_CCORR, TM_CCORR_NORMED, TM_CCOEFF, TM_CCOEFF_NORMED)进行图像匹配,并通过示例展示其效果。讨论了每种方法的原理和适用场景,如平方差匹配和相关性匹配。同时,文章还探讨了模板图像亮度和大小变化对匹配结果的影响,揭示了不同方法的稳健性。

3310

被折叠的 条评论
为什么被折叠?



