【OpenCV入门教程之十六】OpenCV角点检测之Harris角点检测

article/2025/10/8 2:23:05


本系列文章由@浅墨_毛星云 出品,转载请注明出处。  

文章链接: http://blog.csdn.net/poem_qianmo/article/details/29356187

作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442

知乎:http://www.zhihu.com/people/mao-xing-yun

邮箱: happylifemxy@163.com

写作当前博文时配套使用的OpenCV版本: 2.4.9


本篇文章中,我们一起探讨了OpenCV中Harris角点检测相关的知识点,学习了OpenCV中实现Harris角点检测的cornerHarris函数的使用方法。此博文一共有两个配套的麻雀虽小但五脏俱全的示例程序,其经过浅墨详细注释过的代码都在文中贴出,且文章最后提供了综合示例程序的下载。

依然是先看看程序运行截图:

 

 





一、引言:关于兴趣点(interest points)

 



在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints)、特征点(feature points) 被大量用于解决物体识别,图像识别、图像匹配、视觉跟踪、三维重建等一系列的问题。我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析。如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值。

 

图像特征类型可以被分为如下三种:

  • <1>边缘
  • <2>角点 (感兴趣关键点)
  • <3>斑点(Blobs)(感兴趣区域)

其中,角点是个很特殊的存在。他们在图像中可以轻易地定位,同时,他们在人造物体场景,比如门、窗、桌等出随处可见。因为角点位于两条边缘的交点处,代表了两个边缘变化的方向上的点,,所以他们是可以精确定位的二维特征,甚至可以达到亚像素的精度。且其图像梯度有很高的变化,这种变化是可以用来帮助检测角点的。需要注意的是,角点与位于相同强度区域上的点不同,与物体轮廓上的点也不同,因为轮廓点难以在相同的其他物体上精确定位。

 

 




二、角点检测算法的分类




在当前的图像处理领域,角点检测算法可归纳为三类:


  • <1>基于灰度图像的角点检测
  • <2>基于二值图像的角点检测
  • <3>基于轮廓曲线的角点检测

而基于灰度图像的角点检测又可分为基于梯度、基于模板和基于模板梯度组合三类方法,其中基于模板的方法主要考虑像素领域点的灰度变化,即图像亮度的变化,将与邻点亮度对比足够大的点定义为角点。常见的基于模板的角点检测算法有Kitchen-Rosenfeld角点检测算法,Harris角点检测算法、KLT角点检测算法及SUSAN角点检测算法。和其他角点检测算法相比,SUSAN角点检测算法具有算法简单、位置准确、抗噪声能力强等特点。





三、角点的定义



“如果某一点在任意方向的一个微小变动都会引起灰度很大的变化,那么我们就把它称之为角点”

角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别等领域中。也称为特征点检测。

角点通常被定义为两条边的交点,更严格的说,角点的局部邻域应该具有两个不同区域的不同方向的边界。而实际应用中,大多数所谓的角点检测方法检测的是拥有特定特征的图像点,而不仅仅是“角点”。这些特征点在图像中有具体的坐标,并具有某些数学特征,如局部最大或最小灰度、某些梯度特征等。

现有的角点检测算法并不是都十分的健壮。很多方法都要求有大量的训练集和冗余数据来防止或减少错误特征的出现。另外,角点检测方法的一个很重要的评价标准是其对多幅图像中相同或相似特征的检测能力,并且能够应对光照变化、图像旋转等图像变化。

在我们解决问题时,往往希望找到特征点,“特征”顾名思义,指能描述物体本质的东西,还有一种解释就是这个特征微小的变化都会对物体的某一属性产生重大的影响。而角点就是这样的特征。

观察日常生活中的“角落”就会发现,“角落”可以视为所有平面的交汇处,或者说是所有表面的发起处。假设我们要改变一个墙角的位置,那么由它而出发的平面势必都要有很大的变化。所以,这就引出了图像角点的定义。


我们知道,特征检测与匹配是计算机视觉应用中非常重要的一部分,这需要寻找图像之间的特征建立对应关系。图像中的点作为图像的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(keypoint feature),或“兴趣点”(interest point),或“角点”(conrner)。

 

