使用Qt+OpenCV自己写了一个带旋转角度的NCC灰度模板匹配算子。算子的原理是基于NCC灰度匹配。
在opencv代码中,matchTemplate函数里面有个方法是cv::TM_CCOEFF_NORMED,它实现了NCC算子。该函数本身是不支持旋转角度和金字塔分级的,需要自己实现。matchTemplate函数保存在源码文件imgproc文件夹下的templmatch.cpp中,请重点关注NCC算子的计算方式cv::TM_CCOEFF_NORMED。 https://github.com/opencv/opencv/blob/4.5.5/modules/imgproc/src/templmatch.cpp
主要功能:
1、NCC匹配
2、金字塔
3、最大重叠率
4、旋转角度
5、匹配分数
6、不支持缩放
部分头文件:
#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)
?
|