opencv函数手册里的cornerHarris函数用的是什么核函数

OpenCV2.4.4实现Harris角点检测 - CSDN博客
OpenCV2.4.4实现Harris角点检测
#include &opencv2/highgui/highgui.hpp&
#include &opencv2/imgproc/imgproc.hpp&
#include &iostream&
#include &stdio.h&
#include &stdlib.h&
//全局变量
Mat src, src_//源图和灰度图
int thresh = 200;//默认阈值
int max_thresh = 255;//滑块条最大值
void cornerHarris_demo( int, void* )
Mat dst, dst_norm, dst_norm_
dst = Mat::zeros( src.size(), CV_32FC1 );
int blockSize = 2;
int apertureSize = 3;
double k = 0.04;
//Harris角点检测
cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );
//像素归一化到[0,255]
normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
convertScaleAbs( dst_norm, dst_norm_scaled );//去绝对值后变换为8位无符号类型
Mat src_copy = src.clone();
//在角点上画圈
for( int j = 0; j & dst_norm. j++ )
for( int i = 0; i & dst_norm. i++ )
if( (int) dst_norm.at&float&(j,i) & thresh )
circle(dst_norm_scaled,Point(i,j),3,Scalar(0));
circle(src_copy,Point(i,j),3,Scalar(0,255,0));
/// Showing the result
namedWindow( &Corners&, CV_WINDOW_AUTOSIZE );
imshow( &Corners&, dst_norm_scaled );
imshow( &Src&, src_copy );
int main()
//加载源图像并转换为灰度图
src = imread(&horse.jpg&);
cvtColor( src, src_gray, CV_BGR2GRAY );
//显示源图
namedWindow( &Src&, CV_WINDOW_AUTOSIZE );
imshow( &Src&, src );
//创建滑块条,并指定回调函数为cornerHarris_demo(),每次滑块位置改变时都会调用此函数
createTrackbar( &阈值:&, &Src&, &thresh, max_thresh, cornerHarris_demo );
//调用函数,计算角点
cornerHarris_demo( 0, 0 );
waitKey(0);
return(0);
本文已收录于以下专栏:
相关文章推荐
在学习时主要参考了1.http://blog.csdn.net/xiaowei_cqu/article/details/7805206和opencv-python官方的关于harris的文档(http...
int main()
Mat srcImage = i...
image算法测试iteratoralgorithmfeatures
原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details...
Harris角点检测算子是于1988年由CHris Harris & Mike Stephens提出来的。在具体展开之前,不得不提一下Moravec早在1981就提出来的Moravec角点检测算子。
理解 Harris 角点检测的概念
学习函数: cv2.cornerHarris(), cv2.cornerSubPix()
函数接口//! computes Harris cornerness criteria at each image pixel
CV_EXPORTS_W void cornerHarris( Inpu...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测 - CSDN博客
【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测
特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系。点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(keypoint feature),或“兴趣点”(interest point),或“角点”(conrner)。
关于角点的具体描述可以有几种:
一阶导数(即灰度的梯度)的局部最大所对应的像素点;两条及两条以上边缘的交点;图像中梯度值和梯度方向的变化速率都很高的点;角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。
Harris角点检测
当一个窗口在图像上移动,在平滑区域如图(a),窗口在各个方向上没有变化。在边缘上如图(b),窗口在边缘的方向上没有变化。在角点处如图(c),窗口在各个方向上具有变化。Harris角点检测正是利用了这个直观的物理现象,通过窗口在各个方向上的变化程度,决定是否为角点。
将图像窗口平移[u,v]产生灰度变化E(u,v)
由:, 得到:
对于局部微小的移动量 [u,v],近似表达为:
其中M是 2*2 矩阵,可由图像的导数求得:
E(u,v)的椭圆形式如下图:
定义角点响应函数 R 为:
Harris角点检测算法就是对角点响应函数R进行阈值处理:R & threshold,即提取R的局部极大值。
【相关代码】
OpenCV中定义了 cornerHarris 函数:
void cornerHarris( InputArray src, OutputArray dst, int blockSize,
int ksize, double k,
int borderType=BORDER_DEFAULT );
可以结合 convertScaleAbs 函数,通过阈值取角点:
void cornerHarris_demo( int, void* )
Mat dst, dst_
dst = Mat::zeros( src.size(), CV_32FC1 );
/// Detector parameters
int blockSize = 2;
int apertureSize = 3;
double k = 0.04;
/// Detecting corners
cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );
/// Normalizing
normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
convertScaleAbs( dst_norm, dst_norm_scaled );
/// Drawing a circle around corners
for( int j = 0; j & dst_norm. j++ )
{ for( int i = 0; i & dst_norm. i++ )
if( (int) dst_norm.at&float&(j,i) & thresh )
circle( dst_norm_scaled, Point( i, j ), 5,
Scalar(0), 2, 8, 0 );
circle(src,Point( i, j ), 5,
Scalar(255,0,0), -1, 8, 0 );
/// Showing the result
imshow( corners_window, dst_norm_scaled );
imshow( source_window, src );
Shi-Tomasi 算法
Shi-Tomasi 算法是Harris 算法的改进。Harris 算法最原始的定义是将矩阵 M 的行列式值与 M 的迹相减,再将差值同预先给定的阈值进行比较。后来Shi 和Tomasi 提出改进的方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点。
如上面第二幅图中,对自相关矩阵 M 进行特征值分析,产生两个特征值和两个特征方向向量。因为较大的不确定度取决于较小的特征值,也就是,所以通过寻找最小特征值的最大值来寻找好的特征点也就解释的通了。
Shi 和Tomasi 的方法比较充分,并且在很多情况下可以得到比使用Harris 算法更好的结果。
【相关代码】
由于这种Shi-Tomasi算子与1994年在文章 Good Features to Track [1]中提出,OpenCV 实现的算法的函数名定义为 goodFeaturesToTrack:
void goodFeaturesToTrack( InputArray image, OutputArray corners,
int maxCorners, double qualityLevel, double minDistance,
InputArray mask=noArray(), int blockSize=3,
bool useHarrisDetector=false, double k=0.04 );
自定义使用函数(以方便createTrackbar的响应)如下:
void cornerShiTomasi_demo( int, void* )
if( maxCorners & 1 ) { maxCorners = 1; }
/// Parameters for Shi-Tomasi algorithm
vector&Point2f&
double qualityLevel = 0.01;
double minDistance = 10;
int blockSize = 3;
bool useHarrisDetector =
double k = 0.04;
/// Copy the source image
/// Apply corner detection :Determines strong corners on an image.
goodFeaturesToTrack( src_gray,
maxCorners,
qualityLevel,
minDistance,
blockSize,
useHarrisDetector,
/// Draw corners detected
for( int i = 0; i & corners.size(); i++ ){
circle( dst_norm_scaled,
corners[i], 5,
Scalar(255), 2, 8, 0 );
circle( src, corners[i], 4, Scalar(0,255,0), 2, 8, 0 );
/// Show what you got
imshow( corners_window, dst_norm_scaled );
imshow( source_window, src );
在主函数中定义两个进度条方便调整阈值:
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
createTrackbar( &Threshold: &, source_window, &thresh, max_thresh, cornerHarris_demo );
createTrackbar( &Max
corners:&, source_window, &maxCorners, maxTrackbar, cornerShiTomasi_demo );
namedWindow( corners_window, CV_WINDOW_AUTOSIZE );
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
imshow( source_window, src );
cornerHarris_demo( 0, 0 );
cornerShiTomasi_demo( 0, 0 );
这里还需要说的是OpenCV 2.4.2中给的角点检测跟踪的示例代码有些问题,是应为SURF等不再定义在 feature2d模块中,而是legacy和nonfree,所以需要加入引用:
#include &opencv2/legacy/legacy.hpp&
#include &opencv2/nonfree/nonfree.hpp&
角点检测结果:
蓝色实心点为Harris检测结果,绿色空心圈为goodFeaturetoTrack检测结果。
M特征值分解后每个像素点相减的图(也就是Harris阈值判断的图)如下:
黑色实心点为Harris阈值检测结果,白色空心圈为阈值为27时Shi-Tomasi检测结果。
转载请注明出处:
源码及资料下载:&
参考资料:
[1] Shi and C. Tomasi. Good Features to Track. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 593-600, June 1994.
[2] Richard Szeliski. Computer Vision: Algorithms and Applications. Springer, New York, 2010.
[3] 图像特征点提取PPT &
本文已收录于以下专栏:
相关文章推荐
局部特征系列:
局部特征(1)——入门篇
局部特征(2)——Harris角点
局部特征(3)——SURF特征总结
局部特征(4)——SIFT和SURF的比较
局部特征(5)——如何利...
这一章主要内容:
       1. Harris角点检测
       2. FAST特征检测
      3. 尺度不变的SURF特征检测
      4....
关于角点的应用在图像处理上的应用也比较广泛,比如图像匹配(FPM特征点匹配)、相机标定等。网上也有很多博客对Harris角点检测原理进行描述,但基本上只是描述了算法流程,而其中有关细节并未作出解释,这...
人们普遍认为角点是二维图像亮度变化剧烈的点或图像边缘曲线上曲率极大值的点。这些点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹...
cvFindCornerSubPix利用cvGoodFeaturesToTrack检测出来的角点的基础上,能够将角点位置精确到亚像素级精度。cvGoodFeaturesToTrack的使用可以参考这里...
一、角点定义
有定义角点的几段话:
1、角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别...
Harris特征具有旋转不变性在很多方面应用广泛。演示图像处理
中非常重要的特征提取算法Harris角点检测算法,从原理解释到
代码实现包含了图像编程中各种基本技巧与常见各种处理手段。
图像处理之角点检测与亚像素角点定位 角点是图像中亮度变化最强地方反映了图像的本质特征,提取图像中的角点可以有效提高图像处理速度与精准度。所以对于整张图像来说特别重要,角点检测与提取的越准确图像处理与分...
本篇文章中,我们一起探讨了OpenCV中仿射变换和SURF特征点描述相关的知识点,主要一起了解OpenCV中仿射变换相关的函数warpAffine和getRotationMatrix2D,SURF算法...
Harris角点算法
特征点检测广泛应用到目标匹配、目标跟踪、三维重建等应用中,在进行目标建模时会对图像进行目标特征的提取,常用的有颜色、角点、特征点、轮廓、纹理等特征。现在开始讲解...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测 - CSDN博客
【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测
特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系。点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(keypoint feature),或“兴趣点”(interest point),或“角点”(conrner)。
关于角点的具体描述可以有几种:
一阶导数(即灰度的梯度)的局部最大所对应的像素点;两条及两条以上边缘的交点;图像中梯度值和梯度方向的变化速率都很高的点;角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。
Harris角点检测
当一个窗口在图像上移动,在平滑区域如图(a),窗口在各个方向上没有变化。在边缘上如图(b),窗口在边缘的方向上没有变化。在角点处如图(c),窗口在各个方向上具有变化。Harris角点检测正是利用了这个直观的物理现象,通过窗口在各个方向上的变化程度,决定是否为角点。
将图像窗口平移[u,v]产生灰度变化E(u,v)
由:, 得到:
对于局部微小的移动量 [u,v],近似表达为:
其中M是 2*2 矩阵,可由图像的导数求得:
E(u,v)的椭圆形式如下图:
定义角点响应函数 R 为:
Harris角点检测算法就是对角点响应函数R进行阈值处理:R & threshold,即提取R的局部极大值。
【相关代码】
OpenCV中定义了 cornerHarris 函数:
void cornerHarris( InputArray src, OutputArray dst, int blockSize,
int ksize, double k,
int borderType=BORDER_DEFAULT );
可以结合 convertScaleAbs 函数,通过阈值取角点:
void cornerHarris_demo( int, void* )
Mat dst, dst_
dst = Mat::zeros( src.size(), CV_32FC1 );
/// Detector parameters
int blockSize = 2;
int apertureSize = 3;
double k = 0.04;
/// Detecting corners
cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );
/// Normalizing
normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
convertScaleAbs( dst_norm, dst_norm_scaled );
/// Drawing a circle around corners
for( int j = 0; j & dst_norm. j++ )
{ for( int i = 0; i & dst_norm. i++ )
if( (int) dst_norm.at&float&(j,i) & thresh )
circle( dst_norm_scaled, Point( i, j ), 5,
Scalar(0), 2, 8, 0 );
circle(src,Point( i, j ), 5,
Scalar(255,0,0), -1, 8, 0 );
/// Showing the result
imshow( corners_window, dst_norm_scaled );
imshow( source_window, src );
Shi-Tomasi 算法
Shi-Tomasi 算法是Harris 算法的改进。Harris 算法最原始的定义是将矩阵 M 的行列式值与 M 的迹相减,再将差值同预先给定的阈值进行比较。后来Shi 和Tomasi 提出改进的方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点。
如上面第二幅图中,对自相关矩阵 M 进行特征值分析,产生两个特征值和两个特征方向向量。因为较大的不确定度取决于较小的特征值,也就是,所以通过寻找最小特征值的最大值来寻找好的特征点也就解释的通了。
Shi 和Tomasi 的方法比较充分,并且在很多情况下可以得到比使用Harris 算法更好的结果。
【相关代码】
由于这种Shi-Tomasi算子与1994年在文章 Good Features to Track [1]中提出,OpenCV 实现的算法的函数名定义为 goodFeaturesToTrack:
void goodFeaturesToTrack( InputArray image, OutputArray corners,
int maxCorners, double qualityLevel, double minDistance,
InputArray mask=noArray(), int blockSize=3,
bool useHarrisDetector=false, double k=0.04 );
自定义使用函数(以方便createTrackbar的响应)如下:
void cornerShiTomasi_demo( int, void* )
if( maxCorners & 1 ) { maxCorners = 1; }
/// Parameters for Shi-Tomasi algorithm
vector&Point2f&
double qualityLevel = 0.01;
double minDistance = 10;
int blockSize = 3;
bool useHarrisDetector =
double k = 0.04;
/// Copy the source image
/// Apply corner detection :Determines strong corners on an image.
goodFeaturesToTrack( src_gray,
maxCorners,
qualityLevel,
minDistance,
blockSize,
useHarrisDetector,
/// Draw corners detected
for( int i = 0; i & corners.size(); i++ ){
circle( dst_norm_scaled,
corners[i], 5,
Scalar(255), 2, 8, 0 );
circle( src, corners[i], 4, Scalar(0,255,0), 2, 8, 0 );
/// Show what you got
imshow( corners_window, dst_norm_scaled );
imshow( source_window, src );
在主函数中定义两个进度条方便调整阈值:
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
createTrackbar( &Threshold: &, source_window, &thresh, max_thresh, cornerHarris_demo );
createTrackbar( &Max
corners:&, source_window, &maxCorners, maxTrackbar, cornerShiTomasi_demo );
namedWindow( corners_window, CV_WINDOW_AUTOSIZE );
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
imshow( source_window, src );
cornerHarris_demo( 0, 0 );
cornerShiTomasi_demo( 0, 0 );
这里还需要说的是OpenCV 2.4.2中给的角点检测跟踪的示例代码有些问题,是应为SURF等不再定义在 feature2d模块中,而是legacy和nonfree,所以需要加入引用:
#include &opencv2/legacy/legacy.hpp&
#include &opencv2/nonfree/nonfree.hpp&
角点检测结果:
蓝色实心点为Harris检测结果,绿色空心圈为goodFeaturetoTrack检测结果。
M特征值分解后每个像素点相减的图(也就是Harris阈值判断的图)如下:
黑色实心点为Harris阈值检测结果,白色空心圈为阈值为27时Shi-Tomasi检测结果。
转载请注明出处:
源码及资料下载:&
参考资料:
[1] Shi and C. Tomasi. Good Features to Track. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 593-600, June 1994.
[2] Richard Szeliski. Computer Vision: Algorithms and Applications. Springer, New York, 2010.
[3] 图像特征点提取PPT &
本文已收录于以下专栏:
相关文章推荐
局部特征系列:
局部特征(1)——入门篇
局部特征(2)——Harris角点
局部特征(3)——SURF特征总结
局部特征(4)——SIFT和SURF的比较
局部特征(5)——如何利...
这一章主要内容:
       1. Harris角点检测
       2. FAST特征检测
      3. 尺度不变的SURF特征检测
      4....
关于角点的应用在图像处理上的应用也比较广泛,比如图像匹配(FPM特征点匹配)、相机标定等。网上也有很多博客对Harris角点检测原理进行描述,但基本上只是描述了算法流程,而其中有关细节并未作出解释,这...
人们普遍认为角点是二维图像亮度变化剧烈的点或图像边缘曲线上曲率极大值的点。这些点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹...
cvFindCornerSubPix利用cvGoodFeaturesToTrack检测出来的角点的基础上,能够将角点位置精确到亚像素级精度。cvGoodFeaturesToTrack的使用可以参考这里...
一、角点定义
有定义角点的几段话:
1、角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别...
Harris特征具有旋转不变性在很多方面应用广泛。演示图像处理
中非常重要的特征提取算法Harris角点检测算法,从原理解释到
代码实现包含了图像编程中各种基本技巧与常见各种处理手段。
图像处理之角点检测与亚像素角点定位 角点是图像中亮度变化最强地方反映了图像的本质特征,提取图像中的角点可以有效提高图像处理速度与精准度。所以对于整张图像来说特别重要,角点检测与提取的越准确图像处理与分...
本篇文章中,我们一起探讨了OpenCV中仿射变换和SURF特征点描述相关的知识点,主要一起了解OpenCV中仿射变换相关的函数warpAffine和getRotationMatrix2D,SURF算法...
Harris角点算法
特征点检测广泛应用到目标匹配、目标跟踪、三维重建等应用中,在进行目标建模时会对图像进行目标特征的提取,常用的有颜色、角点、特征点、轮廓、纹理等特征。现在开始讲解...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Opencv2源码分析系列之——cornerHarris - CSDN博客
Opencv2源码分析系列之——cornerHarris
1. cornerHarris函数分析
#include &iostream&
#include &opencv2/opencv.hpp&
#include &opencv2/imgproc/imgproc.hpp&
#include &opencv2/highgui/highgui.hpp&
int main( void )
Mat image = imread("D:\\testpic\\mypic.jpg", 0);
if ( !image.data )
cout && "read image error" &&
waitKey( 10000 );
imshow("original", image);
cv::Mat cornerS
cv::cornerHarris(image,
cornerStrength,
cv::Mat harrisC
double threshold= 0.001;
cv::threshold(cornerStrength,harrisCorners,
threshold,255,cv::THRESH_BINARY);
imshow("Harris", harrisCorners);
while( char(waitKey(1)) != 'q' )
运行结果如下:
图片最亮的像素点对应的值为0.014903,所以我们选择0.01作为阈值。
2. cornerHarris源码分析
void myHarris( const Mat& src, Mat& eigenv, int block_size, int aperture_size, double k = 0. )
eigenv.create(src.size(), CV_32F);
Mat Dx, Dy;
Sobel(src, Dx, CV_32F, 1, 0, aperture_size);
Sobel(src, Dy, CV_32F, 0, 1, aperture_size);
Size size = src.size();
Mat cov(size, CV_32FC3);
for ( int i = 0; i & size. i++ )
float* cov_data = cov.ptr&float&(i);
const float* dxdata = Dx.ptr&float&(i);
const float* dydata = Dy.ptr&float&(i);
for ( int j = 0; j & size. j++ )
float dx = dxdata[j];
float dy = dydata[j];
cov_data[j*3] = dx *
cov_data[j*3 + 1] = dx *
cov_data[j*3 + 2] = dy *
boxFilter(cov, cov, cov.depth(), Size(block_size, block_size), Point(-1, -1), false);
size = cov.size();
if ( cov.isContinuous() && eigenv.isContinuous() )
size.width *= size.
size.height = 1;
for ( int i = 0; i & size. i++ )
const float* covPtr = cov.ptr&float&(i);
float* dstPtr = eigenv.ptr&float&(i);
for ( int j = 0; j & size. j++ )
float a = covPtr[j*3];
float b = covPtr[j*3 + 1];
float c = covPtr[j*3 + 2];
dstPtr[j] = (float)(a*c - b*b - k*(a + c)*(a + c));
double max, min;
minMaxLoc(eigenv, &min, &max);
double threshold = 0.1 * max;
cv::threshold(eigenv, eigenv, threshold, 1, CV_THRESH_BINARY);
imshow("eigenv", eigenv);
3. goodFeaturesToTrack
从cornerHarris得到角点响应图像即使阈值化也不能得到我们想要的角点,因为可能出现一片连续的区域的角点响应都大于阈值。所以OpenCV中有个goodFeaturesToTrack的函数帮我们选择好的角点:
Mat maskArea = Mat(image.size(), CV_8UC1, Scalar(0));
Mat maskROI = maskArea(Rect(300, 50, 150, 200));
maskROI.setTo(255);
imshow("mask", maskArea);
vector&Point2f&
Mat cornersImage = image.clone();
goodFeaturesToTrack(image,
for ( vector&Point2f&::const_iterator itBegin = points.begin(); itBegin != points.end(); itBegin++ )
circle(cornersImage, *itBegin, 5, Scalar(255), 1);
imshow("corners", cornersImage);
4. goodFeaturesToTrack源码分析
void myGoodFeaturesToTrack( Mat& image, double qualityLevel, double minDistance, int maxCorners )
cornerHarris(image, eig, 5, 3, 0.06);
double maxVal = 0;
minMaxLoc(eig, 0, &maxVal, 0, 0, Mat());
threshold(eig, eig, qualityLevel*maxVal, 0, THRESH_TOZERO);
dilate(eig, tmp, Mat());
vector&const float*& tmpC
Size imageSize = image.size();
for ( int y = 1; y & imageSize.height -1; y++ )
float* eig_data = (float*)eig.ptr&float&(y);
float* tmp_data = (float*)tmp.ptr&float&(y);
for ( int x =1; x & imageSize.width -1; x++ )
float val = eig_data[x];
if ( val != 0 && val == tmp_data[x] )
tmpCorners.push_back(eig_data + x);
sort(tmpCorners, greaterThanPtr&float&());
vector&Point2f&
size_t i, j, total = tmpCorners.size(), ncorners = 0;
if ( minDistance &= 1 )
int w = image.
int h = image.
const int cell_size = cvRound(minDistance);
const int grid_width = (w + cell_size -1) / cell_
const int grid_height = (h + cell_size -1) /cell_
vector&vector&Point2f& &
grid(grid_width*grid_height);
minDistance *= minD
for ( i =0; i & i++ )
int ofs = (int)((const uchar*)tmpCorners[i] - eig.data);
int y = (int)(ofs / eig.step);
int x = (int)((ofs - y*eig.step) / sizeof(float));
bool good = true;
int x_cell = x / cell_
int y_cell = y / cell_
int x1 = x_cell - 1;
int y1 = y_cell - 1;
int x2 = x_cell + 1;
int y2 = y_cell + 1;
x1 = max(0, x1);
y1 = max(0, y1);
x2 = min(grid_width-1, x2);
y2 = min(grid_height-1, y2);
for ( int yy = y1; yy &= y2; yy++ )
for ( int xx = x1; xx &= x2; xx++ )
vector&Point2f&& m = grid[yy*grid_width + xx];
if ( m.size() )
for ( j =0; j & m.size(); j++ )
float dx = x - m[j].x;
float dy = y - m[j].y;
if ( dx*dx + dy*dy & minDistance )
good = false;
goto break_
break_out:
if ( good )
grid[y_cell*grid_width + x_cell].push_back(Point2f((float)x, (float)y));
circle(image, Point(x, y), 5, Scalar(255), 2);
corners.push_back(Point2f((float)x, (float)y));
if ( maxCorners & 0 && (int)ncorners == maxCorners )
for ( i = 0; i & i++ )
int ofs = (int)((const uchar*)tmpCorners[i] - eig.data);
int y = (int)(ofs / eig.step);
int x = (int)((ofs - y*eig.step) / sizeof(float));
circle(image, Point(x, y), 5, Scalar(255), 2);
corners.push_back(Point2f((float)x, (float)y));
if ( maxCorners & 0 && (int)ncorners == maxCorners )
imshow("eig", image);
本文已收录于以下专栏:
相关文章推荐
Matlab 中读、写及显示一幅图像的命令各是什么?解:第一、Matlab中读图像函数是imread( )。imread 函数用于读入各种图像文件,其一般的用法为:[X,MAP]=imread(‘fi...
以下摘录自
http://blog.csdn.net/zhaocj?viewmode=contents
Opencv2.4.9源码分析要点摘录
最近需要做一个图像分割的程序,查了opencv的源代码,发现opencv里实现的图像分割一共有两个方法,watershed和mean-shift算法。这两个算法的具体实现都在segmentation....
opencv 基本数据结构DataType : 将C++数据类型转换为对应的opencv数据类型enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=...
文章来源:Jason Ding,http://blog.csdn.net/jasonding1354
从OpenCV2.4开始,加入了新的类FaceRecognizer,...
本文主要自OpenCVChina,转载请注明出处.cn/lucyloveayu
OpenCV是一个基于C/C++语言的开源图像处理函数库,其特点有:
FaceRecognizer类
OpenCV中所有人脸识别的模型都是继承自FaceRecognizer这个基类,这个类提供了人脸识别算法的统一接口。
class FaceRecognizer : p...
特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系。点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(...
在计算机视觉中,兴趣点(也叫关键点或者特征点)的概念被大量用于解决物体识别、图像匹配、视觉跟踪、三维重建等问题。它依赖于这个想法,即不再观察整副图像,而是选择某些特殊的点,然后对它们执行局部分析。如果...
Harri角点检测的原理分析网上已经一大堆,这里则简单介绍Harris角点检测,并结合原理分析opencv实现的源码。
参考资料:
http://blog.csdn.net/ZengDong...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 cornerharris函数 的文章

 

随机推荐