另外,关于角点的具体描述可以有几种:

  • 一阶导数(即灰度的梯度)的局部最大所对应的像素点;
  • 两条及两条以上边缘的交点;
  • 图像中梯度值和梯度方向的变化速率都很高的点;
  • 角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。

 

 

 


四、cornerHarris函数详解



cornerHarris 函数用于在OpenCV中运行Harris角点检测算子处理图像。和cornerMinEigenVal( )以及cornerEigenValsAndVecs( )函数类似,cornerHarris 函数对于每一个像素(x,y)在邻域内,计算2x2梯度的协方差矩阵,接着它计算如下式子:


 

即可以找出输出图中的局部最大值,即找出了角点。


其函数原型和参数解析:

C++: void cornerHarris(InputArray src,OutputArray dst, int blockSize, int ksize, double k, intborderType=BORDER_DEFAULT )

  • 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位或者浮点型图像。
  • 第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放Harris角点检测的输出结果,和源图片有一样的尺寸和类型。
  • 第三个参数,int类型的blockSize,表示邻域的大小,更多的详细信息在cornerEigenValsAndVecs()中有讲到。
  • 第四个参数,int类型的ksize,表示Sobel()算子的孔径大小。
  • 第五个参数,double类型的k,Harris参数。
  • 第六个参数,int类型的borderType,图像像素的边界模式,注意它有默认值BORDER_DEFAULT。更详细的解释,参考borderInterpolate( )函数。

 接着我们一起过一遍稍后需要用到的Threshold函数的解析,然后看一个以cornerHarris为核心的示例程序。





五、Threshold函数详解

 

 

函数Threshold( ) 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(另外,compare( )函数也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点。


C++: double threshold(InputArray src,OutputArray dst, double thresh, double maxval, int type)

  • 第一个参数,InputArray类型的src,输入数组,填单通道 , 8或32位浮点类型的Mat即可。
  • 第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型。
  • 第三个参数,double类型的thresh,阈值的具体值。
  • 第四个参数,double类型的maxval,当第五个参数阈值类型type取 CV_THRESH_BINARY 或CV_THRESH_BINARY_INV 阈值类型时的最大值.
  • 第五个参数,int类型的type,阈值类型,。threshold( )函数支持的对图像取阈值的方法由其确定,具体用法如下图:


而图形化的阈值描述如下图:


  

讲解完这两个函数,让我们看一个调用示例程序:

 

//-----------------------------------【头文件包含部分】---------------------------------------  
//      描述:包含程序所依赖的头文件  
//----------------------------------------------------------------------------------------------   
#include <opencv2/opencv.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  //-----------------------------------【命名空间声明部分】---------------------------------------  
//      描述:包含程序所使用的命名空间  
//-----------------------------------------------------------------------------------------------   
using namespace cv;  int main()  
{  //以灰度模式载入图像并显示Mat srcImage = imread("1.jpg", 0);  imshow("原始图", srcImage);  //进行Harris角点检测找出角点Mat cornerStrength;  cornerHarris(srcImage, cornerStrength, 2, 3, 0.01);//对灰度图进行阈值操作,得到二值图并显示  Mat harrisCorner;  threshold(cornerStrength, harrisCorner, 0.00001, 255, THRESH_BINARY);  imshow("角点检测后的二值效果图", harrisCorner);  waitKey(0);  return 0;  
}  


运行截图:

   


 

 

 

 

 

六、本文相关核心函数在OpenCV中的实现源代码

 


这个部分贴出OpenCV中本文相关函数的源码实现细节,来给想了解实现细节的小伙伴们参考。浅墨暂时不在源码的细节上挖深作详细注释。


 

6.1 OpenCV2.X中cornerHarris函数源代码


源码路径: …opencv\sources\modules\imgproc\src\corner.cpp

 

void cv::cornerHarris( InputArray _src,OutputArray _dst, int blockSize, int ksize, double k, int borderType )
{Mat src = _src.getMat();_dst.create( src.size(), CV_32F );Mat dst = _dst.getMat();cornerEigenValsVecs( src, dst, blockSize, ksize, HARRIS, k, borderType);
}

 

可见cornerHarris内部其实是调用了cornerEigenValsVecs函数,我们看看其实现源码:

 

static void
cornerEigenValsVecs( const Mat& src,Mat& eigenv, int block_size,int aperture_size, intop_type, double k=0.,intborderType=BORDER_DEFAULT )
{
#ifdef HAVE_TEGRA_OPTIMIZATIONif (tegra::cornerEigenValsVecs(src, eigenv, block_size, aperture_size,op_type, k, borderType))return;
#endifint depth = src.depth();double scale = (double)(1 << ((aperture_size > 0 ?aperture_size : 3) - 1)) * block_size;if( aperture_size < 0 )scale *= 2.;if( depth == CV_8U )scale *= 255.;scale = 1./scale;CV_Assert( src.type() == CV_8UC1 || src.type() == CV_32FC1 );Mat Dx, Dy;if( aperture_size > 0 ){Sobel( src, Dx, CV_32F, 1, 0, aperture_size, scale, 0, borderType );Sobel( src, Dy, CV_32F, 0, 1, aperture_size, scale, 0, borderType );}else{Scharr( src, Dx, CV_32F, 1, 0, scale, 0, borderType );Scharr( src, Dy, CV_32F, 0, 1, scale, 0, borderType );}Size size = src.size();Mat cov( size, CV_32FC3 );int i, j;for( i = 0; i < size.height; i++ ){float* cov_data = (float*)(cov.data + i*cov.step);const float* dxdata = (const float*)(Dx.data + i*Dx.step);const float* dydata = (const float*)(Dy.data + i*Dy.step);for( j = 0; j < size.width; j++ ){float dx = dxdata[j];float dy = dydata[j];cov_data[j*3] = dx*dx;cov_data[j*3+1] = dx*dy;cov_data[j*3+2] = dy*dy;}}boxFilter(cov, cov, cov.depth(), Size(block_size, block_size),Point(-1,-1), false, borderType );if( op_type == MINEIGENVAL )calcMinEigenVal( cov, eigenv );else if( op_type == HARRIS )calcHarris( cov, eigenv, k );else if( op_type == EIGENVALSVECS )calcEigenValsVecs( cov, eigenv );
}}


 

 

