当前位置: 首页 > news >正文

OpenCV第十二讲:角点检测与亚像素精度

1. Harris角点检测

角点检测被定义两条边的交点, 在实际应用中,大多数所谓的角点检测方法检测的是拥有特定特征的图像点, 而不仅仅是角点。

角点: 如果某一点在任意方向的一个微小变动都会引起灰度很大的变化,那么将其称之为角点。

  • 角点的性质

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

    • 基于灰度图像的角点检测

      • 基于梯度

      • 基于模板
        主要考虑像素领域点的灰度变化,常见的基于模板的角点检测算法有:Kitchen-Rosenfeld, Harris, KLT以及SUSAN角点检测。

      • 基于模板梯度组合

    • 基于二值图像的角点检测

    • 基于轮廓曲线的角点检测

  • Harris角点检测: cornerHarris()函数

    harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性高,尤其对L型角点检测精度高。

		cvtColor(srcimage, grayImage, COLOR_BGR2GRAY);
	
		cornerHarris(grayImage, HarrImage, 2, 3, 0.01);
		// 这里显示没有结果, 一片黑暗
		//imshow("cornerHarris", HarrImage); 
		Mat harrisCorners;
		threshold(HarrImage, harrisCorners, 0.00001, 255, CV_THRESH_BINARY);
		imshow("cornerHarris2", harrisCorners);
  • 测试结果

2.Shi-Timasi角点检测

该方法是对Harris算法的改进。

原始定义: 将矩阵M的行列式与M的迹****相减, 再将差值同预先给定的阈值进行比较。

改进方法:若两个特征值中较小的一个大于最小阈值,则会得到强角点

  • OpenCV函数 goodFeatureToTrack()
		RNG g_rng(12345);
	
		Mat FeaturesTrack;
		Mat copyrgb = srcimage.clone();
		imshow("copyColor", copyrgb);
		vector<Point2f> corners;
		goodFeaturesToTrack(grayImage, corners, 150, 0.01, 10, Mat(), 3, false, 0.04);
		cout<<"corners.size() = "<<corners.size()<<endl;
	
		for(int i=0; i<corners.size(); i++)
		{
			circle(copyrgb, corners[i],4, Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)), 1, 8, 0);
		}
		imshow("Corners", copyrgb);
  • 测试结果

在这里插入图片描述

3. 亚像素级角点检测

上面介绍的都是用于特征点的识别, 那么如果是要进行几何测量,上述方法可能就不太适合,因为他们提供的是像素的整数坐标值,而有时候我们需要实数坐标值。

亚像素精度(sub-Pixel): 像素与像素之间的还有更细小的单元,这就是亚像素,通常会是原来像素的几分之一的大小。
在这里插入图片描述

  • OpenCV函数 cornerSubPix()

    cornerSubPix()函数用于寻找亚像素角点位置,不是整数型位置,而是更精确的浮点型位置。

相比于角点检测的位置,亚像素级的检测在点的结果上更加精确

相关文章:

  • OpenCV第十三讲:SURF特征点的检测与匹配详解
  • OpenCV第十四讲: Fast特征点与ORB特征点原理详解
  • DAVIS第一课: 事件相机的工作原理和相关核心功能简介
  • DAVIS第二课:基于事件相机的视觉里程计
  • Rtab-Map学习之rtabmap_ros源代码剖析
  • DAVIS前言:事件相机资料调研
  • DAVIS第三课: 基于事件相机的光流法计算
  • CUDA学习第一天: 基础概念扫盲
  • CUDA学习第二天: GPU核心与SM核心组件
  • DAVIS第四课:基于DAVIS的特征点检测和追踪
  • CUDA学习第三天:Kernel+grid+block关系
  • DAVIS第五课: 基于事件相机的一种几何实时3DSLAM算法
  • ubuntu学习技巧1:容易混淆但又重要的命令
  • RGB颜色空间对应的不同颜色列表
  • V-SLAM重读(1): SVO: Fast Semi-Direct Monocular Visual Odometry
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • GitUp, 你不可错过的秀外慧中的git工具
  • JavaWeb(学习笔记二)
  • Mac转Windows的拯救指南
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • node和express搭建代理服务器(源码)
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • WePY 在小程序性能调优上做出的探究
  • 漂亮刷新控件-iOS
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 应用生命周期终极 DevOps 工具包
  • Hibernate主键生成策略及选择
  • ​MySQL主从复制一致性检测
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (过滤器)Filter和(监听器)listener
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • .describe() python_Python-Win32com-Excel
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET开源项目介绍及资源推荐:数据持久层
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .net网站发布-允许更新此预编译站点
  • .NET运行机制
  • @Builder用法
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [100天算法】-实现 strStr()(day 52)
  • [20160807][系统设计的三次迭代]
  • [Android]创建TabBar
  • [Android]使用Retrofit进行网络请求
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [C/C++]数据结构 循环队列
  • [c++] 单例模式 + cyberrt TimingWheel 单例分析
  • [CentOs7]图形界面
  • [Codeforces] probabilities (R1600) Part.1
  • [C语言]——分支和循环(4)