当前位置: 欣欣网 > 码农

多角度、多尺度、多目标的边缘模板匹配

2024-02-11码农

点击上方 蓝字 关注我们

微信公众号: OpenCV学堂

关注获取更多计算机视觉与深度学习知识

算法说明

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

然后计算NCC开启匹配搜索:

代码实现与演示

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

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

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

task.initailization(tpl);
task.detect(target, results);
for (auto item : results) {
for (auto pt : item.pts) {
cv::circle(result, pt, 1, cv::Scalar(02550), 18);
}
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(00255), 28);
}
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(25500), 18);
}

Qt C++ 客户端演示:

系统化学习直接扫码查看

推荐阅读