6.1 OpenCV2.X中Threshold函数源代码


路径:…opencv\sources\modules\imgproc\src\thresh.cpp

 

double cv::threshold( InputArray _src,OutputArray _dst, double thresh, double maxval, int type )
{Mat src = _src.getMat();bool use_otsu = (type & THRESH_OTSU) != 0;type &= THRESH_MASK;if( use_otsu ){CV_Assert( src.type() == CV_8UC1 );thresh = getThreshVal_Otsu_8u(src);}_dst.create( src.size(), src.type() );Mat dst = _dst.getMat();if( src.depth() == CV_8U ){int ithresh = cvFloor(thresh);thresh = ithresh;int imaxval = cvRound(maxval);if( type == THRESH_TRUNC )imaxval = ithresh;imaxval = saturate_cast<uchar>(imaxval);if( ithresh < 0 || ithresh >= 255 ){if( type == THRESH_BINARY || type == THRESH_BINARY_INV ||((type == THRESH_TRUNC || type== THRESH_TOZERO_INV) && ithresh < 0) ||(type == THRESH_TOZERO&& ithresh >= 255) ){int v = type ==THRESH_BINARY ? (ithresh >= 255 ? 0 : imaxval) :type ==THRESH_BINARY_INV ? (ithresh >= 255 ? imaxval : 0) :/*type == THRESH_TRUNC? imaxval :*/ 0;dst.setTo(v);}elsesrc.copyTo(dst);return thresh;}thresh = ithresh;maxval = imaxval;}else if( src.depth() == CV_16S ){int ithresh = cvFloor(thresh);thresh = ithresh;int imaxval = cvRound(maxval);if( type == THRESH_TRUNC )imaxval = ithresh;imaxval = saturate_cast<short>(imaxval);if( ithresh < SHRT_MIN || ithresh >= SHRT_MAX ){if( type == THRESH_BINARY || type == THRESH_BINARY_INV ||((type == THRESH_TRUNC || type== THRESH_TOZERO_INV) && ithresh < SHRT_MIN) ||(type == THRESH_TOZERO&& ithresh >= SHRT_MAX) ){int v = type == THRESH_BINARY ?(ithresh >= SHRT_MAX ? 0 : imaxval) :type == THRESH_BINARY_INV ?(ithresh >= SHRT_MAX ? imaxval : 0) :/*type == THRESH_TRUNC ?imaxval :*/ 0;dst.setTo(v);}elsesrc.copyTo(dst);return thresh;}thresh = ithresh;maxval = imaxval;}else if( src.depth() == CV_32F );elseCV_Error( CV_StsUnsupportedFormat, "" );parallel_for_(Range(0, dst.rows),ThresholdRunner(src, dst,thresh, maxval, type),dst.total()/(double)(1<<16));return thresh;
}


