【OpenCV 例程 300篇】240. OpenCV 中的 Shi-Tomas 角点检测

『youcans 的 OpenCV 例程300篇 - 总目录』


【youcans 的 OpenCV 例程 300篇】240. OpenCV 中的 Shi-Tomas 角点检测


角是直线方向的快速变化。角点通常被定义为两条边的交点,或者说角点的邻域应该具有两个不同区域的不同方向的边界。

角是高度有效的特征。角点检测(Corner Detection)广泛应用于运动检测、图像匹配、视频跟踪、三维重建和目标识别。

Shi-Tomas 算法是对 Harris角点检测算法的改进,一般会比Harris算法得到更好的角点。


6.1 哈里斯-斯蒂芬斯角检测器(Harris)

Harris角点检测算法的原理是,通过检测窗口在图像上移动,计算移动前后窗口中像素的灰度变化。角点是两条边的交点,其特征是检测窗口沿任意方向移动都会导致灰度的显著变化。

对于点 (x,y)(x,y)(x,y),令 w(x,y)w(x,y)w(x,y) 为矩形检测窗口或高斯检测窗口,I(x,y)I(x,y)I(x,y) 是检测窗口在点 (x,y)(x,y)(x,y) 的灰度值,I(x+u,y+v)I(x+u,y+v)I(x+u,y+v) 是检测窗口滑动 (u,v)(u,v)(u,v) 距离之后的灰度值。

计算窗口 w(x,y)w(x,y)w(x,y) 滑动 (u,v)(u,v)(u,v) 距离之后的灰度变化:
E(u,v)=∑x,yw(x,y)[I(x+u,y+v)−I(x,y)]2E(u,v) = \sum _{x,y} w(x,y) [I(x+u, y+v) - I(x,y)]^2 E(u,v)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2
对于很小的位移 (u,v)(u,v)(u,v),使用一阶泰勒展开进行简化:
E(u,v)=∑x,yw(x,y)[I(x,y)+uIx+vIy+O(u2,v2)−I(x,y)]2≈∑x,yw(x,y)[u2Ix2+2uvIxIy+v2Iy2]≈[u,v]∑x,yw(x,y)[IxIxIxIyIxIyIyIy][uv]\begin{aligned}E(u,v) = &\sum_{x,y} w(x,y) [I(x,y) + uI_x + vI_y +O(u^2,v^2)- I(x,y)]^2 \\\approx & \sum_{x,y} w(x,y) [u^2 I_x^2 + 2uv I_x I_y + v^2 I_y^2] \\\approx & [u,v] \sum_{x,y}w(x,y)\begin{bmatrix}I_x I_x & I_x I_y \\I_x I_y & I_y I_y\end{bmatrix}\begin{bmatrix}u\\v\end{bmatrix}\end{aligned} E(u,v)=x,yw(x,y)[I(x,y)+uIx+vIy+O(u2,v2)I(x,y)]2x,yw(x,y)[u2Ix2+2uvIxIy+v2Iy2][u,v]x,yw(x,y)[IxIxIxIyIxIyIyIy][uv]
Ix,IyI_x,I_yIx,Iy 分别是在 x, y 方向的导数,可以由 Sobel 梯度算子求出。

记 M 为梯度的协方差矩阵:
M=∑x,yw(x,y)[IxIxIxIyIxIyIyIy]M =\sum_{x,y} w(x,y)\begin{bmatrix}I_x I_x & I_x I_y \\I_x I_y & I_y I_y\end{bmatrix} M=x,yw(x,y)[IxIxIxIyIxIyIyIy]

在几何模型中通过判断两个特征值的大小,来判定像素的属性。矩阵 M 是Ix,IyI_x,I_yIxIy 的二次函数,可以表示为椭圆形状,椭圆的长短半轴由矩阵 M 的特征值 λ1,λ2\lambda _1,\lambda _2λ1λ2 决定,方向由特征向量决定。

定义角点响应函数 R:
R=det(M)−k[trace(M)]2det(M)=λ1∗λ2trace(M)=λ1+λ2\begin{aligned}R =& det(M) - k [trace(M)]^2 \\&det(M) = \lambda _1 * \lambda _2 \\&trace(M) = \lambda _1 + \lambda _2\end{aligned} R=det(M)k[trace(M)]2det(M)=λ1λ2trace(M)=λ1+λ2
k 是调节参数(通常取 0.04~0.06)。

