目录

一. 概念

Harris角点检测内部实现:

优缺点

二. 代码

main函数

HarrisDetector.h

HarrisDetector.cpp

三. 效果图


一. 概念

Harris角点检测内部实现:

cv::cornerHarris(…)

观察一个假定的特征点,周围小窗口内的,方向强度的 加权平均变化E。

首先获取一个点平均强度变化最大值对应的方向,接着检测位于它垂直方向的变化是否也 剧烈,如果是,那么该点便是一个角点。基于两个正交方向上的强度变化率。

通过对E进行 泰勒公式 近似展开,然后使用 矩阵形式 表示 ,得到一个协方差矩阵,那么协方差矩阵的两个特征值,就反应的图像中点的性质:两个特征值都比较低——同质区域,一大一小——边,都比较高——即是角点。

为了避免计算特征值,可以利用特征值的性质,判断当前像素点是否时角点。

矩阵的特征值之积 = 矩阵的行列式的值Determinant;

矩阵的特征值之和 = 矩阵的迹 Trace ,即矩阵对角线的和

然后可以使用公式    的值判断两个特征值是否足够高。 k 取值(0.05 – 0.5)之间

优缺点

优点:    对亮度和对比度的变化不敏感,

具有旋转不变性(各个方向的强度变化)

尺度不变性(梯度变化)

缺点:    计算量大

泰勒公式:是将一个在x=x0处具有n阶导数的函数f(x)利用关于(x-x0)的n次多项式来逼近函数的方法。

协方差矩阵: 每个元素是各个向量元素 的协方差 (去当前行当前列剩余的矩阵)。

二. 代码

main函数

#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "HarrisDetector.h"
int main()
{cv::Mat image = cv::imread("../../aTestImage/Buildingsm.jpg",0);cv::namedWindow("image");cv::imshow("image", image);HarrisDetector harris;harris.detect(image); //计算harris角点值//显示中间过程处理图像效果//cv::namedWindow("cornerStrength");//cv::imshow("cornerStrength", harris.cornerStrength);//cv::namedWindow("localMax");//cv::imshow("localMax", harris.localMax);cv::namedWindow("cornerHarrisResult");cv::imshow("cornerHarrisResult", harris.getCornerMap(0.01));std::vector<cv::Point> pts;harris.getCorners(pts, 0.01); //获取harris角点harris.drawOnImage(image, pts); //绘制harris角点到图像上cv::namedWindow("harrisImage");cv::imshow("harrisImage", image);//计算适合跟踪的优质特征cv::Mat image1 = cv::imread("../../aTestImage/Buildingsm.jpg", 0); //上面 绘制harris角点到图像 上是引用传递 改变原图,需重新加载一张std::vector<cv::Point2f> pts2f;harris.getCornersGoodFeatures(pts2f, image1,100); //获取harris角点 //可以指定最大特征点数目,质量等级,两点之间最小距离harris.drawOnImageGoodFeatures(image1, pts2f); //绘制harris角点到图像上cv::namedWindow("goodFeaturesImage");cv::imshow("goodFeaturesImage", image1);cv::waitKey(0);return 0;
}

HarrisDetector.h