另外在贴上与之相关的自适应阈值操作函数的源码adaptiveThreshold:

 

void cv::adaptiveThreshold( InputArray_src, OutputArray _dst, double maxValue,int method, inttype, int blockSize, double delta )
{Mat src = _src.getMat();CV_Assert( src.type() == CV_8UC1 );CV_Assert( blockSize % 2 == 1 && blockSize > 1 );Size size = src.size();_dst.create( size, src.type() );Mat dst = _dst.getMat();if( maxValue < 0 ){dst = Scalar(0);return;}Mat mean;if( src.data != dst.data )mean = dst;if( method == ADAPTIVE_THRESH_MEAN_C )boxFilter( src, mean, src.type(), Size(blockSize, blockSize),Point(-1,-1), true,BORDER_REPLICATE );else if( method == ADAPTIVE_THRESH_GAUSSIAN_C )GaussianBlur( src, mean, Size(blockSize, blockSize), 0, 0,BORDER_REPLICATE );elseCV_Error( CV_StsBadFlag, "Unknown/unsupported adaptive thresholdmethod" );int i, j;uchar imaxval = saturate_cast<uchar>(maxValue);int idelta = type == THRESH_BINARY ? cvCeil(delta) : cvFloor(delta);uchar tab[768];if( type == CV_THRESH_BINARY )for( i = 0; i < 768; i++ )tab[i] = (uchar)(i - 255 > -idelta ? imaxval : 0);else if( type == CV_THRESH_BINARY_INV )for( i = 0; i < 768; i++ )tab[i] = (uchar)(i - 255 <= -idelta ? imaxval : 0);elseCV_Error( CV_StsBadFlag, "Unknown/unsupported threshold type");if( src.isContinuous() && mean.isContinuous() &&dst.isContinuous() ){size.width *= size.height;size.height = 1;}for( i = 0; i < size.height; i++ ){const uchar* sdata = src.data + src.step*i;const uchar* mdata = mean.data + mean.step*i;uchar* ddata = dst.data + dst.step*i;for( j = 0; j < size.width; j++ )ddata[j] = tab[sdata[j] - mdata[j] + 255];}
}


 

 



七、综合示例部分




本次综合示例为调节滚动条来控制阈值,以控制的harris检测角点的数量。一共有三个图片窗口,分别为显示原始图的窗口,包含滚动条的彩色效果图窗口,以及灰度图效果图窗口。

废话不多说,让我们一起来欣赏详细注释过后的完整源代码:

 

