OpenCV4.5.5学习笔记(十九):反向投影和模板匹配

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

笔者本科时候有幸接触了OpenCV3.2.0版本的学习,后因考研压力不得不暂时停下学习的脚步,现在考研任务结束了,未来的导师也是从事的该方向,笔者又开始了新一轮的学习。回来发现OpenCV已经出到了4.5.5版本,遂重新下载新版本并决定记录这一学习历程。由于笔者水平有限,可能有错误之处还请诸位大佬多多包涵并烦请指出,让我们一起学习,共同进步。
首先需要说明的是:我是按着毛星云前辈编写的OpenCV3编程入门进行学习的,我会尽力把星云前辈的程序转成符合OpenCV4.5.5版本的。毛星云前辈于2021年12月11日不幸过世,他是我非常敬仰的一位业内大佬,我也是看他的书才开始接触OpenCV。


一、反向投影

反向投影是一种记录给定图像的像素与直方图模型中像素分布的匹配程度的方法。
工作原理:
我们想要做的是使用我们的模型直方图(代表皮肤色调)来检测测试图像中的皮肤区域。以下是检测步骤

  1. 在我们测试图像的每个像素(p(i,j))中,获取色调数据并找到该色调((hi,j,si,j))对应的在直方图中的 bin 位置。
  2. 在对应的 bin 中查找模型直方图,并读取 bin 值。
  3. 将此 bin 值存储在新图像 ( BackProjection )
    中。此外,您可以考虑首先对模型直方图进行归一化,以便您可以看到测试图像的输出。
  4. 应用上述步骤,我们为我们的测试图像获得以下 BackProjection 图像(来源于官网):
    在这里插入图片描述

计算反向投影,我们常用的是calcBackProject()函数
函数cv::calcBackProject计算直方图的反投影。也就是说,与calcHist类似,在每个位置 (x, y),该函数从输入图像中的选定通道收集值并找到相应的直方图 bin。但该函数不是递增它,而是读取 bin 值,按 scale 对其进行缩放,然后存储在 backProject(x,y) 中。在统计方面,该函数根据直方图表示的经验概率分布计算每个元素值的概率。例如,看看如何在场景中找到并跟踪颜色鲜艳的对象:
在跟踪之前,将对象展示给相机,使其几乎覆盖整个画面。计算色调直方图。直方图可能有很强的最大值,对应于对象中的主色。
跟踪时,使用预先计算的直方图计算每个输入视频帧的色调平面的反投影。对背投影设置阈值以抑制较弱的颜色。抑制色彩饱和度不足以及像素太暗或太亮的像素也可能有意义。
在生成的图片中找到连接的组件,并选择例如最大的组件。
这是 CamShift 颜色对象跟踪器的近似算法。
在OpenCV官方文档中是这么写的:
void cv::calcBackProject (
const Mat * images,
int nimages,
const int * channels,
InputArray hist,
OutputArray backProject,
const float ** ranges,
double scale = 1,
bool uniform = true
)

第一个参数是源数组,
第二个参数是源图像的数量,
第三个参数是用于计算反投影的通道列表,
第四个参数是可以密集或稀疏的输入直方图,
第五个参数是目标反投影数组,它是与 images[0] 大小和深度相同的单通道数组,
第六个参数是每个维度中直方图 bin 边界的数组数组,
第七个参数是输出反投影的可选比例因子,
第八个参数是指示直方图是否一致的标志

将输入数组中的指定通道复制到输出数组的指定通道,我们常用的是mixChannels()函数
在OpenCV官方文档中是这么写的:
void cv::mixChannels (
const Mat * src,
size_t nsrcs,
Mat * dst,
size_t ndsts,
const int * fromTo,
size_t npairs
)

第一个参数是输入数组或矩阵向量,
第二个参数是矩阵数src,
第三个参数是输出数组或矩阵向量,
第四个参数是矩阵数dst,
第五个参数是 索引对数组,指定复制哪些通道以及复制位置。
第六个参数是索引对数fromTo


二、模板匹配

1.使用函数

模板匹配是一种用于查找与模板图像(补丁)匹配(相似)的图像区域的技术。
虽然补丁必须是矩形,但可能并非所有矩形都是相关的。在这种情况下,可以使用掩码来隔离应用于查找匹配的补丁部分。
我们需要两个主要组件:
源图像(I):我们期望在其中找到与模板图像匹配的图像
模板图像 (T):将与源图像进行比较的补丁图像

我们常用的是matchTemplate()函数
将模板与重叠的图像区域进行比较。
该功能通过图像滑动,比较大小的重叠块w×h使用指定的方法对 templ 进行对比,并将比较结果存储在 result 中
在OpenCV官方文档中是这么写的:
void cv::matchTemplate (
InputArray image,
InputArray templ,
OutputArray result,
int method,
InputArray mask = noArray()
)
第一个参数是正在运行搜索的图像。它必须是 8 位或 32 位浮点数,
第二个参数是搜索到的模板,
第三个参数是比较结果图,
第四个参数是指定比较方法的参数,
第五个参数是可选掩码,它必须与 templ 具有相同的大小

扫描二维码关注公众号,回复: 14222439 查看本文章

查找数组中的全局最小值和最大值,我们常用的是minMaxLoc()函数
函数cv::minMaxLoc查找最小和最大元素值及其位置。在整个数组中搜索极值,如果 mask 不是空数组,则在指定的数组区域中搜索。
在OpenCV官方文档中是这么写的:
void cv::minMaxLoc (
InputArray src,
double * minVal,
double * maxVal = 0,
Point * minLoc = 0,
Point * maxLoc = 0,
InputArray mask = noArray()
)
第一个参数是输入单通道阵列,
第二个参数是指向返回的最小值的指针;如果不需要,则使用 NULL,
第三个参数是指向返回最大值的指针;如果不需要,则使用 NULL,
第四个参数是指向返回的最小位置的指针(在 2D 情况下);如果不需要,则使用 NULL,
第五个参数是向返回的最大位置的指针(在 2D 情况下);如果不需要,则使用 NULL,
第六个参数是用于选择子数组的可选掩码

2.可用方法

  1. 平均差匹配法method=TM_SQDIFF
    在这里插入图片描述

  2. 归一化平均差匹配法method=TM_SQDIFF_NORMED
    在这里插入图片描述

  3. 相关匹配法method=TM_CCORR
    在这里插入图片描述

  4. 归一化相关匹配法method=TM_CCORR_NORMED
    在这里插入图片描述

  5. 系数匹配法method=TM_CCOEFF
    在这里插入图片描述

  6. 化相关系数匹配法method=TM_CCOEFF_NORMED
    在这里插入图片描述


总结

模板匹配试验(星云前辈程序):
原图:
在这里插入图片描述
目标:
在这里插入图片描述
匹配结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43264167/article/details/124550411