OpenCV_Corner Detect with Harris and goodFeaturesToTrack( 基于Harris及适合跟踪的优质特征的角点检测)
目录
一. 概念
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及适合跟踪的优质特征的角点检测)相关推荐
- 角点检测--基于梯度的方法(Moravec角点检测、Harris角点检测、Shi-Tomasi角点检测)
Moravec Detector Moravec角点检测是第一个提出兴趣点(interest points)的Paper.它的主要思想是:以每个像素为中心,有一个固定的滑动窗口.该方法计算并在八个方向 ...
- **角点检测(Harris)基于Opencv2.4.9版本+VS2012开发平台进行编**
角点检测(Harris)基于Opencv2.4.9版本+VS2012开发平台进行编 角点检测 角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检 ...
- android openCV检测图像的基本特征,包括Canny边缘检测、Harris角点检测、霍夫直线检测-基于Android studio
实现平台:windows下的Android studio1.4 依赖库:openCV3.1.0 程序安装平台:Android6.0 实现的功能:从手机中选择一张图片,检测图片的基本特征,通过menu菜 ...
- harris角点匹配 matlab,基于Harris角点的图像匹配算法
摘 要: 提出了新的基于特征点的高速图像匹配算法.该算法把角点特征和灰度值特征结合起来,定义了一种基于Harris角点的灰度值特征,并充分利用角点灰度值以及角点周边灰度值和位置信息,然后依据这些信息进 ...
- 【Opencv】基于Opencv和PCV两种方法的Harris 角点检测与匹配
[Opencv]基于Opencv和PCV两种方法的Harris 角点检测与匹配[附代码] 理解Harris角点检测 代码:Harris角点检测 1.[opencv版]Harris角点检测 2.[PCV ...
- Harris角点检测python实现及基于opencv实现
写在前面: 黄宁然, 七月,骄阳似火. 参考文献镇楼: [1]袁志聪,基于harris特征的点云配准方法研究 [2]高亭,基于改进Harris角点检测的印刷体文档图像检索技术 [3]景庆阳,基于har ...
- 【Python+OpenCV】基于Harris角点的边缘提取以及矩形四角点检测
目录 开始之前必须要说的一些事 一.参考文章 二.实验目标 三.局限性声明 开始说正事了,所以标题一定要比第一个一级标题长 一.思路 (一)基于Harris角点检测[本文思路] (二)基于Hough变 ...
- 用matlab实现harris角点检测,基于MatlabGUI的Harris角点检测程序
基于MatlabGUI的Harris角点检测程序 作 者: Bugzhao Mailto: bugzhao@http://www.doczj.com/doc/fd59aac50c22590102029 ...
- 使用opencv中函数实现基于Harris算法的图像角点检测
opencv(python)中Harris角点检测函数 函数原型: dst = cv.cornerHarris( src, blockSize, ksize, k[, dst[, borderType ...
- 基于Python手动实现Harris角点检测
最近在上数字图像处理课程,需要使用Python手动编写Harris角点检测算法,但是网上几乎没有找到手动编写的,只能手敲. 同时作为自己的第一篇博客,在这里记录一下. 一.Harris角点检测 原理( ...
最新文章
- js添加多个子节点_JS创建DOM节点-使用document.createElement()创建子节点或同级节点...
- 2.odoo13之跟着官网做项目/实例(创建菜单,创建action,创建视图、搜索过滤器,分组)
- 调试器原理_调试器的工作原理
- php空数组添加,php 删除空数组
- SAP License:GL显示行项目
- 转载 Assert断言知识
- sass-loader高版本的坑
- 干货 | 自然语言处理中注意力机制综述
- 为 macOS Monterey 优化,有了快捷指令,这些软件效率倍增
- java 向文件写数据结构_Java Note 数据结构(5)映射
- 明解C语言【中级篇】
- 数据结构与算法-进阶(十二)最短路径Dijkstra 算法
- 运放噪声频率曲线-运放噪声计算-运算放大器
- python表格数据对比_python入门之对比两份excel表格数据
- “燕云十六将”之Grace陈敏(9)
- excel软件的IF函数及其用法
- 亚马逊 Alexa skill开发
- IDM6.32的安装与激活IDM Crack 6.32 Build 8 + Patch 2019 free (100% working)
- 全面了解Qtum节点端口配置,立即加入全节点激励计划
- PC手机图形API介绍