//-----------------------------------【程序说明】----------------------------------------------
//		程序名称::《【OpenCV入门教程之十六】OpenCV角点检测之Harris角点检测》 博文配套源码 
//		开发所用IDE版本:Visual Studio 2010
//		开发所用OpenCV版本:	2.4.9
//		2014年6月8日 Created by 浅墨
//		浅墨的微博:@浅墨_毛星云 http://weibo.com/1723155442
//		浅墨的知乎:http://www.zhihu.com/people/mao-xing-yun
//		浅墨的豆瓣:http://www.douban.com/people/53426472/
//----------------------------------------------------------------------------------------------//-----------------------------------【头文件包含部分】---------------------------------------
//		描述:包含程序所依赖的头文件
//---------------------------------------------------------------------------------------------- 
#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"//-----------------------------------【命名空间声明部分】--------------------------------------
//		描述:包含程序所使用的命名空间
//----------------------------------------------------------------------------------------------- 
using namespace cv;
using namespace std;//-----------------------------------【宏定义部分】--------------------------------------------  
//  描述:定义一些辅助宏  
//------------------------------------------------------------------------------------------------  
#define WINDOW_NAME1 "【程序窗口1】"        //为窗口标题定义的宏  
#define WINDOW_NAME2 "【程序窗口2】"        //为窗口标题定义的宏  //-----------------------------------【全局变量声明部分】--------------------------------------
//		描述:全局变量声明
//-----------------------------------------------------------------------------------------------
Mat g_srcImage, g_srcImage1,g_grayImage;
int thresh = 30; //当前阈值
int max_thresh = 175; //最大阈值//-----------------------------------【全局函数声明部分】--------------------------------------
//		描述:全局函数声明
//-----------------------------------------------------------------------------------------------
void on_CornerHarris( int, void* );//回调函数
static void ShowHelpText();//-----------------------------------【main( )函数】--------------------------------------------
//		描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main( int argc, char** argv )
{//【0】改变console字体颜色system("color 3F");  //【0】显示帮助文字ShowHelpText();//【1】载入原始图并进行克隆保存g_srcImage = imread( "1.jpg", 1 );if(!g_srcImage.data ) { printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); return false; }  imshow("原始图",g_srcImage);g_srcImage1=g_srcImage.clone( );//【2】存留一张灰度图cvtColor( g_srcImage1, g_grayImage, CV_BGR2GRAY );//【3】创建窗口和滚动条namedWindow( WINDOW_NAME1, CV_WINDOW_AUTOSIZE );createTrackbar( "阈值: ", WINDOW_NAME1, &thresh, max_thresh, on_CornerHarris );//【4】调用一次回调函数,进行初始化on_CornerHarris( 0, 0 );waitKey(0);return(0);
}//-----------------------------------【on_HoughLines( )函数】--------------------------------
//		描述:回调函数
//----------------------------------------------------------------------------------------------void on_CornerHarris( int, void* )
{//---------------------------【1】定义一些局部变量-----------------------------Mat dstImage;//目标图Mat normImage;//归一化后的图Mat scaledImage;//线性变换后的八位无符号整型的图//---------------------------【2】初始化---------------------------------------//置零当前需要显示的两幅图,即清除上一次调用此函数时他们的值dstImage = Mat::zeros( g_srcImage.size(), CV_32FC1 );g_srcImage1=g_srcImage.clone( );//---------------------------【3】正式检测-------------------------------------//进行角点检测cornerHarris( g_grayImage, dstImage, 2, 3, 0.04, BORDER_DEFAULT );// 归一化与转换normalize( dstImage, normImage, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );convertScaleAbs( normImage, scaledImage );//将归一化后的图线性变换成8位无符号整型 //---------------------------【4】进行绘制-------------------------------------// 将检测到的,且符合阈值条件的角点绘制出来for( int j = 0; j < normImage.rows ; j++ ){ for( int i = 0; i < normImage.cols; i++ ){if( (int) normImage.at<float>(j,i) > thresh+80 ){circle( g_srcImage1, Point( i, j ), 5,  Scalar(10,10,255), 2, 8, 0 );circle( scaledImage, Point( i, j ), 5,  Scalar(0,10,255), 2, 8, 0 );}}}//---------------------------【4】显示最终效果---------------------------------imshow( WINDOW_NAME1, g_srcImage1 );imshow( WINDOW_NAME2, scaledImage );}//-----------------------------------【ShowHelpText( )函数】----------------------------------
//		描述:输出一些帮助信息
//----------------------------------------------------------------------------------------------
static void ShowHelpText()
{//输出一些帮助信息printf("\n\n\n\t\t\t【欢迎来到Harris角点检测示例程序~】\n\n");  printf("\n\n\n\t请调整滚动条观察图像效果~\n\n");printf("\n\n\t\t\t\t\t\t\t\t by浅墨");
}


放出一些运行效果图。

首先是原始图,非常美丽的异域建筑群:



第一组阈值效果图:

 

第二组阈值效果图:

 

第三组阈值效果图:

 

第四组阈值效果图:

 




本篇文章的配套源代码请点击这里下载:

 

【浅墨OpenCV入门教程之十六】配套源代码下载





OK,今天的内容大概就是这些,我们下篇文章见:)


