OpenCV教程(43) harris角的检测(1)

      计算机视觉中,我们经常要匹配两幅图像。匹配的的方式就是通过比较两幅图像中的公共特征,比如边,角,以及图像块(blob)等,来对两幅图像进行匹配。

     相对于边,角更适合描述图像特征,比如下面的图像中,大概有6种特征,我们用A、B、C、D、E、F来描述,其中A, B是平的区域,在图像中很难精确定位,C,D是边,比A,B好些,但是图像中的边也很多,定位到某个边也比较困难,相比来说E,F的角更适合描述当前的图像的特征,也更好检测,因为你不论怎么移动图像,这些角的特征都和图像其它部分不同。所以在计算机视觉中,我们通常用角来描述图像特征。

E,F中的角我们通常称作角点(corner points),他们具有以下特征:

–局部窗口沿各方向移动,均产生明显变化的点

–图像局部曲率突变的点

      在这篇教程中,我们来学习如何在图像中检测harrs特征角,harris特征角最早在paper A Combined Corner and Edge Detector中被Chris Harris & Mike Stephens提出。

     Harris角点检测的基本思想:从图像局部的小窗口观察图像特征,在各个方向移动都会导致图像灰度的明显变化,也就是说图像的梯度在各个方向有很大变化。

      下面我们看看harris角的计算方法:

    对于灰度图像 ,我们在窗口内,用x方向的偏移u和y方向的偏移v,扫过所有像素,得到一个图像灰度值的变化和。

  • 表示在 位置的窗口。
  • 位置的图像灰度值。
  • 是位置 的图像灰度值。

     由于我们要在一个窗口内查找harris特征角,所以我们必须找到变化最大的窗口,这个窗口内肯定存在特征角,所以我们定义下面的方程,并用泰勒级数展开式子:

  • 表示成矩阵乘法形式:

  • 假设

  • 则有:

  • 对每一个窗口计算得到一个分数R,根据R的大小来判定窗口内是否存在harris特征角。分数R根据下面公式计算得到:

    这里:(是矩阵M的2个特征值,k是一个指定值,这是一个经验参数,需要实验确定它的合适大小,通常它的值在0.05和0.5之间)。

    • det(M) =
    • trace(M) =
    • R取决于M的特征值,对于角点|R|很大,平坦的区域|R|很小,边缘的R为负值

    在opencv中,我们可以通过函数cv::cornerHarris 计算特征角,

C++: void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, intborderType=BORDER_DEFAULT )

Parameters:

  • src – 单通道8位或者浮点图像。
  • dst – 存储 Harris 角的结果图像,它的格式为:CV_32FC1,图像大小和源图像一致。
  • blockSize – 就是扫描时候窗口的大小。
  • ksizeSobel() 算子使用的值。
  • k – 上面介绍的计算R时候的k参数值。
  • borderType –像素插值方法。

下面的代码显示一副图像的harris角检测结果:

// 读入输入图像
cv::Mat image= cv::imread("../church01.jpg",0);
if (!image.data)
    return 0;

// 显示图像
cv::namedWindow("Original Image");
cv::imshow("Original Image",image);

// 检测 Harris Corners
cv::Mat cornerStrength;
cv::cornerHarris(image,cornerStrength,
    3,     // neighborhood size
    3,     // aperture size
    0.01); // Harris parameter

//二值化harris角的检测结果
cv::Mat harrisCorners;
double threshold= 0.0001;
cv::threshold(cornerStrength,harrisCorners,
    threshold,255,cv::THRESH_BINARY_INV);

// 显示结果
cv::namedWindow("Harris Corner Map");
cv::imshow("Harris Corner Map",harrisCorners);
下面是程序的运行结果:

程序代码:参考工程文件FirstOpenCV48

代码下载:http://yunpan.cn/Q4a6K68ASC5Xy

时间: 2024-09-20 06:09:28

OpenCV教程(43) harris角的检测(1)的相关文章

OpenCV教程(45) harris角的检测(3)

      在前面一篇教程中,我们通过取局部最大值的方法来处理检测结果,但是从图像中可以看到harris角的分布并不均匀,在纹理颜色比较深的地方检测的harris角结果更密集一些.本章中,我们使用一个简单的策略算法,首先在检测的harris角图像中,找到一个值最大的角,后面的最大值角检测至少要和前面的角有一个距离,这样循环查找角,直到得到指定数目的角位置.      在OpenCV中,我们可以通过下面的代码得到结果: // Compute good features to track std::

