计算机视觉(角点检测)- 1 - Harris角点检测

article/2025/10/8 4:25:51

计算机视觉(角点检测)- 1 - Harris角点检测

  • 学习前言
  • 一、Harris角点检测
  • 二、OpenCV来实现Harris角点检测
    •   1、Harris角点检测API
      •    1) ```dst = cv.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])```
      •   2) ```dst = cv.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) ```
    •   2、代码举例

学习前言

  今天更新一下计算机视觉的东西吧,哈哈哈o( ̄︶ ̄)o
  关于角点检测呢,就是检测图像中角点的算法,常见的有四种常见的算法:Moravec角点检测算法、 Harris角点检测算法、Shi-Tomasi 算法、FAST角点检测算法.,不过常用的就两种吧——Harris角点检测算法、FAST角点检测算法(反正我基本上就只用到这两种,先着重介绍前面两种,后面再花时间介绍吧)(~ ̄▽ ̄)~在这里插入图片描述

一、Harris角点检测

  1、什么是角点?

  怎么判断角点?我们先看一幅图:在这里插入图片描述
  简单粗暴的讲,红色框框住的部分就是角点黑色框框住的部分是边界蓝色框框住的…就是普通的部分。
  再生动形象点估计就是用下面这张图片来表示了。
在这里插入图片描述

  • A和B处于平坦区域,没有什么确切的特征,它们所在的位置有很多种可能;
  • C和D要相对简单一些,它们是建筑物的边缘,我们可以找到一个大致的位置,但是要定位到精确的位置仍然很难。所以边缘是更好的特征,但还不够好。
  • E和F是建筑的一些角落,可以很容易地发现它们的位置,因为对于建筑物角落这个图像片段,我们不管朝哪个方向移动,这个片段看起来都会不一样。


  2、Harris角点检测的基本原理&基本思想

  角点检测算法的基本思想:使用一个固定的窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大的灰度变化,那么我们可以认为该窗口中存在角点。

  用下面这两条线过一个夹角,表示平面、边界、角点三种位置:在这里插入图片描述

  3、Harris角点检测的数学表达

  下面我们来分析一下数学上的定义,我们先设 I ( x , y ) I(x,y) I(x,y)代表图像中 ( x , y ) (x,y) (x,y)点的像素灰度值, w ( x , y ) w(x,y) w(x,y)代表以 ( x , y ) (x,y) (x,y)为中心的Harris角点检测的滑动窗口,即加权函数。
  那么 当窗口发生 ( △ x , △ y ) (△x,△y) (x,y)移动时,那么滑动前与滑动后对应的窗口中的像素点灰度变化数学方法描述如下:
在这里插入图片描述
  对于 w ( x , y ) w(x,y) w(x,y)窗口函数,最简单情形就是窗口内的所有像素所对应的 w w w权重系数均为1。但有时候,我们会将 w ( x , y ) w(x,y) w(x,y)函数设定为以窗口中心为原点的二元正态分布,如高斯分布。
在这里插入图片描述

  如果窗口中心点是角点时,移动前与移动后,该点的灰度变化应该最为剧烈,表示窗口移动时,该点在灰度变化贡献较大;而离窗口中心(角点)较远的点,这些点的灰度变化几近平缓,以示该点对灰度变化贡献较小,那么我们自然想到使用二元高斯函数来表示窗口函数。

  4、获取点数据后,计算 I x , I y I_x,I_y IxIy

  数学表达我们搞定了,接下来是怎么解这个表达式了。其中最主要的是 I ( u , v ) − I ( u + △ x , v + △ y ) I(u,v)-I(u+△x,v+△y) I(u,v)I(u+x,v+y)这一部分。高等数学里面我们都学过泰勒公式吧。


在这里插入图片描述
在这里插入图片描述

  这里我们就基于泰勒公式对进行处理(二元的):
在这里插入图片描述

这里不会的可能需要去补习一下高等数学哦~

  然后将近似结果带入,然后再恒等变换处理一下:
在这里插入图片描述

  5、比较特征值

  再分析最后的出来的这个公式,我们再把它简化一下:

在这里插入图片描述
  这玩意是不是就是一个简单的椭圆公式了ー( ̄~ ̄)ξ,我们先假设 c = 1 c=1 c=1,方便画图。


在这里插入图片描述

  接下来,我们就只要分析这个椭圆了。如果在图像在窗口滑动过程中灰度变化较大,那是不是 c ( x , y ; △ x , △ y ) c(x,y;△x,△y) c(x,y;x,y)的值就越大,那么这个椭圆也会变大?椭圆变大那么对应的 λ 1 和 λ 2 λ_1和λ_2 λ1λ2也会变大,然后就是比较 λ 1 , λ 2 λ_1,λ_2 λ1,λ2的变化程度。如果只有其中一个变化程度较大说明是边界。
