这样想象一下,直线上的一个点在垂直于直线的方向上有最强的梯度。沿着直线的方向梯度较低,意思是直线上的像素点与它周围的像素点看起来相似。我们进行的角点检测是梯度强度明显高于其他像素的点,可能就是目标处的拐点。它的这个特性可以被应用到同一场景的多视角检测及运动中估计。
$${\rm{c}}(x,y,\Delta x,\Delta y) = {\sum\limits_{(i,j) \in W(x,y)} {W(i,j)(I(i,j) - I(i + \Delta x,j + \Delta y))} ^2}$$

  W(x,y)是一个小窗口N*N的局部正方形图像,要检测的角点就存在于这个局部图形中,对于图像强度I(x,y),计算结果只是点(x,y)处的图像与位移变化处的平方差加权和。W(i,j)是高斯加权,保证靠近窗口中心的平方差比离中心远的平方差权重更大。由于变化量很小,用一阶偏导数表示。自相关形式如下表示(一阶泰勒近似):
$${\rm{c}}(x,y,\Delta x,\Delta y) = \left[ {\begin{array}{*{20}{c}}
{\Delta x}&{\Delta y}
\end{array}} \right]M(x,y)\left[ {\begin{array}{*{20}{c}}
{\Delta x}\\
{\Delta y}
\end{array}} \right]$$

  M(x,y)为自相关矩阵Ix,Iy为I(x,y)在x和y方向的一阶偏导数。
\[{\rm{M(x,y)}} = \sum\limits_{ - K \le i,j \le K} {W(i,j)} \left[ {\begin{array}{*{20}{c}}
{I_x^2(x + i,y + j)}&{{I_x}(x + i,y + j){I_y}(x + i,y + j)}\\
{{I_x}(x + i,y + j){I_y}(x + i,y + j)}&{I_y^2(x + i,y + j)}
\end{array}} \right]\]

  角点是自相关矩阵中具有两个大的特征值的位置,实际意义是,在不考虑图片旋转的情况下,两个大的特征值表示在任何方向上移动一小段距离都会造成图像改变。Harris的定义如下:
\[{\rm{H = }}\det (M) - ktrac{e^2}(M) = {\lambda _1}{\lambda _2} - k{({\lambda _1} + {\lambda _2})^2}\]

  通过搜索该函数的局部最大值找到关键角点(k为灵敏度)。检测结果如下图所示:

cornerHarris(dst,aim,blocksize,ksize,k,BORDER_DEFAULT);
关键参数说明:blocksize表示邻域的大小,ksize表示Sobel算子的卷积核大小,k表示公式中的Harris灵敏度.
  • 参考代码如下:
 #include<opencv2/opencv.hpp>
#include<iostream> using namespace cv;
using namespace std;
int init_value = ;
int max_value = ;
void Harris_Demo(int, void*);
Mat src, dst;
int main(int argc,char** argv)
{ src = imread("H:/cv_code/image/home.jpg");
if (src.empty())
{
printf("could not find image");
return -;
}
namedWindow("src",CV_WINDOW_AUTOSIZE);
imshow("src",src); cvtColor(src,dst,COLOR_BGR2GRAY);
namedWindow("huidu", CV_WINDOW_AUTOSIZE);
imshow("huidu", dst); namedWindow("output", CV_WINDOW_AUTOSIZE);
createTrackbar("value:","output",&init_value,max_value,Harris_Demo);
Harris_Demo(,);
waitKey();
return ;
}
void Harris_Demo(int, void*)
{
Mat aim, norm_dst, normsc_dst;
aim = Mat::zeros(src.size(),CV_32FC1);
int blocksize = ;
int ksize = ;
double k = 0.04;
cornerHarris(dst,aim,blocksize,ksize,k,BORDER_DEFAULT); normalize(aim,norm_dst,,,NORM_MINMAX,CV_32FC1,Mat());
convertScaleAbs(norm_dst,normsc_dst); Mat resulting = src.clone();
for (int row = ; row < norm_dst.rows; row++)
{ for (int col = ; col < norm_dst.cols; col++)
{ if ((int)norm_dst.at<float>(row,col)> init_value+)
circle(resulting,Point(col,row),,Scalar(,,),,,); } }
imshow("output",resulting);
}

