最近做一些特征检测方面的东西,用的opencv自带的一些算法surf++knn+ransac等,进行指定区域的识别和扣取。然而,对这个检测算子的理解一致不太深入。于是的于是呢,参考了《计算机视觉:算法与应用》后,决定对这个方向了解一下。第一个自然是前人最经典的杰作:moravec corner;
moravec corner 首先提取了8个以45°为步长的局部差方之和,然后在8个中选取最小的一个作为当前的特征值,具有一定程度上的旋转不变性。然会对这个特征值进行阈值判断,提取出角点。8个模板可以采用3*3 5*5 或者7*7;这里采用5*5的方法进行测试。
代码稍后奉上(只实现了大概流程,代码没有经过优化)
#pragma once
#include"opencv2/opencv.hpp"
#include <vector>
class CMoravecCorner
{
private:
int winsize;
int threshold;
std::vector <cv::Point> corners;
public:
CMoravecCorner(void);
~CMoravecCorner(void);
void set_thresold(int threshold)
{
this->threshold =threshold;
}
std::vector<cv::Point> corner_detect(const cv::Mat img, int winsize=5)
{
//转换为灰度图
cv::Mat src;
cv::cvtColor