在这里插入图片描述
  如何解出这两个特征值,并有效地进行量化评价呢?此时就引入角点响应值R 。
  Harris角点检测算法就是对角点响应函数R进行阈值处理: R > t h r e s h o l d R>threshold R>threshold,即捏取R的局部极大值。
  这样选出的角点可能会在某一区域特别多,并且角点窗口w(x,y)相互重合,为了能够更好地通过角点检测追踪目标,需要进行非极大值抑制(NMS)操作。


在这里插入图片描述
  注意:Harris 检测器具有旋转不变性,但不具有尺度不变性,也就是说尺度变化可能会导致角点变为边缘,如下图所示:
在这里插入图片描述

  想要尺度不变特性的话,可以关注SIFT特征



二、OpenCV来实现Harris角点检测

  1、Harris角点检测API

   1) dst = cv.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])

    API功能:该功能在图像上运行Harris角检测器。

    参数:
      src: 输入单通道8位或浮点图像。
      blockSize:它是考虑进行角点检测的邻域的大小
      ksize:滑动核的大小。
      k:角点响应值R计算公式中的α。
    返回:
      dst: 用于存储哈里斯探测器响应的图像。它的类型为CV_32FC1,大小与src相同。

  2) dst = cv.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

    API功能:通过使用特定的结构元素来放大图像。该函数使用指定的结构化元素来扩展源图像,该结构化元素确定在其上获取最大值的像素邻域的形状:
在这里插入图片描述

    该功能支持就地模式。可以进行几次(迭代)扩张。在多通道图像的情况下,每个通道都是独立处理的。

    参数:
      src: 输入图像;通道数可以是任意的,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
      kernel:用于扩张的结构元素;如果elemenat = Mat(),则使用3 x 3的矩形结构元素。
      anchor: 锚在元素内的位置;默认值(-1,-1)表示锚点位于元素中心。
      iterations:进行扩张的次数。
    返回:
      dst: 输出与src大小和类型相同的图像。

  2、代码举例

import numpy as np
import cv2 as cv
filename = 'test_image/test_chessboard.jpg'
img = cv.imread(filename)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv.cornerHarris(gray,2,3,0.04)
#result is dilated for marking the corners, not important
dst = cv.dilate(dst,None)
# Threshold for an optimal value, it may vary depending on the image.
img[dst>0.01*dst.max()]=[0,0,255]
cv.imshow('dst',img)
if cv.waitKey(0) & 0xff == 27:cv.destroyAllWindows()

在这里插入图片描述


http://chatgpt.dhexx.cn/article/IZPnvGdr.shtml

相关文章

Visual Studio的sln工程设置VTK、ITK项目

Visual Studio的sln工程设置VTK、ITK项目 最近在学习使用VTK和ITK,使用Visual Studio新建Qt项目时发现项目不是使用过去使用的CMake组织,而是使用的Visual Studio默认的.sln文件,便学习了一下使用Visual Studio的sln工程设置VTK、ITK项目&am…

windows sln的qt 工程

看起来应该vs开发 qt项目不需要qtcreator? 画界面应该还是需要的。装一个vs的插件 2019的如果打开的工程跟你本地的qt不一致 在工程名字上右键change qt version弹出一个框框,里面有俩这里应该选第一个,这个是我本地安装的,vs2015 x86 版本windows sln 工程【这个新建一个q…

Visual studio 2015修改项目文件名及.sln文件名

Visual studio 2015修改项目文件名及.sln文件名: 问题描述 提示:在使用原有的项目代建一个新项目时,为了方便区分与原项目,故要修改该项目的项目名。 如图: 需要将QtGuiApplication1.vcxproj修改成CARFILM.vcxproj&…

C# 解析 sln 文件

我的项目,编码工具 需要检测打开一个工程,获取所有项目。 但是发现原来的方法,如果存在文件夹,把项目放在文件夹中,那么是无法获得项目,于是我就找了一个方法去获得sln文件的所有项目。 原先使用的方法dte…

Visual studio无法打开C#\.sln文件,不兼容

23/7/19文章更新:后来我总结了我这个问题出现的原因,是因为我的VS是2015版本,本来安装在笔记本电脑上,为了转到台式机,直接U盘复制过来的,然后复制过来安装的时候提示某个东西安装失败,我就点击…

.sln图标异常修复

.sln图标显示异常 本人就喜欢新版本的东西,电脑上安装过vs2017,vs2019,想体验最新的vs2022是什么感觉,之后sln图标显示异常,不太顺眼 这是由于该文件VSFileHandler_64.dll异常带来的问题,下载我提供的文件&#xff0c…

Visual Studio打开无sln项目,修复无效sln文件