opencv笔记6:角点检测

time:2015年10月09日 星期五 23时11分58秒 # opencv笔记6:角点检测 update:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇学习笔记是各种模板操作,是图像增强技术. 那么我节写来应该继续找下有没有别的图像增强技术. 但是,我对增强还不是特别理解.图像增强:划定ROI区域,然后想方设法将感兴趣的特征有选择的突出.注意,这可是不去考虑图像质量下降的原因的.图像恢复:针对图像降质的原因,设法去补偿降质因素,从而使改善后的图像尽

OpenCV教程(47) sift特征和surf特征

     在前面三篇教程中的几种角检测方法,比如harris角检测,都是旋转无关的,即使我们转动图像,依然能检测出角的位置,但是图像缩放后,harris角检测可能会失效,比如下面的图像,图像放大之前可以检测出为harris角,但是图像放大后,则变成了边,不能检测出角了.所以,harris角是缩放相关的.      在paper Distinctive Image Features from Scale-Invariant Keypoints中,D.Lowe提出了SIFT算法,该算法是缩 放无关的

Harris角点学习

    人们普遍认为角点是二维图像亮度变化剧烈的点或图像边缘曲线上曲率极大值的点.这些点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能.其在三维场景重建.运动估计.目标跟踪.目标识别.图像配准与匹配等计算机视觉领域起着非常重要的作用.    角点的检测主要有两类基于图像边缘的方法和基于图像灰度的方法.前者很大程度上依赖于图像的分割和边缘提取,一旦待检测目标发生局部变化,很可能导致操作失败,因此该类方

车辆分割中角点分割-opencv车辆分割中角点选择并连线分割方法和代码

问题描述 opencv车辆分割中角点选择并连线分割方法和代码 就是已经得到了重合车辆的很多角点,现在需要选择真正的角点来连线进行分割,不知道怎么写代码. 解决方案 你这个车辆有重合,应该怎么检测效果好一些,我就不太清楚了, 不知道能不能参考矩形检测的方法:矩形检测http://blog.csdn.net/wangyaninglm/article/details/43959947 解决方案二: 试用动态分析,使用重合前各车的图片,去识别重合后车辆.

Harris角点标注法

在图像拼接过程中,图像的匹配是重要的一步,其中最常用的算法是Harris角点标注算法. 在Harris之前常用的是Moravec 角点提取算法,Moravec角点检测是一种基于灰度值的检测算法,主要是通过滑动二值矩形窗口寻找灰度变化的局部最大值.主要先通过事先设定一个经验阈值,通过对窗口(如取3*3的窗口)进行相邻八个方向(上,下,左,右,左上,左下,右上,右下)进行滑动,计算原窗口和滑动后窗口的灰度变化值的平方和,取这8个方向的差平方和的最小值与事先设定的阈值进行比较,如果大与事先的阈值就将该

PHP开发框架Yii Framework教程(43) Zii组件-Droppable示例

上篇介绍如果使用UI组件支持拖放,CJuiDroppable表示某个区域可以接受拖拉过来的UI组件,它封装了 JUI Droppable插件 . 我们修改上例,添加一个Droppable区域,当有UI组件拖放到该区域时,显示"Dropped". <?php $this->beginWidget('zii.widgets.jui.CJuiDroppable', array( 'options'=>array( 'drop'=>'js:function(event,

在opencv中利用findContours进行轮廓检测,程序运行结束时为什么会报中断错误,求解?

问题描述 在opencv中利用findContours进行轮廓检测,程序运行结束时为什么会报中断错误,求解? 代码如下: #include #include #include #include #include #include using namespace cv; using namespace std; //一.将源图片转成单通道的灰阶图片 Mat changeSourceImg(Mat img){ Mat great(img.size(), CV_8U); cvtColor(img, g

harris角点相应值的计算方法

问题描述 harris角点相应值的计算方法 请问,角点相应值是个什么量?用来说明什么指标? harris角点相应值应该怎么算?