我的Qt作品(11)使用Qt+OpenCV实现一个带旋转角度的NCC灰度模板匹配演示软件

使用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

猜你喜欢

转载自blog.csdn.net/libaineu2004/article/details/123132530