角点响应函数 R 只与矩阵 M 的特征值 λ1,λ2\lambda _1,\lambda _2λ1λ2 有关,可以用来判断区域是拐角、边缘还是平坦:

  • λ1,λ2\lambda _1,\lambda _2λ1λ2 较小时, ∣R∣|R|R 较小,即各个方向上灰度基本不变,表明检测器处于平坦区域;
  • λ1>>λ2\lambda _1 >> \lambda _2λ1>>λ2 或 $ \lambda _2 >> \lambda _1$ 时, R<0R <0R<0 ,即灰度在某个方向变化,但在其正交方向不变化,表明检测器处于边缘区域;
  • λ1,λ2\lambda _1,\lambda _2λ1λ2 较大且 λ1∼λ2\lambda _1 \sim \lambda _2λ1λ2时, ∣R∣|R|R 很大,即灰度在所有方向都发生重大变化,表明检测器包含角点(或孤立点。

6.3 OpenCV 中的 Shi-Tomas 角检测器

Shi-Tomas 算法是对 Harris角点检测算法的改进,一般会比Harris算法得到更好的角点。

Harris 算法中的角点响应函数为:
R=λ1λ2−k(λ1+λ2)2R =\lambda _1 \lambda _2 - k (\lambda _1 + \lambda _2)^2 R=λ1λ2k(λ1+λ2)2
Shi-Tomas 算法将角点响应函数修改为:
R=min(λ1,λ2)R = min (\lambda _1 , \lambda _2 ) R=min(λ1,λ2)

只有当 M 矩阵的特征值 $ \lambda _1,\lambda _2$ 都大于最小值 λmin\lambda {min}λmin 时,才将其视为拐角。

OpenCV 中提供了 Shi-Tomas 角点检测函数 cv.goodFeaturesToTrack() 。


函数说明:

cv.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners=None, mask=Mat(), blockSize=3, useHarrisDetector=false, k=0.04]) → corners

函数 cv.goodFeaturesToTrack 通过 Shi-Tomasi 方法找出图像中最突出的 N 个角点。

参数说明:

  • src:输入图像,单通道的 8 位图像或 32 位浮点数图像
  • corners:输出向量,检测到的角点
  • maxCorners:获取的角点数量的上限阈值
  • qualityLevel:可接受的角点质量最低阈值,取值范围 0~1
  • minDistance:可接受的角点之间最小的欧式距离
  • mask:掩模区域,仅在掩模区域检测角点
  • blockSize:邻域尺寸,默认值为 3
  • k:Harris 检测器调节参数,默认值 0.04
  • useHarrisDetector :默认值 False,使用 cornerMinEigenVal 的参数,True 表示使用 Harris 检测器

注意事项:

  1. 函数使用 cornerMinEigenVal 或 cornerHarris 计算出每个像素的角点响应结果。
  2. 以 qualityLevel 与最大角点值相乘作为最小特征值(cornerMinEigenVal)或响应函数值(cornerHarris),小于该值的角点都被拒绝。例如,最大响应值为 1500,系数为 0.1,则响应值小于 150 的角点都被放弃。
  3. 小于 maxDistance 距离的角点被拒绝,以避免得到相邻特征点。

例程 14.21:特征检测之 Shi-tomas 角检测器

    # 14.21 特征检测之 Shi-tomas 角检测器img = cv2.imread("../images/sign04.png", flags=1)  # (300, 300, 3)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Harris 检测角点dst = cv2.cornerHarris(gray, 2, 3, k=0.04)# Harris[dst > 0.01*dst.max()] = [0, 0, 255]  # 筛选角点,红色标记corners = np.column_stack(np.where(dst>0.1*dst.max()))  # 筛选并返回角点坐标 (y,x)corners = corners.astype(np.int)  # 检测到的角点的点集 (y,x), (92, 2)imgHarris = np.copy(img)for point in corners:  # 注意坐标次序cv2.circle(imgHarris, (point[1], point, 4, (0,0,255), 2)  # # 在点 (x,y) 处画圆# Shi-tomas 检测角点corners = cv2.goodFeaturesToTrack(gray, 30, 0.3, 5)  # (30, 1, 2)corners = np.squeeze(corners).astype(np.int)  # (30, 1, 2)->(30,2)  角点坐标 (x,y)imgShiTomas = np.copy(img)for point in corners:cv2.circle(imgShiTomas, point, 4, (0,0,255), 2)  # # 在点 (x,y) 处画圆plt.figure(figsize=(9, 6))plt.subplot(131), plt.axis('off'), plt.title("Origin")plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.subplot(132), plt.axis('off'), plt.title("Harris corners")plt.imshow(cv2.cvtColor(imgHarris, cv2.COLOR_BGR2RGB))plt.subplot(133), plt.axis('off'), plt.title("Shi-tomas corners")plt.imshow(cv2.cvtColor(imgShiTomas, cv2.COLOR_BGR2RGB))plt.tight_layout()plt.show()