Harris角点检测理论的更多相关文章

  1. Opencv学习笔记------Harris角点检测

    image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/73 ...

  2. 第十一节、Harris角点检测原理(附源码)

    OpenCV可以检测图像的主要特征,然后提取这些特征.使其成为图像描述符,这类似于人的眼睛和大脑.这些图像特征可作为图像搜索的数据库.此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比 ...

  3. OpenCV Harris 角点检测子

    Harris 角点检测子 目标 本教程中我们将涉及: 有哪些特征?它们有什么用? 使用函数 cornerHarris 通过 Harris-Stephens方法检测角点. 理论 有哪些特征? 在计算机视 ...

  4. Harris角点检测原理详解

    http://blog.csdn.net/lwzkiller/article/details/54633670 关于角点的应用在图像处理上比较广泛,如图像匹配(FPM特征点匹配).相机标定等.网上也有 ...

  5. OpenCV计算机视觉学习(13)——图像特征点检测(Harris角点检测,sift算法)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 前言 ...

  6. Harris角点检测算法优化

    Harris角点检测算法优化 一.综述 用 Harris 算法进行检测,有三点不足:(1 )该算法不具有尺度不变性:(2 )该算法提取的角点是像素级的:(3 )该算法检测时间不是很令人满意. 基于以上 ...

  7. Harris角点检测

    代码示例一: #include<opencv2/opencv.hpp> using namespace cv; int main(){ Mat src = imread(); imshow ...

  8. Harris 角点检测

    一 .Motivation 对于做图像处理的人来说,Harris角点检测肯定听过,1988年发表的文章"A combined corner and edge detector"描述 ...

  9. Harris角点检测算原理

    主要参考了:http://blog.csdn.net/yudingjun0611/article/details/7991601  Harris角点检测算子 本文将该文拷贝了过来,并做了一些数学方面的 ...

随机推荐

  1. 【读书笔记】https://source.android.google.cn/devices/bootloader

    https://source.android.google.cn/devices/bootloader 本文主要记录aosp官网关于bootloader的相关资料 Bootloader A bootl ...

  2. open xml 导出excel遇到的问题

    我有一个需求:使用ajax 下载excel文件 结果:失败 原因:下载文件是通过浏览器解析二级制流下载的,而ajax返回的是文本 方法: 1.如果你下载不需要参数,那直接写个a标签链接到地址就行 2. ...

  3. 如何在vue-cli中使用vuex(配置成功

    前言 众所周知,vuex 是一个专为 vue.js 应用程序开发的状态管理模式,在构建一个中大型单页应用中使用vuex可以帮助我们更好地在组件外部管理状态.而vue-cli是vue的官方脚手架,它能帮 ...

  4. filter逻辑bug

    复合筛选,有个要求是如果筛选条件是空就不传,加了一个逻辑 看着没什么问题,但是存在bug,当重置单一筛选条件时,赋空不能奏效,比如我重置symbol为空,之前是qqq,因为有非空的判断所有并不能奏效导 ...

  5. javaweb实现注册页面(数据库连接以及ajax验证)

    先放效果图 可实现js实时验证        可实现ajax实时验证注册信息是否存在   页面实现要求 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求 ...

  6. Dell 工作站M4800 安装macOs Mojave

    前言 最近,入手了一台二手Dell工作站M4800,价格为3600,配置如下 个人感觉还是很好用的,配置够用,关键是用料真的足!虽然是16年的机器,但是做工吊打一众游戏本. 然后,重点来了,我安装上了 ...

  7. 输出redis cluster集群所有节点指定的参数的配置

    需要:实现类似redis-trib.rb call 命令的功能,输出redis cluster集群所有节点指定的参数的配置 redis-trib.rb的输出 [redis@lxd-vm3 ~]$ re ...

  8. git Auto packing the repository in background for optimum performance

    遇到问题: git本地仓库,如果长时间不进行清理,几个月以后的某一天,可能拉取代码的时候突然提示你 git Auto packing the repository in background for ...

  9. 1级搭建类105-Oracle 19c 单实例 FS(19.3+RHEL 8)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  10. asp.net core 自定义基于 HttpContext 的 Serilog Enricher

    asp.net core 自定义基于 HttpContext 的 Serilog Enricher Intro 通过 HttpContext 我们可以拿到很多有用的信息,比如 Path/QuerySt ...