使用Qt+OpenCV自己写了一个带旋转角度的NCC灰度模板匹配算子以及它的演示软件。算子的原理是基于NCC灰度匹配。
一、什么是NCC匹配
1、基于Normalized cross correlation(NCC:归一化互相关)用来比较两幅图像的相似程度已经是一个常见的图像处理手段。在工业生产环节检测、监控领域对对象检测与识别均有应用。NCC算法可以有效降低光照对图像比较结果的影响。而且NCC最终结果在0到1之间,所以特别容易量化比较结果,只要给出一个阈值就可以判断结果的好与坏。
2、在opencv代码中,matchTemplate函数里面有个方法是cv::TM_CCOEFF_NORMED,它实现了NCC算子。CCOEFF的英文全称是:Correlation Coefficient,中文译为相关系数;NORMED是归一化的意思。但是该函数本身是不支持旋转角度和金字塔分级的,所以需要自己实现这些功能。matchTemplate函数保存在源码文件imgproc文件夹下的templmatch.cpp中。
https://github.com/opencv/opencv/blob/4.5.5/modules/imgproc/src/templmatch.cpp
3、 matchTemplate函数各个方法的计算公式如下:请重点关注NCC算子的计算方式cv::TM_CCOEFF_NORMED。公式摘录自《学习OpenCV 3》第13章,模板匹配。
二、该演示软件实现的主要功能:(未使用商业图像处理库,而是纯粹Qt+OpenCV)
1、NCC匹配
2、金字塔
3、最大重叠率
4、旋转角度
5、匹配分数
6、不支持缩放
7、模板文件读写
8、ROI框选功能,人机交互
三、部分头文件:
创建模板,对照学习halcon的算子create_ncc_model
查找物体,对照学习halcon的算子find_ncc_model
#ifndef CNCCMATCH_H
#define CNCCMATCH_H
#include "nccmodelid.h"
#include "result.h"
class VISIONCORE_EXPORT CNccMatch
{
public:
CNccMatch();
virtual ~CNccMatch();
public:
void createNccModel(const cv::Mat &imageModel, int numLevels, double angleStart, double angleExtent, double angleStep, CNCCModelID &modelID);
void findNccModel(const cv::Mat &imageSearch, const CNCCModelID &modelID, double angleStart, double angleExtent, double minScore, int numMatches, double maxOverlap, int numLevels,
std::vector<int> &vtRow, std::vector<int> &vtColumn, std::vector<double> &vtAngle, std::vector<double> &vtScore);
private:
void multipleMaxLoc(const cv::Mat &image, double minScore, int numMatches, std::vector<cv::Point> &vtLocations, std::vector<double> &vtMaxima);
void imageRotate(cv::Mat &imageSrc, double angle, cv::Mat &imageDst, cv::Mat &mask);
void clusterAnalyze(const std::vector<SMatchResult> &vtSrc, std::vector<SMatchResult> &vtDst, double disThreshold = 10);
void nmsMatchesRotatedRect(const std::vector<SMatchResult> &vtSrc, const cv::Size &modelsize, std::vector<SMatchResult> &vtDst, double maxOverlap);
void nmsMatchesRect(const std::vector<SMatchResult> &vtSrc, std::vector<SMatchResult> &vtDst, double maxOverlap);
};
#endif // CNCCMATCH_H
四、演示软件截图:(未使用商业图像处理库,而是纯粹Qt+OpenCV)
五、下一版的优化改进方向
1、模板积分图像实现预计算
2、CPU指令集的优化提速
---
引申知识点:NCC匹配与形状匹配的比较
create_ncc_model
find_ncc_model
read_ncc_model
write_ncc_model
clear_ncc_model
create_scaled_shape_model
find_scaled_shape_model
read_shape_model
write_shape_model
clear_shape_model
1、NCC匹配优点
纹理
对焦不清
形状轻微变形
2、形状匹配优点
精度高
支持X/Y 方向缩放
支持物体遮挡
支持多模板
支持非线性光照变化
3、git
GitHub - luosch/stereo-matching: stereo-matching using SSD, NCC and ASW