使用Qt+OpenCV自己写了一个带旋转角度的NCC灰度模板匹配算子。算子的原理是基于NCC灰度匹配。
在opencv代码中,matchTemplate函数保存在文件imgproc文件夹下的templmatch.cpp中,NCC算子的计算方式是cv::TM_CCOEFF_NORMED。
https://github.com/opencv/opencv/blob/4.5.5/modules/imgproc/src/templmatch.cpp
部分头文件
#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)
---
参考文献
【工程应用一】 多目标多角度的快速模板匹配算法(基于NCC,效果无限接近Halcon中........) - Imageshop - 博客园