http://chatgpt.dhexx.cn/article/dSi6ycfv.shtml

相关文章

Harris 角点检测(Harris Corner Detection)(OpenCV实现)

匹配问题 Harris角点检测是Chris Harris和Mike Stephens在1988年提出的。主要用于运动图像的追踪。当时的普遍想法是利用边缘进行追踪&#xff0c;但是当相机或物体运动时你不知道朝哪个方向&#xff0c;相机的几何变换也是未知的&#xff0c;所以边缘匹配很难达到预期的效果。…

图像处理(九)——Harris角点检测

实现Harris角点检测算法&#xff0c;并与OpenCV的cornerHarris函数的结果进行比较。 特征点在图像中一般有具体的坐标&#xff0c;并具有某些数学特征&#xff0c;如局部最大或最小灰度、以及某些梯度特征等。角点可以简单的认为是两条边的交点。如下图所示&#xff1a; 在各个…

Harris角点检测 及 Matlab实验

目录 1 基础知识 1.1 图像变化的类型 1.2 提取点特征的作用 1.3 什么是好的角点检测算法&#xff1f; 2 Harris 角点检测 2.1 Harris角点检测基本思想 2.2 Harris角点检测&#xff1a;数学描述 3 总结 4 Matlab 实验 参考资料 角点是图像重要的特征&#xff0c;对图像…

Harris的角点检测和特征匹配

一.特征检测&#xff08;提取&#xff09; 基于特征的图像配准方法是图像配准中最常见的方法之一。它不是直接利用图像像素值&#xff0c;二十通过像素值导出的符号特征&#xff08;如特征点、特征线、特征区域&#xff09;来实现图像配准&#xff0c;因此可以克服利用灰度信息…

Harris角点及Shi-Tomasi角点检测

一、角点定义 有定义角点的几段话&#xff1a; 1、角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法&#xff0c;广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别等领域中。也称为特征点检测。 角点通常被定义为两条边的交点&#xff0…

Harris角点检测算法详解

Harris角点算法 特征点检测广泛应用到目标匹配、目标跟踪、三维重建等应用中&#xff0c;在进行目标建模时会对图像进行目标特征的提取&#xff0c;常用的有颜色、角点、特征点、轮廓、纹理等特征。现在开始讲解常用的特征点检测&#xff0c;其中Harris角点检测是特征点检测的基…

Harris角点检测算子

Harris角点检测算子是于1988年由CHris Harris & Mike Stephens提出来的。在具体展开之前&#xff0c;不得不提一下Moravec早在1981就提出来的Moravec角点检测算子。 1.Moravec角点检测算子 Moravec角点检测算子的思想其实特别简单&#xff0c;在图像上取一个W*W的“滑动窗…

特征检测之Harris角点检测

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达特征点又叫兴趣点或者角点。常被用于目标匹配&#xff0c;目标跟踪&#xff0c;三维重建等应用中。点特征主要指图像中的明显点&#xff0c;如突出的角点、边缘端点、极值…

Harris角点检测原理分析

主要参考了&#xff1a;http://blog.csdn.net/yudingjun0611/article/details/7991601 Harris角点检测算子 本文将该文拷贝了过来&#xff0c;并做了一些数学方面的补充&#xff0c;以方便对数学已经生疏的小伙伴们参考理解。由于补充的内容还挺多&#xff0c;所以还是将本文标…

【理解】经典角点检测算法--Harris角点

目录 什么是角点角点检测算法的原始思想&#xff1a;Harris角点检测原理Harris角点算法的基本步骤实践&#xff1a;Harris角点检测可能会用到的OpenCV API&#xff1a;手写API:1.展示图片&#xff1a;2.手写Harris特征&#xff1a;3.手写非极大值抑制&#xff1a;4.在原图标注角…