#pragma once
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>class HarrisDetector
{
public:HarrisDetector() :neighbourhood(3), aperture(3), k(0.01), maxStrength(0.0), threshold(0.01), nonMaxSize(3){//setLocalMaxWindowSize(nonMaxSize);  //创建非极大值抑制核}~HarrisDetector();void detect(const cv::Mat &image);    //检测Harris角点cv::Mat getCornerMap(double qualityLevel);    //由Harris值获取角点图void getCorners(std::vector<cv::Point> &points, double qualityLevel);    //由Harris值得到特征点void getCorners(std::vector<cv::Point> &points, const cv::Mat &cornerMap);  //由角点图获取特征点void getCornersGoodFeatures(std::vector<cv::Point2f>& points, cv::Mat & image, int featureNum=500, double qualityLevel=0.01, int pointDistance=10);void drawOnImage(cv::Mat &image, const std::vector<cv::Point> &points,cv::Scalar color = cv::Scalar(255, 255, 255), int radius = 4, int thickness = 1);  //在特征点位置上绘制圆void drawOnImageGoodFeatures(cv::Mat & image, const std::vector<cv::Point2f>& points,cv::Scalar color = cv::Scalar(255, 255, 255), int radius = 4, int thickness = 2);cv::Mat localMax;      //局部极大值图像cv::Mat cornerStrength;  //表示角点强度的32位浮点图像private:cv::Mat cornerTh;         //阈值化得角点强度图像int neighbourhood;  // 导数平滑的相邻像素的尺寸int aperture;     //梯度计算的孔径的大小  double  k; //Harris 参数double maxStrength;  //阈值计算的最大强度double threshold;  //计算得到的阈值int nonMaxSize;  //非极大值抑制的相邻像素的尺寸cv::Mat kernel;    //非极大值抑制的核
};

HarrisDetector.cpp

#include "stdafx.h"
#include "HarrisDetector.h"//HarrisDetector::HarrisDetector()
//{
//}HarrisDetector::~HarrisDetector()
{
}void HarrisDetector::detect(const cv::Mat & image)
{cv::cornerHarris(image, cornerStrength, neighbourhood, aperture, k); //获取角点强度图像 //计算各个方向强度变化的差方和 进行比较取最大,验证该方向垂直方向的强度变化得差方和是否也变化强烈,若是 则为角点double minStrength;cv::minMaxLoc(cornerStrength, &minStrength, &maxStrength);cv::Mat dilated;cv::dilate(cornerStrength, dilated, cv::Mat()); //膨胀cv::compare(cornerStrength, dilated, localMax, cv::CMP_EQ); //获取局部最大值图像 //compare后,localMax仅在局部最大值的位置为真
}cv::Mat HarrisDetector::getCornerMap(double qualityLevel)
{cv::Mat  cornerMap;threshold = qualityLevel*maxStrength;cv::threshold(cornerStrength, cornerTh, threshold, 255, cv::THRESH_BINARY);//二值化cornerTh.convertTo(cornerMap, CV_8U); //转换成8位灰度图cv::bitwise_and(cornerMap, localMax, cornerMap); // 与局部最大值and操作 得到角点图return cornerMap;
}void HarrisDetector::getCorners(std::vector<cv::Point>& points, double qualityLevel)
{cv::Mat cornerMap = getCornerMap(qualityLevel);getCorners(points, cornerMap);
}void HarrisDetector::getCorners(std::vector<cv::Point>& points, const cv::Mat & cornerMap)
{for (int y = 0; y < cornerMap.rows; y++){const uchar *rowPtr = cornerMap.ptr<uchar>(y);for (int x = 0; x < cornerMap.cols; x++){if (rowPtr[x]){points.push_back(cv::Point(x, y));//获取特征点}}}
}
void HarrisDetector::getCornersGoodFeatures(std::vector<cv::Point2f>& points ,cv::Mat &image,int featureNum, double qualityLevel, int pointDistance)
{cv::goodFeaturesToTrack(image, points, featureNum, qualityLevel, pointDistance);
}void HarrisDetector::drawOnImage(cv::Mat & image, const std::vector<cv::Point>& points, cv::Scalar color, int radius, int thickness)
{std::vector<cv::Point>::const_iterator it = points.begin();while (it != points.end()){cv:circle(image, *it, radius, color, thickness); //将点集以圆的形式画在image上++it;}
}
void HarrisDetector::drawOnImageGoodFeatures(cv::Mat & image, const std::vector<cv::Point2f>& points,cv::Scalar color, int radius, int thickness)
{std::vector<cv::Point2f>::const_iterator it = points.begin();while (it != points.end()){cv:circle(image, *it, radius, color, thickness); //将点集以圆的形式画在image上++it;}
}

三. 效果图

OpenCV_Corner Detect with Harris and goodFeaturesToTrack( 基于Harris及适合跟踪的优质特征的角点检测)相关推荐

  1. 角点检测--基于梯度的方法(Moravec角点检测、Harris角点检测、Shi-Tomasi角点检测)

    Moravec Detector Moravec角点检测是第一个提出兴趣点(interest points)的Paper.它的主要思想是:以每个像素为中心,有一个固定的滑动窗口.该方法计算并在八个方向 ...

  2. **角点检测(Harris)基于Opencv2.4.9版本+VS2012开发平台进行编**

    角点检测(Harris)基于Opencv2.4.9版本+VS2012开发平台进行编 角点检测 角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检 ...

  3. android openCV检测图像的基本特征,包括Canny边缘检测、Harris角点检测、霍夫直线检测-基于Android studio

    实现平台:windows下的Android studio1.4 依赖库:openCV3.1.0 程序安装平台:Android6.0 实现的功能:从手机中选择一张图片,检测图片的基本特征,通过menu菜 ...

  4. harris角点匹配 matlab,基于Harris角点的图像匹配算法

    摘 要: 提出了新的基于特征点的高速图像匹配算法.该算法把角点特征和灰度值特征结合起来,定义了一种基于Harris角点的灰度值特征,并充分利用角点灰度值以及角点周边灰度值和位置信息,然后依据这些信息进 ...

  5. 【Opencv】基于Opencv和PCV两种方法的Harris 角点检测与匹配

    [Opencv]基于Opencv和PCV两种方法的Harris 角点检测与匹配[附代码] 理解Harris角点检测 代码:Harris角点检测 1.[opencv版]Harris角点检测 2.[PCV ...

  6. Harris角点检测python实现及基于opencv实现

    写在前面: 黄宁然, 七月,骄阳似火. 参考文献镇楼: [1]袁志聪,基于harris特征的点云配准方法研究 [2]高亭,基于改进Harris角点检测的印刷体文档图像检索技术 [3]景庆阳,基于har ...

  7. 【Python+OpenCV】基于Harris角点的边缘提取以及矩形四角点检测

    目录 开始之前必须要说的一些事 一.参考文章 二.实验目标 三.局限性声明 开始说正事了,所以标题一定要比第一个一级标题长 一.思路 (一)基于Harris角点检测[本文思路] (二)基于Hough变 ...

  8. 用matlab实现harris角点检测,基于MatlabGUI的Harris角点检测程序

    基于MatlabGUI的Harris角点检测程序 作 者: Bugzhao Mailto: bugzhao@http://www.doczj.com/doc/fd59aac50c22590102029 ...

  9. 使用opencv中函数实现基于Harris算法的图像角点检测

    opencv(python)中Harris角点检测函数 函数原型: dst = cv.cornerHarris( src, blockSize, ksize, k[, dst[, borderType ...

  10. 基于Python手动实现Harris角点检测

    最近在上数字图像处理课程,需要使用Python手动编写Harris角点检测算法,但是网上几乎没有找到手动编写的,只能手敲. 同时作为自己的第一篇博客,在这里记录一下. 一.Harris角点检测 原理( ...

最新文章

  1. js添加多个子节点_JS创建DOM节点-使用document.createElement()创建子节点或同级节点...
  2. 2.odoo13之跟着官网做项目/实例(创建菜单,创建action,创建视图、搜索过滤器,分组)
  3. 调试器原理_调试器的工作原理
  4. php空数组添加,php 删除空数组
  5. SAP License:GL显示行项目
  6. 转载 Assert断言知识
  7. sass-loader高版本的坑
  8. 干货 | 自然语言处理中注意力机制综述
  9. 为 macOS Monterey 优化,有了快捷指令,这些软件效率倍增
  10. java 向文件写数据结构_Java Note 数据结构(5)映射
  11. 明解C语言【中级篇】
  12. 数据结构与算法-进阶(十二)最短路径Dijkstra 算法
  13. 运放噪声频率曲线-运放噪声计算-运算放大器
  14. python表格数据对比_python入门之对比两份excel表格数据
  15. “燕云十六将”之Grace陈敏(9)
  16. excel软件的IF函数及其用法
  17. 亚马逊 Alexa skill开发
  18. IDM6.32的安装与激活IDM Crack 6.32 Build 8 + Patch 2019 free (100% working)
  19. 全面了解Qtum节点端口配置,立即加入全节点激励计划
  20. PC手机图形API介绍

热门文章

  1. AMD规范和requirejs入门
  2. jQuery中的事件绑定的几种方式
  3. mybatis实战教程(mybatis in action)之四:实现关联数据的查询(转)
  4. php客户端和服务器的值传递
  5. 如何借助log4j把日志写入数据库中
  6. 个人数据常用备份策略
  7. windows上java调用gdal.jar报错
  8. VS2015 更换exe的图标
  9. 25. 熟悉非标准的哈希容器
  10. 堆排序HeapSort