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

    什么是版本控制? 这个之前有记录过相关的内容 版本管理就是管理更新的历史记录, 它给我们提供了一些在软件开发过程中必不可少的功能,例如: 记录一款软件添加或更改源代码的过程 回滚到特定阶段,恢复误删除 ...

  2. Lucene之分析器

    什么是分析器? 分析(Analysis)在Lucene中指的是将域(Field)文本转换为最基本的索引表示单元—项(Term)的过程. 分析器(Analyzer)对分析操作进行了封装,通过执行一系列操 ...

  3. 定时器_在.net core3.0 webapi中添加自定义定时器功能

    前言:想在.net framework环境使用自定义定时器的话,参考我的另一篇文章:https://www.cnblogs.com/lxhbky/p/10242839.html 想在.net core ...

  4. GCD相关

    板子: ? gcd(b, a % b) : a; } POJ1930 题意:给你一个无限循环小数,给到小数点后 9 位,要求这个数的分数形式. 解法: 要想解决这道题,首先应该了解如何将循环小数化为分 ...

  5. Java Web 笔记(1)

    JavaWeb 学习笔记,狂神说java,链接:https://www.bilibili.com/video/av68833391 Java Web 1.基本概念 1.1.前言 web开发: web, ...

  6. ConcurrentHashMap的size()方法(1.7和1.8)

    在1.7和1.8版本中,计算size()方法有写不同.先介绍1.7版本的实现. 1.7版本 在1.7版本中,有一个重要的类Segment,利用它来实现分段锁 static final class Se ...

  7. Java模拟客户端向服务器上传文件

    先来了解一下客户端与服务器Tcp通信的基本步骤: 服务器端先启动,然后启动客户端向服务器端发送数据. 服务器端收到客户端发送的数据,服务器端会响应应客户端,向客户端发送响应结果. 客户端读取服务器发送 ...

  8. docker常见操作总结

    一.原理 1.Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,它能直接访问物理设备,会给每一台虚拟机分配内存.CPU.网络.磁盘等资 ...

  9. Patter discovery VS clustering

    “pattern driven” (PD) is based on enumerating candidate patterns in a given solution space and picki ...

  10. java网页程序采用 spring 防止 csrf 攻击 转

    银行项目开发过程中,基本都会采用 spring 框架,所以完全可以不用自己开发 filter 去拦截 csrf 攻击的请求,而直接采用实现 spring 提供的 HandlerInterceptor ...