角点检测(Harris角点检测法)

博主联系方式&#xff1a; QQ:1540984562 QQ交流群&#xff1a;892023501 群里会有往届的smarters和电赛选手&#xff0c;群里也会不时分享一些有用的资料&#xff0c;有问题可以在群里多问问。 目录 原理讲解【1】为何选取角点作为特征&#xff1f;【2】角点的定义&#xff1a…

Harris角点检测原理详解

关于角点的应用在图像处理上比较广泛&#xff0c;如图像匹配(FPM特征点匹配)、相机标定等。网上也有很多博客对Harris角点检测原理进行描述&#xff0c;但基本上只是描述了算法流程&#xff0c;而其中相关细节并未作出解释&#xff0c;这里我想对有些地方做出补充说明&#xff…

OpenCV——Harris角点检测

目录 一、Harris角点检测二、C代码三、python代码四、结果展示1、原始图像2、Harris角点 一、Harris角点检测 角点原理来源于人对角点的感性判断&#xff0c;即图像在各个方向灰度有明显变化。算法的核心是利用局部窗口在图像上进行移动判断灰度发生较大的变化&#xff0c;所以…

Harris角点检测

目录 一.基本原理 1.基本思想 2.数学模型 二.实现代码 三.实验结果与分析 1.场景一&#xff1a;纹理平坦场景 2.场景二&#xff1a;多水平边缘场景 3.场景三&#xff1a;角点丰富场景 四.实验总结 一.基本原理 1.基本思想 判断图像的角点&#xff0c;可以利用卷积窗…

harris角点检测原理

目录 1、角点概述 2、数学知识 3、Harris角点检测基本原理 4、优化改进 1、角点概述 如果一个点在任意方向的一个微小变动都会引起灰度很大的变化&#xff0c;那么我们就把它称之为角点&#xff0c;也就是一阶导数(即灰度图的梯度)中的局部最大所对应的像素点就是角点。在现…

计算机视觉(角点检测)- 1 - Harris角点检测

计算机视觉&#xff08;角点检测&#xff09;- 1 - Harris角点检测 学习前言一、Harris角点检测  1、什么是角点&#xff1f;  2、Harris角点检测的基本原理&基本思想  3、Harris角点检测的数学表达  4、获取点数据后&#xff0c;计算 I x &#xff0c; I y I_x&#x…

Visual Studio的sln工程设置VTK、ITK项目

Visual Studio的sln工程设置VTK、ITK项目 最近在学习使用VTK和ITK&#xff0c;使用Visual Studio新建Qt项目时发现项目不是使用过去使用的CMake组织&#xff0c;而是使用的Visual Studio默认的.sln文件&#xff0c;便学习了一下使用Visual Studio的sln工程设置VTK、ITK项目&am…

windows sln的qt 工程

看起来应该vs开发 qt项目不需要qtcreator? 画界面应该还是需要的。装一个vs的插件 2019的如果打开的工程跟你本地的qt不一致 在工程名字上右键change qt version弹出一个框框,里面有俩这里应该选第一个,这个是我本地安装的,vs2015 x86 版本windows sln 工程【这个新建一个q…

Visual studio 2015修改项目文件名及.sln文件名

Visual studio 2015修改项目文件名及.sln文件名&#xff1a; 问题描述 提示&#xff1a;在使用原有的项目代建一个新项目时&#xff0c;为了方便区分与原项目&#xff0c;故要修改该项目的项目名。 如图&#xff1a; 需要将QtGuiApplication1.vcxproj修改成CARFILM.vcxproj&…

C# 解析 sln 文件

我的项目&#xff0c;编码工具 需要检测打开一个工程&#xff0c;获取所有项目。 但是发现原来的方法&#xff0c;如果存在文件夹&#xff0c;把项目放在文件夹中&#xff0c;那么是无法获得项目&#xff0c;于是我就找了一个方法去获得sln文件的所有项目。 原先使用的方法dte…