【原理解密】多角度、多尺度、多目标的边缘模板匹配

简介: 【原理解密】多角度、多尺度、多目标的边缘模板匹配

边缘模板匹配的基本原理

OpenCV中自带的模板匹配算法,完全是像素基本的模板匹配,特别容易受到光照影响,光照稍微有所不同,该方法就会歇菜了!搞得很多OpenCV初学者刚学习到该方法时候很开心,一用该方法马上很伤心,悲喜交加,充分感受到了理想与现实的距离,不过没关系,这里介绍一种新的模板匹配算法,主要是基于图像边缘梯度,它对图像光照与像素迁移都有很强的抗干扰能力,在工业应用场景中已经得到广泛使用。基本原理主要是基于梯度跟边缘实现NCC计算与匹配,首先计算梯度:


然后基于梯度,实现非最大抑制与边缘提取以后,就得到了所有的边缘点集,每个边缘点有三个值,分别是:

x方向梯度、

y方向梯度、

xy方向梯度

然后对输入的每张图像,根据模板图像的每个边缘点计算NCC,得到匹配阈值,开启匹配搜索:


如果其中任何一个点的匹配阈值小于minScore就停止搜索与匹配当前像素点,继续搜索下一个,直到遍历完成所有像素点,得到匹配得分图像。然后采用跟NCC相似的处理,去重以后得到最终匹配结果。

代码实现与演示

说实话我也不是从零开始的,之前我写过一个版本,但是我发现一个别人写好的一个原始版本,好像是这个算法的作者自己写,基于OpenCV3.x版本完成的,链接如下:

https://github.com/daxiaHuang/edge-template-match/tree/master

同时原始版本 不支持 多角度、多对象、多尺度,所以我在这个上面一通狂改,就让它各种支持了,这个大概花了我三天时间。最终我给他们封装成两个类,配合上Qt C++ 的一个界面,通过点点鼠标即可运行。客户端直接调用API即可,客户端代码如下:

task.initailization(tpl);
double start = (double)cv::getTickCount();
task.detect(target, results);
float time = (((double)cv::getTickCount() - start)) / cv::getTickFrequency();
std::cout << "edge template match execute time: " << time << std::endl;
for (auto item : results) {
  for (auto pt : item.pts) {
    cv::circle(result, pt, 1, cv::Scalar(0, 255, 0), 1, 8);
  }
  cv::RotatedRect rrt = cv::minAreaRect(item.pts);
  cv::Point2f minbox[4];
  rrt.points(minbox);
  for (int r = 0; r < 4; r++)
  {
    cv::line(result, minbox[r], minbox[(r + 1) % 4], cv::Scalar(0, 0, 255), 2, 8);
  }

  std::cout << "conf: " << item.conf << std::endl;
  cv::putText(result, cv::format("conf:%.2f, angle:%d", item.conf, item.angle), item.center, cv::FONT_HERSHEY_SIMPLEX, .5, cv::Scalar(255, 0, 0), 1, 8);
}

cv::imshow("边缘模板匹配", result);
cv::waitKey(0);

边缘匹配运行结果 - 测试一

速度测试数据:执行时间: 126.06 ms

速度测试数据:执行时间: 229.82 ms

速度测试数据:执行时间: 117.60 ms

速度测试数据:执行时间: 405.60 ms

最后一张测试目标图像大小为 830x822,目标数目为13

最后说明

演示基于QT + OpenCV C++ 完成,源码购买站内私信博主即可!

相关文章
|
8月前
|
存储 机器学习/深度学习 搜索推荐
探索医学影像:如何通过ROI灰度直方图和ROI区域方格图揭示隐秘细节?
探索医学影像:如何通过ROI灰度直方图和ROI区域方格图揭示隐秘细节?
276 1
|
监控 算法 安全
基于伽马变换自适应修正的全景首尾融合算法
基于伽马变换自适应修正的全景首尾融合算法
|
8月前
|
机器学习/深度学习 编解码 人工智能
论文介绍:HigherHRNet——用于自下而上人体姿态估计的尺度感知表示学习
【5月更文挑战第22天】HigherHRNet是针对自下而上人体姿态估计的尺度感知方法,通过构建高分辨率特征金字塔,改善多尺度人体姿态估计的准确性。该论文提出的新架构在COCO测试集上提高了2.5%的中号人物平均精度,达到70.5%的AP,且在CrowdPose上超越所有自上而下方法,实现67.6%的AP。作者通过消融实验验证了各个组件的重要性,并指出未来可优化模型以适应更复杂场景。论文链接:[https://arxiv.org/abs/1908.10357](https://arxiv.org/abs/1908.10357)
56 1
【分布鲁棒】多源动态最优潮流的分布鲁棒优化方法
【分布鲁棒】多源动态最优潮流的分布鲁棒优化方法
|
8月前
|
人工智能 vr&ar 开发者
大型多视角高斯模型LGM:5秒产出高质量3D物体
【2月更文挑战第9天】大型多视角高斯模型LGM:5秒产出高质量3D物体
108 1
大型多视角高斯模型LGM:5秒产出高质量3D物体
|
机器学习/深度学习 算法 计算机视觉
基于多注意力融合的抗遮挡目标跟踪算法综述
基于多注意力融合的抗遮挡目标跟踪算法综述
670 0
基于多注意力融合的抗遮挡目标跟踪算法综述
|
机器学习/深度学习 存储 运维
使用单类全卷积数据描述异常检测网络检测药丸图像上的缺陷
使用单类全卷积数据描述 (FCDD) 异常检测网络检测药丸图像上的缺陷。
185 0
|
机器学习/深度学习 编解码 计算机视觉
3D目标检测改进提升 | PointPillar在域自适应的改进DASE-ProPillars(二)
3D目标检测改进提升 | PointPillar在域自适应的改进DASE-ProPillars(二)
576 0
|
机器学习/深度学习 传感器 存储
3D目标检测改进提升 | PointPillar在域自适应的改进DASE-ProPillars(一)
3D目标检测改进提升 | PointPillar在域自适应的改进DASE-ProPillars(一)
218 0
|
机器学习/深度学习 固态存储
姿态估计 | 基于CenterNet究竟还可以做多少事情?AdaptivePose便是经典!(二)
姿态估计 | 基于CenterNet究竟还可以做多少事情?AdaptivePose便是经典!(二)
94 0