在这里插入图片描述


【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125828053)
Copyright 2022 youcans, XUPT
Crated:2022-7-15

238. OpenCV 中的 Harris 角点检测
239. Harris 角点检测之精确定位(cornerSubPix)
240. OpenCV 中的 Shi-Tomas 角点检测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多元统计分析1

第一章 多元正态分布 文章目录 1.1 多元分布的基本概念 1.1.1 随机向量 1.1.2 分布函数与密度函数 联合分布函数&#xff1a; 联合密度函数&#xff1a; 条件密度函数&#xff1a; 分量的独立性&#xff1a; 1.1.3 随机向量的数字特征 1.随机向量的均值 2、随机…

Java并发容器和框架

ConcurrentHashMap 我们为什么要使用 ConcurrentHashMap呢&#xff1f; 原因有三&#xff1a; 并发编程中HashMap会导致死循环&#xff1b;HashTable效率又非常低&#xff1b;ConcurrentHashMap的锁分段技术可有效提升并发访问率。在并发编程使用HashMap会导致死循环。 在多线…

【OpenCV 例程 300篇】241. 尺度不变特征变换(SIFT)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】241. 尺度不变特征变换&#xff08;SIFT&#xff09; 6.4.1 简介 尺度不变特征转换算法&#xff08;Scale-invariant feature transform&#xff0c;SIFT&#xff09;是图像处理中经典的局部特征描…

整数线性规划实现(matlab分枝界定法)

文章目录 一、本次问题 1.利用第一天所学知识求解&#xff1a; 2.本题理解&#xff1a; &#xff08;1&#xff09;分支界定法 背景&#xff1a; 基本理论&#xff08;解题步骤&#xff09;&#xff1a; 求解实现1&#xff1a; 1.第一步 2.第二步 3.第三步 4.第四步…

linux opencv gtk 没窗口,OpenCV GTK+2.x error

可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效&#xff0c;请关闭广告屏蔽插件后再试):问题:I had installed OpenCV following these steps ().After trying to compile one examples,i got this error :OpenCV Error: Unspecified error (The function …

硬盘分区

我们买回一台全新的笔记本的时候&#xff0c;我们会发现里面只有一个硬盘&#xff0c;这个时候为了满足我们的需求我们往往要对硬盘进行分区&#xff0c;那麽如何正确的对硬盘进行分区的呢&#xff1f; 下面教大家如何正确的对电脑硬盘进行分区操作。 操作方法 1、在桌面上找…

python入门:Anaconda和Jupyter notebook的安装与使用

文章目录 一、安装和使用Anaconda 1、anaconda是什么&#xff1f; 2、为什么需要安装anaconda&#xff1f; 3、如何安装anaconda&#xff1f; 通过官网下载页面 开源软件下载 安装步骤&#xff1a; 4、jupyter汉化 5、如何管理包&#xff1f; 1.列出已安装的包 2.安装…

非线性规划(1)

目录 一、非线性规划的定义 二、非线性规划的模型 三、非线性规划函数 四、线性不等式约束 五、线性不等式和等式约束 六、带有非线性约束的求最值 七、非线性约束 总结&#xff1a; 一、非线性规划的定义 前面我们学了线性规划&#xff0c;整数规划&#xff0c;我们可…

响应式布局Demo

顾名思义&#xff0c;响应式布局就是为适应不同终端而形成的一种技术。我总结了一个简单的例子帮助大家了解和学习响应式布局。 实现响应式布局的几种方式&#xff1a;媒体查询、JS、流体布局、弹性布局… 常用的meta标签 <meta content"widthdevice-width,initial-…

整数线性规划实现(lingo,python分枝界定法)

