这样想象一下,直线上的一个点在垂直于直线的方向上有最强的梯度。沿着直线的方向梯度较低,意思是直线上的像素点与它周围的像素点看起来相似。我们进行的角点检测是梯度强度明显高于其他像素的点,可能就是目标处的拐点。它的这个特性可以被应用到同一场景的多视角检测及运动中估计。
$${\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. mysql必知必会--使用数据处理函数

    函数 与其他大多数计算机语言一样,SQL支持利用函数来处理数据.函数 一般是在数据上执行的,它给数据的转换和处理提供了方便. 在前一章中用来去掉串尾空格的 RTrim() 就是一个函数的例子 函数没有 ...

  2. fastJson&edis

    fastJson&redis 1. fastJson 1.1 依赖 <dependency> <groupId>com.alibaba</groupId> ...

  3. 从零开始一个个人博客 by asp.net core and angular(二)

    上一篇帖子讲了用了哪些技术,这个帖子就先介绍介绍api项目吧,项目就是一个普通的webapi项目,账户系统用的identity ,什么是identity呢? 其实就是官方封装好的一系列的可以用来操作数 ...

  4. python練習

    #登录,账户密码储存在文件中,限制登录 count = 0 for i in range(3): b = input("账号:") c = b + "," + ...

  5. Java Web 笔记(4)

    11.Filter (重点) Filter:过滤器 ,用来过滤网站的数据: 处理中文乱码 登录验证-. Filter开发步骤: 导包 编写过滤器 导包不要错 实现Filter接口,重写对应的方法即可 ...

  6. P1553 数字反转(升级版)(copy(),reverse(),find(),substr(),erase())

    题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反 ...

  7. 报表生成(POI,jquery.table2excel.js,Echarts)

    最近公司要弄个报表相关的功能,话不多说,先上图 前一种是POI 生成的,后一种是Echarts生成的.报表我想大家都不陌生,基本上在公司业务中都会使用到.先说说POI,jquery.table2exc ...

  8. 理解Android线程创建流程

    copy from : http://gityuan.com/2016/09/24/android-thread/ 基于Android 6.0源码剖析,分析Android线程的创建过程 /androi ...

  9. C#中System.ServiceProgress报错

    场景 在C#中检索本地计算机所有服务时,使用 System.ServiceProcess.ServiceController[] services = System.ServiceProcess.Se ...

  10. pyqt5-字体,颜色选择对话框设置label标签字体颜色样式

    1.采用实例方法,先创建2个dialog对象,采用该对象的信号触发相应的操作 import sys from PyQt5.Qt import * class MyWidget(QWidget): de ...