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

简介: 计算机视觉中,我们经常要匹配两幅图像。匹配的的方式就是通过比较两幅图像中的公共特征,比如边,角,以及图像块(blob)等,来对两幅图像进行匹配。      相对于边,角更适合描述图像特征,比如下面的图像中,大概有6种特征,我们用A、B、C、D、E、F来描述,其中A, B是平的区域,在图像中很难精确定位,C,D是边,比A,B好些,但是图像中的边也很多,定位到某个边也比较困难,相比来说E,F的角更适合描述当前的图像的特征,也更好检测,因为你不论怎么移动图像,这些角的特征都和图像其它部分不同。

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

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

image

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

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

–图像局部曲率突变的点

image

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

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

image

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

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

clipboard

  • 95b5f54165b3[1] 表示在 6fe1247d189a位置的窗口。
  • 261f516b67786fe1247d189a[1]位置的图像灰度值。
  • 3d0aea79e9df 是位置 3c094d9ef3ac的图像灰度值。

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

  • 70eced22ff79

  • 08e147df728c

  • 表示成矩阵乘法形式:

    clipboard[1]

  • 假设

    clipboard[2]

  • 则有:

    4848cbfec496

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

    5c5274d5519a

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

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

    imageimage

    在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);

下面是程序的运行结果:

imageimage

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

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

相关文章
|
1天前
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
14 1
|
3月前
|
机器学习/深度学习 传感器 算法
OpenCV4工业缺陷检测的六种方法
OpenCV4工业缺陷检测的六种方法
|
4月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
74 0
|
4月前
|
Windows 计算机视觉 Linux
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
该文档介绍了Qt的跨平台特性,并推荐在Windows和Linux开发中使用QtCreator。在Windows下添加动态库,可以通过Visual Studio配置.lib文件和.dll文件,或在QtCreator中使用"添加库"功能。在QtCreator中,选择库文件、包含路径,并配置Details,然后更新.pro文件,清除、qmake及构建项目。运行时确保.dll与.exe在同一目录下。
110 0
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
|
5月前
|
Linux 开发工具 计算机视觉
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
Qt是跨平台的开发工具,推荐使用QtCreator进行Windows和Linux开发。在Windows下,使用Visual Studio创建动态库时,需要配置.lib文件并确保运行时.dll与.exe在同一目录。在QtCreator中添加DLL动态库,可以通过右键项目,选择添加库,然后在Details界面配置库文件、包含路径和平台,最后更新PRO文件并进行清除、qmake和构建步骤。运行时同样需确保.dll文件与可执行文件在同一目录。
159 5
|
5月前
|
数据采集 Java 数据挖掘
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
|
4月前
|
监控 安全 计算机视觉
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
|
4月前
|
机器学习/深度学习 算法 数据可视化
基于OpenCV的人脸检测软件(含Python源码+UI界面+图文详解)
基于OpenCV的人脸检测软件(含Python源码+UI界面+图文详解)
|
1月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
37 4
|
20天前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制