Visual Studio打开无sln项目,修复无效sln文件 打开项目文件地址(可在项目名右键-在文件资源管理器中打开文件夹) 打开-项目名.vcxproj文件 VC左上角点击全部保存,选择保存位置储存新的sln头文件 4.sln文件修复完成

VS2019 使用命令行编译工程sln

需要使用 devenv.com这个工具 具体的执行如下: test>"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\devenv.com" build\1.sln /Build执行结果如下: 在对应的路径下找到可执行文件运行

Visual studio 2019 创建.sln项目

文章目录 创建.sln项目在当前解决方案下,添加项目如何切换启动项目如何打开 .sln的解决方案的项目 创建.sln项目 文件–>新建 不要勾选最后一项。 点击 上面界面的右下角的 创建 ,进入下面的界面 解决方案和项目在电脑目录及在IDE上的展示 在当…

Unity sln 和 csproj 基础

根目录下 sln 和 csproj 区别 sln: solusion 简写,即解决方案 csproj:c sharp project 简写,即 C# 项目 解决方案sln是项目csproj的集合,项目是文件的集合。 一个 sln 中可以包含多个 csproj。 一个 csproj 可以包含多…

c语言编程题没有sln,使用CMake生成sln项目和VS工程遇到的问题

用vs运行cmake后的工程 1、单个文件示例: 1) 首先建立文件夹CMakeTest/Src 2) 在文件夹Src中建立两个文件main.c和CMakeLists.txt 3) main.c: #include int main() {printf("hello world."); getchar(); return 0; } 4) CMakeLists.txt PROJECT (HELLO) SET (SRC_L…

理解 Visual Studio 解决方案文件格式(.sln)

一般情况下我们并不需要关心 Visual Studio 解决方案文件格式(.sln),因为 Visual Studio 对解决方案文件的自动修复能力是非常强的。但是如果遇到自动解冲突错误或者编译不通过了,那么此文件还是需要手工修改的。 基本概念 Visua…

Win平台使用cmake工具生成sln工程示例

先安装一个版本的cmake,3.17.2; 这应该是比较新的版本;我看到有的示例是3.7以下版本; cmake加到系统path变量; 安装完成; 新建一个C#prj目录,下面放一个cs文件,新建一个myprj1目录; …

linux系统sln命令,dotnet sln

dotnet slndotnet sln 12/07/2020 本文内容 本文适用于: ✔️ .NET Core 2.x SDK 及更高版本This article applies to: ✔️ .NET Core 2.x SDK and later versions “属性”Name dotnet sln - 在 .NET 解决方案文件中列出或修改项目。dotnet sln - Lists or modifi…

【通用】vs2019项目sln、suo、vcxproj、vcxproj.filters、vcxproj.user文件名解析及相关节点属性解析

1.sln 文件 (Solution 文件) 解决方案是在 Visual Studio 中组织项目的结构。 该解决方案将项目的状态信息保留在两个文件中: .sln 文件 (基于文本的共享) .suo 文件 (用户特定的二进制解决方案选项) 这里先讲.sln 文件,.sln 文件包含环境用于查找和加载…

cosi-corr操作详细步骤

cosi-corr是一个可以加载到ENVI的软件包,由加利福尼亚理工学院的Franois Ayoub, Sbastien Leprince, and Lionel Keene开发,并且提供源代码,该软件受到了NSF的资助。软件的主要功能是可以满足各种影像的正射校正和影像配准。 针对下载下来的…

pearsonr(x,y)、corr()、corrcoef(u1) 相关系数计算

函数:pearsonr(x,y) 功能: 计算特征与目标变量之间的相关度 参数说明: 1)输入:x为特征,y为目标变量. 2)输出:r: 相关系数 [-1,1]之间,p-value: …

pandas.DataFrame.corr求解变量列相关系数与可视化展示

pandas.DataFrame.corr求解变量列相关系数与可视化展示 目录 pandas.DataFrame.corr求解变量列相关系数与可视化展示 1常见的三种相关系数2 pandas.DataFrame.corr用法3 结果可视化 1常见的三种相关系数 Pearson相关系数:度量两变量之间的线性相关性;对…

【20220623】【信号处理】深入理解Pearson相关系数和Matlab corr()、corrcoef()仿真

目录 一、定义 二、特性 三、适用条件 四、Matlab 仿真 1. 时间序列 2. 矩阵 一、定义 相关系数(correlation of coefficient)是统计学中的概念,是由统计学家卡尔皮尔逊设计的一个统计指标,也称作 Pearson 相关系数。相关系…

python计算两组数据的相关性_关于python:使用.corr获取两列之间的相关性

我有以下熊猫数据框Top15: 我创建了一个列来估计每个人的可引用文档数: 1 2Top15[PopEst] Top15[Energy Supply] / Top15[Energy Supply per Capita] Top15[Citable docs per Capita] Top15[Citable documents] / Top15[PopEst] 我想知道人均可引用…