本文章为上篇建模学习打卡第二天的续 文章目录 一、本次问题 二、本题理解 三、问题求解 1.lingo实现 &#xff08;1&#xff09;先抛除整数约束条件对问题求解 &#xff08;2&#xff09;加入整数约束条件求解 2.python实现求解 &#xff08;1&#xff09;先抛除整数约…

Atmel跑Linux的arm芯片,Linux已被移植到Atmel的ATmega微控制器

Ubuntu Linux发行版已经被移植到最便宜、最便携的平台中&#xff1a;一个Atmel的ATmega微控制器。拥有一个20MHz的8位AVR处理器&#xff0c;128KB的闪存和整块16KB的SRAM&#xff0c;ATmega1284P并不是建立微型计算机最合乎逻辑的选择。它是在Arduino原型平台中找到的同样基础的…

Android Studio 详细安装教程

在我们的日常 Android 开发中&#xff0c;一个好的开发工具是必不可少的------Android Studio&#xff0c;是一个最重要的开发工具。 下面我将详细介绍Android Studio的下载安装。 一、安装环境及下载资源 1.1 安装环境 电脑系统 : Windows 10 JDK 版本 : 1.8 Android Stud…

零基础爬虫requests初阶教程,手把手教你爬数据

目录 一、环境与工具 二、学爬虫必备知识 三、简单体验 requests 四、get 请求 3.1 基础讲解一 3.3 基础讲解二 3.2 基础讲解三 3.4 获取cookie 3.5 获取请求头 3.6 添加请求头 3.5 知乎爬取反扒技术 3.6 抓取二进制数据 3.7 美女私房照爬取&#xff08; 准备发车…

vsftpd的主配置文件是什么linux,vsftpd.conf配置文件详解

vsftpd.conf配置文件详解# 是否允许匿名用户登录。默认值为YES。anonymousYES|NO# 是否允许匿名用户上传文件(如果设置为YES&#xff0c;则write_enable也必须设置为YES)。默认值为NO。anon_upload_enableYES|NO# 是否允许匿名用户创建目录(如果设置为YES&#xff0c;则write_e…

【youcans 的图像处理学习课】11. 形态学图像处理(上)

专栏地址&#xff1a;『youcans 的图像处理学习课』 文章目录&#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的图像处理学习课】11. 形态学图像处理&#xff08;上&#xff09; 【youcans 的图像处理学习课】11. 形态学图像处理&#xff08;中&#xff09; 【y…

Android Sdk 安装配置

在我们安装了Android Studio之后&#xff0c;我们发现不能使用&#xff0c;因为缺少一个Sdk的配置&#xff0c;下面就给大家详细介绍一下Sdk的配置。 打开我们的Android Studio。 选择Do not import settinge&#xff0c;然后点击OK。 点击 Cancel 退出即可&#xff0c;后面…

爬虫requests高阶篇详细教程

文章目录 一、前言 二、SSL验证 三、代理设置 四、超时设置 ​ 五、身份认证 1&#xff09;基本身份认证 2&#xff09;摘要式身份认证 六、总结 一、前言 本篇文高阶篇&#xff0c;上一篇为基础篇&#xff0c;希望你一定要学完基础再来看高阶篇内容 基础篇文章可以看大…

Android Studio 创建第一个项目应用

选择打开"Start a new Android Studio project"&#xff0c;新建一个Android项目。 选择一个空白的Activity&#xff0c;然后点击Next。 修改相应Android项目的名称、包名、项目位置等&#xff0c;以符合项目要求&#xff0c;点击Finish。 第一次创建项目可能会这样…

主成分分析(PCA)及其可视化——matlab

本文所用为matlab2016a matlab安装&#xff1a;待更新 matlab基础知识&#xff1a;待更新 如果本文内容已学会&#xff0c;可以看看python的哦 主成分分析&#xff08;PCA&#xff09;及其可视化——python_菜菜笨小孩的博客-CSDN博客 文章目录 一、主成分分析的原理 二…

Android studio真机调试

在我们进行Android开发的时候&#xff0c;调试这个环节是必不可少的也是至关重要的&#xff0c;使用真机调试可以更加准确清晰的显示效果。 真机调试Android应用 1.用数据线将手机连接到电脑&#xff0c;打开手机的开发者选项。 由于各个手机厂商的打开方式都不同&#xff0…