OpenCV3入门(十二)角点检测
1、角点介绍
角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别等领域中,也称为特征点检测。在图像中角点是一个重要的局部特征,它决定了图像中关键区域的形状,体现了图像中重要的特征信息。目前,角点检测方法主要有2大类:
1)基于图像边缘轮廓特征的方法。
2)基于图像灰度信息的方法。此方法主要通过计算曲率及梯度进行角点检测,通过计算边缘的曲率来判断角点的存在性。典型代表有Harris算法、Susan算法、Moravec算法等。
角点通常被定义为两条边的交点,更严格的说,角点的局部邻域应该具有两个不同区域的不同方向的边界。而实际应用中,大多数所谓的角点检测方法检测的是拥有特定特征的图像点,而不仅仅是“角点”。这些特征点在图像中有具体的坐标,并具有某些数学特征,如局部最大或最小灰度、某些梯度特征等。现有的角点检测算法并不是都十分的健壮。很多方法都要求有大量的训练集和冗余数据来防止或减少错误特征的出现。另外,角点检测方法的一个很重要的评价标准是其对多幅图像中相同或相似特征的检测能力,并且能够应对光照变化、图像旋转等图像变化。
2、Harris算法介绍
Harris 是 Harris 和 Stephens 在 1988 年提出,专门针对 Moravec 算子的改进版。Harris 算子,又称 Plessey算子,它基于与 Moravec 相同的角点定义,即定义在各个方向上灰度值变化的点。
角点可以如下图形象的定义,如果在各个方向上移动这个小窗口,窗口内的灰度发生了较大的变化,那么说明窗口内存在角点;如果在各个方向移动,灰度几乎不变,说明是平坦区域;如果只沿着某一个方向移动,灰度几乎不变,说明是直线(边缘)。
设图像窗口平移[u,v] ,产生的灰度变化为E[u,v] ,则:
上式中,窗口函数是一个矩形窗口或高斯窗口,它给在其中的像素加权。
我们必须使边角检测的函数最大化,这意味着,我们必须最大限度地利用第二个参数。
根据角点的定义,平坦区域,像素变化小,那么上式后半部分基本接近为0;在边缘区域,会在沿着边缘方向上差值为一个稳定值;只有在角点处,无论向那个方向移动,都会发生变化。
根据泰勒级数展开:
那么f(x+u, y+v)可以简化为:
f(x+u, y+v) ≈ f(x,y) + ufx(x,y) + vfy(x,y)
Harris算式的可以写成矩阵模式。
Harris算式可以近似得到下面的表达:
其中M为:
其中,表示 Ix 方向的梯度,表示Iy 方向的梯度,为高斯函数。矩阵的特征值是自相关函数的一阶曲率。特征值的大小与特征点的性质息息相关。即当两个特征值都比较小时,则此点可能位于平坦区,不为角点或边界点; 当两个特征值一个较大、而另一个却相对较小时,则此点位于边界上,属于边界点; 当两个特征值均相对较大时,则此点沿任意方向的曲率都较大,为需要提取的角点。
M为梯度的协方差矩阵,在实际应用中为了能够应用更好的编程,定义了角点响应函数R,通过判定R大小来判断像素是否为角点。R取决于M的特征值,对于角点|R|很大,平坦的区域|R|很小,边缘的R为负值。Harris角点检测算法就是对角点响应函数R进行阈值处理:R > threshold,即提取R的局部极大值。
其中,det(M) = λ1* λ1, trace(M) =λ1+ λ1 。k是经验参数,一般取值为0.04~0.06。
当R为大数值正数的时候,表示为角点。如下图所示:
3、Harris实验
OpenCV函数原型:
C++:void cornerHarris( InputArray src, //输入8bit单通道灰度Mat矩阵
OutputArray dst, //保存角点检测结果,32位单通道,大小与src相同
int blockSize, //滑块窗口的尺寸、邻域的大小
int ksize, //Sobel边缘检测滤波器大小
double k, //Harris中间参数,经验值0.04~0.06
int borderType=BORDER_DEFAULT //插值类型
);
测试实例:
int threshod_val = ;
int max_threshod_val = ;
Mat src_img; void call_back(int, void*)
{
Mat normImage, scaledImage;
Mat Img_scr1 = src_img.clone();
Mat Img_dst = Mat::zeros(src_img.size(), CV_32FC1); cornerHarris(src_img, Img_dst, , , 0.04, BORDER_DEFAULT); //进行角点检测
normalize(Img_dst, normImage, , , NORM_MINMAX, CV_32FC1, Mat()); // 归一化
convertScaleAbs(normImage, scaledImage);//将归一化后的图线性变换成8位无符号整型 for (int i = ; i < normImage.rows; i++)
{
for (int j = ; j < normImage.cols; j++)
{
if ((int)normImage.at<float>(i, j) > threshod_val + )
{
circle(Img_scr1, Point(j, i), , Scalar(, , ), , , );
circle(scaledImage, Point(j, i), , Scalar(, , ), , , );
}
} } imshow("corner", Img_scr1);
imshow("scaledImage", scaledImage);
} int main() {
src_img = imread("D:\\WORK\\5.OpenCV\\LeanOpenCV\\pic_src\\checkerboard.png");
imshow("原图", src_img); cvtColor(src_img, src_img, COLOR_BGR2GRAY);
namedWindow("corner");
createTrackbar("thresh", "corner", &threshod_val, max_threshod_val, call_back);
call_back(threshod_val, ); waitKey();
}
输出结果如下图:
测试2:
4、参考文献
1、A COMBINED CORNER AND EDGE DETECTOR,Chris Harris,Mike Stephens,1988
http://www.bmva.org/bmvc/1988/avc-88-023.pdf
2、Harris Corner Detection
3、Harris 角点检测子
4、【OpenCV入门教程之十六】OpenCV角点检测之Harris角点检测
https://blog.csdn.net/poem_qianmo/article/details/29356187
5、(四)OpenCV中的特征检测之Harris Corner检测
https://blog.csdn.net/u014403318/article/details/80562785
6、OpenCV学习笔记(八)——Harris角度特征从原理到实现详解
https://blog.csdn.net/weixin_41695564/article/details/79962401
7、《OpenCV3 编程入门》,电子工业出版社,毛星雨著
8、《学习OpenCV》,清华大学出版社,Gary Bradski, Adrian kaehler著
技术博客,转载请注明。
OpenCV3入门(十二)角点检测的更多相关文章
- Android入门(十二)SQLite事务、升级数据库
原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...
- ES6入门十二:Module(模块化)
webpack4打包配置babel7转码ES6 Module语法与API的使用 import() Module加载实现原理 Commonjs规范的模块与ES6模块的差异 ES6模块与Nodejs模块相 ...
- OpenCV3入门(二)Mat操作
1.Mat结构 1.1.Mat数据 Mat本质上是由两个数据部分组成的类: 矩阵头:包含信息有矩阵的大小,用于存储的方法,矩阵存储的地址等 数据矩阵指针:指向包含了像素值的矩阵. 矩阵头部的大小是恒定 ...
- SpringBoot入门 (十二) 定时任务
本文记录在SpringBoot中使用定时任务. 在我们的项目中,经常需要用到定时任务去帮我们做一些事情,比如服务状态监控,业务数据状态的更改等,SpringBoot中实现定时任务有2中方案,一种是自带 ...
- java web开发入门十二(idea创建maven SSM项目需要解决的问题)基于intellig idea(2019-11-09 11:23)
一.spring mvc action返回string带双引号问题 解决方法: 在springmvc.xml中添加字符串解析器 <!-- 注册string和json解析适配器 --> &l ...
- Hibernate入门(十二)离线条件检索
Hibernate——离线条件检索DetachedCriteria DetachedCriteria翻译为离线条件查询,因为它是可以脱离Session来使用的一种条件查询对象,我们都知道Criteri ...
- [WebGL入门]十二,模型数据和顶点属性
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外.鄙人webgl研究还不够深入,一些专业词语.假设翻译有误.欢迎大家指 ...
- Spring入门(十二):Spring MVC使用讲解
1. Spring MVC介绍 提到MVC,参与过Web应用程序开发的同学都很熟悉,它是展现层(也可以理解成直接展现给用户的那一层)开发的一种架构模式,M全称是Model,指的是数据模型,V全称是Vi ...
- Spring入门(十四):Spring MVC控制器的2种测试方法
作为一名研发人员,不管你愿不愿意对自己的代码进行测试,都得承认测试对于研发质量保证的重要性,这也就是为什么每个公司的技术部都需要质量控制部的原因,因为越早的发现代码的bug,成本越低,比如说,Dev环 ...
- 网络编程懒人入门(十):一泡尿的时间,快速读懂QUIC协议
1.TCP协议到底怎么了? 现时的互联网应用中,Web平台(准确地说是基于HTTP及其延伸协议的客户端/服务器应用)的数据传输都基于 TCP 协议. 但TCP 协议在创建连接之前需要进行三次握手(如下 ...
随机推荐
- zabbix数据库占用磁盘空间较大的处理方法
du -h /* |sort -nr 使用此命令一步步排查发现/var/lib/mysql/zabbix/这个目录占用磁盘空间较大 发现history_log.ibd这个文件最大,达到了38G,此文 ...
- LeetCode No.88,89,90
No.88 Merge 合并两个有序数组 题目 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 ...
- jQ给下拉框绑定事件,为什么要绑定在框(select标签)上,而不是绑定在选项(option标签)上
这是我在学习锋利的 jquery 书中 5.1.4 的代码时遇到的一个小问题,源代码如下: <head> <style type="text/css"> * ...
- scala语言yield配合for的用法实例
yield配合for的用法 话不多说见实例 package com.donews.reynold /** * Created by reynold on 2017/3/23. */ object Sc ...
- 轮询本机所有网卡的IP地址
#include <stdio.h> #include <sys/types.h> #include <ifaddrs.h> #include <netine ...
- verilog求倒数-ROM实现方法
采用线性逼近法结合32段线性查找表的方式来实现1/z的计算. 首先将1/32-1/64的定点化数据存放到ROM中,ROM中存放的是扩大了2^20 次方的数字四舍五入后的整数部分.n值越大,精度越大,误 ...
- 使用jQuery的".css()"和".attr()"方法设置元素"left"属性的注意点
今天在使用jQuery方法".css()"设置"ajax-loader.gif"的位置时出了点小状况,关键代码如下(为了简化,这里假定要给"ajax- ...
- springboot项目基础面试题
1.springboot与spring的区别. 引用自官方说法: java在集成spring等框架需要作出大量的配置,开发效率低,繁琐.所以官方提出 spring boot的核心思想:习惯优于配置.可 ...
- Linux 下centos7启动 Tomcat 抛出Can't connect to X11 window server 问题的解决方法
1 问题 今天启动 Tomcat 后,登录页验证码不见了.在 localhost.xxx.log 发现以下错误: org.apache.catalina.core.StandardWrapperVal ...
- MongoDBcrud操作,采集部分代码
using System; using System.Collections.Generic; using System.ComponentModel.Design; using System.Lin ...