【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测角点特征检测与匹配是 ComputerVisi 应用总重要的一部分 这需要寻找图像之间的特征建立对应关系 点 也就是图像中的特殊位置 是很常用的一类特征 点的局部特征也可以叫做 关键特征点 keypointfeat 或 兴趣点 interestpoin 或 角点 conrner 关于角点的具体描述可以有几种 一阶导数 即灰度的梯度 的局部最大所对应的像素点

角点

特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系。点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(keypoint feature),或“兴趣点”(interest point),或“角点”(conrner)。

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

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

 

Harris角点检测

当一个窗口在图像上移动,在平滑区域如图(a),窗口在各个方向上没有变化。在边缘上如图(b),窗口在边缘的方向上没有变化。在角点处如图(c),窗口在各个方向上具有变化。Harris角点检测正是利用了这个直观的物理现象,通过窗口在各个方向上的变化程度,决定是否为角点。

【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

将图像窗口平移[u,v]产生灰度变化E(u,v)

【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

由:【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测, 得到:

【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

对于局部微小的移动量 [u,v],近似表达为:

【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

其中M是 2*2 矩阵,可由图像的导数求得:

【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

E(u,v)的椭圆形式如下图:

【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

 

定义角点响应函数 R 为:

【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

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_norm; 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.rows ; j++ ) { for( int i = 0; i < dst_norm.cols; i++ ) { if( (int) dst_norm.at 
  
    (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 进行特征值分析,产生两个特征值【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测和两个特征方向向量。因为较大的不确定度取决于较小的特征值,也就是【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测,所以通过寻找最小特征值的最大值来寻找好的特征点也就解释的通了。
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 
  
    corners; double qualityLevel = 0.01; double minDistance = 10; int blockSize = 3; bool useHarrisDetector = false; double k = 0.04; /// Copy the source image Mat cormat; /// Apply corner detection :Determines strong corners on an image. goodFeaturesToTrack( src_gray, corners, maxCorners, qualityLevel, minDistance, Mat(), blockSize, useHarrisDetector, k ); /// 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 );
#include "opencv2/legacy/legacy.hpp" #include "opencv2/nonfree/nonfree.hpp"

 

角点检测结果:

【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

蓝色实心点为Harris检测结果,绿色空心圈为goodFeaturetoTrack检测结果。

M特征值分解后每个像素点相减的图(也就是Harris阈值判断的图)如下:

【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

黑色实心点为Harris阈值检测结果,白色空心圈为阈值为27时Shi-Tomasi检测结果。

转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/

源码及资料下载: https://github.com/xiaoweicqu/corner-detect

参考资料:

[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 http://wenku.baidu.com/view/f61bc369561252d380eb6ef0.html 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/175790.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午11:25
下一篇 2026年3月26日 下午11:25


相关推荐

  • BS架构与CS架构的区别(最详细)「建议收藏」

    BS架构与CS架构的区别(最详细)「建议收藏」BS架构与CS架构的区别引言特点C/S系统结构B/S系统结构CS与BS的比较C/S与B/S区别:现状与趋势(转自知乎)引言C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势。早期的软件系统多以此作为首选设计标准。B/S结构,即Browse…

    2022年10月17日
    4
  • 发布NuGet包

    发布NuGet包文章目录 1 登录 NuGet1 1 打开 NuGet 包管理器 https www nuget org 1 2 使用微软账号登录 1 3 点击账号 下拉菜单中的 APIKeys2 创建 APIKeys2 1Create2 2Manage3 创建类库项目 3 1 选择 NETStandard2 1 框架 3 2 写一个方法 3 3 双击类库的项目名 打开 csproj 文件 3 4 执行命令 打包 4 将 nupkg 文件推送到 NuGet 仓库 1 登录 NuGet1 1 打开 NuGet 包管理器 1

    2026年3月19日
    3
  • java调用第三方接口(项目亲测)

    java调用第三方接口(项目亲测)publicstaticStringcompression(StringsmUrl,Stringdata){ //smUrl:接口地址//data:请求参数:应该是json格式,我直接把json转成String了OutputStreamWriterout=null;BufferedReaderbr=null;Stringresult=””;try{URLurl=n.

    2022年5月8日
    50
  • 交换机与poe交换机区别_网络交换机和poe交换机区别

    交换机与poe交换机区别_网络交换机和poe交换机区别POE(PowerOverEthernet)指的是在目前的以太网接口Cat.5走线系统架构未作其他改变的情形下,在为一些由于IP的终端设备(如IP电话机,无线网络连接点AP,网络摄像头等)传送数据数据信号的与此同时,还能为该类机器设备给予直流电源的技术性.便是适用以太网接口供电的交换机。POE交换机和普通交换机有什么区别呢?关键分成五大层面的不一样:1.可靠性不一样;2.传送功能不一样;3.成本费不一样;4.供电方法不一样;5.操纵不一样。1.可靠性不一样;POE交换机便是适用对网络.

    2026年4月17日
    3
  • 一个服务器上运行多个tomcat,显示总启动某一个特定tomcat

    一个服务器上运行多个tomcat,显示总启动某一个特定tomcat

    2021年7月17日
    73
  • java exe 反编译工具_windows下java反编译工具

    java exe 反编译工具_windows下java反编译工具JD GUI 是一个具有图形界面的 Java 源代码 class 文件反编译工具 由 PavelKouznet 开发 支提供了 Eclipse 平台下的插件 JD Eclipse 可以把 class 文件编译成 java 文件 而且支持层级关系 在打开子类的情况下 直接点击父类名称 即可进入父类文件 并且可以在 eclipse 下运行 对 java 开发者而言是一款真正强大的 class 反编译器 安装说明 找到 java 反编

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号