17.OpenCV中的GFTTDetector类

文章目录

    • GFTTDetector功能
    • OpenCV中GFTTDetector类
      • reference


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


这是使用imgproc.hpp中的goodFeaturesToTrack函数封装的类,其使用和goodFeaturesToTrack函数基本相似。

GFTTDetector功能

GFTTDetector类用来提取对线的角点特征,角点检测(Corner Detection)也称为特征点检测,是图像处理和计算机视觉中用来获取图像局部特征点的一类方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模以及目标识别等领域中。

最常用的角点检测算法有梯度直方图HOG,Haar特征和Haris角点检测,上面这三种在之前都介绍过,

1.Haar特征
2.梯度直方图HOG
3.HS角点检测

这些方法都是使用了图像中的局部信息提取了局部特征。

如同在HS角点检测中介绍的,图像灰度的变化可以分成3种情况:

  • 在两个方向上灰度变化剧烈,角点
  • 在单个方向上灰度变化剧烈,边
  • 在两个方向上灰度变化都不大,平坦区域

如下图:

对于给定图像 I ( x , y ) I(x, y) I(x,y)上一个宽高为 w × h w \times h w×hpatch窗口,计算该窗口平移一段微小距离时各个像素值差的平方和为:

E ( μ , v ) = ∑ x w ∑ y h ω ( x , y ) [ I ( x + μ , y + v ) − I ( x , y ) ] 2 E(\mu,v)=\sum_x^w\sum_y^h\omega(x,y)[I(x+\mu, y+v)-I(x,y)]^2 E(μ,v)=xwyhω(x,y)[I(x+μ,y+v)I(x,y)]2

omega(x,y)是窗口函数,可以使用窗口中的像素均值或者使用高斯函数。

根据泰勒公式展开上式:

I ( x + μ , y + v ) ≈ I ( x , y ) + I x ( x , y ) μ + I y ( x , y ) v I(x+\mu, y+v)\approx I(x,y)+I_x(x,y)\mu+I_y(x,y)v I(x+μ,y+v)I(x,y)+Ix(x,y)μ+Iy(x,y)v

故,

E ( μ , v ) ≈ [ u , v ] M ( x , y ) [ μ v ] E(\mu,v)\approx[u,v]M(x, y)\begin{bmatrix} \mu\\ v \end{bmatrix} E(μ,v)[u,v]M(x,y)[μv]

其中,

M ( x , y ) = [ I x 2 I x I y I x I y I y 2 ] = [ A C C B ] M(x, y)=\begin{bmatrix} I_x^2 & I_xI_y\\ I_xI_y &I_y^2 \end{bmatrix} = \begin{bmatrix} A & C\\ C & B \end{bmatrix} M(x,y)=[Ix2IxIyIxIyIy2]=[ACCB]

M ( x , y ) M(x, y) M(x,y)的定义可以看到,对于角点有左右边沿或上下边沿组成, I x I_x Ix I y I_y Iy总有一个近似于0,因此对于角点有,

M ( x , y ) = [ I x 2 0 0 I y 2 ] M(x, y)=\begin{bmatrix} I_x^2 & 0\\ 0 &I_y^2 \end{bmatrix} M(x,y)=[Ix200Iy2]

这里考虑的是左右上下边沿与图像高宽平行组成的角点,对于旋转和缩放的角点需要单独讨论。

在判断是否为角点时,为了减少运算量,通常并不会计算M的特征值,而使用M的行列式和迹来计算:

R = d e t ( M ) − α ( t r a c e ( M ) ) 2 R = det(M) - \alpha(trace(M))^2 R=det(M)α(trace(M))2

α \alpha α是一个经验常数,用来控制检测到角点的数量, α \alpha α值越小检测到的角点越多,相应的质量也会下降。

  • I x I_x Ix I y I_y Iy都很大时, R R R取较大正值,说明是角点
  • I x I_x Ix I y I_y Iy一大一小时, R R R取较大负值,说明是边
  • I x I_x Ix I y I_y Iy都很小时, R R R绝对值较小,说明是平坦区域

GFTTDetector中使用的是Shi-Tomasi 角点检测器,其直接使用 R = m i n ( I x , I y ) R=min(I_x, I_y) R=min(Ix,Iy)作为角点的度量,减少了超参数和运算量。

OpenCV中GFTTDetector类

调用GFTTDetector类中的静态函数create可以创建cv::Ptr<GFTTDetector>

create函数参数为:


static Ptr<GFTTDetector> cv::GFTTDetector::create	(	int 	maxCorners = 1000,double 	qualityLevel = 0.01,double 	minDistance = 1,int 	blockSize = 3,bool 	useHarrisDetector = false,double 	k = 0.04 
)		
  • maxCorners控制最多检测到的角点数量
  • qualityLevel控制角的质量水平,例如最好的是1500, qualityLevel0.01,则quality measure小于1500*0.01的将被舍弃
  • minDistance角点之间的最小距离
  • blockSize计算梯度相关矩阵时使用的邻域大小
  • useHarrisDetector是否使用Harris角点检测
  • k,Harris角点检测的超参数

代码示例:

#include <memory>
#include <vector>
#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>class TestGFTTDetector
{public:typedef std::shared_ptr<TestGFTTDetector> Ptr;TestGFTTDetector();~TestGFTTDetector() = default;void compute(cv::Mat &image);private:cv::Ptr<cv::GFTTDetector> gftt_ptr_;std::vector<cv::KeyPoint> keypoints_;
};TestGFTTDetector::TestGFTTDetector()
{gftt_ptr_ = cv::GFTTDetector::create(1000, 0.1, 10);
}void TestGFTTDetector::compute(cv::Mat &image)
{   cv::Mat mask(image.size(), CV_8UC1, 255);gftt_ptr_->detect(image, keypoints_, mask);for(auto &kp : keypoints_) {cv::circle(image, kp.pt, 3, cv::Scalar(255, 0, 0));}std::cout << "keypoints_.size: " << keypoints_.size() << std::endl;cv::imshow("gftt_detector_result", image);cv::waitKey(0);cv::goodFeaturesToTrack()
}int main(int argc, char **argv)
{TestGFTTDetector::Ptr gftt = std::make_shared<TestGFTTDetector>();cv::Mat image = cv::imread(argv[1]);gftt->compute(image);return 0;
}

检测结果如下:

可以看到检测的结果还是很好的,不过中间大六边形上面的两个角点还是没有检测到,感兴趣可以改小 k k k的值试一下。

使用的图片在OpenCV代码仓库中opencv-4.5.5/samples/data/blox.jpg


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


reference

  • 1.https://senitco.github.io/2017/06/18/image-feature-harris/
  • 2.https://docs.opencv.org/4.5.5/df/d21/classcv_1_1GFTTDetector.html

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

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

相关文章

【算法与数据结构】20、LeetCode有效的括号

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;括号匹配是使用栈解决的经典问题。做这道题首先要分析什么时候括号不匹配。1、右括号多余 ( { [ ] } )…

PCL 法向量估计源码学习

一、思路&#xff1a; 二、源码 #ifndef PCL_FEATURES_IMPL_NORMAL_3D_H_ #define PCL_FEATURES_IMPL_NORMAL_3D_H_#include <pcl/features/normal_3d.h>/// template <typename PointInT, typename PointOutT> void pcl::NormalEstimation<PointInT, PointOutT…

【stability.ai】SDXL:改进高分辨率图像合成的潜在扩散模型

github&#xff1a;https://github.com/Stability-AI/stablediffusion 试用&#xff1a; https://clipdrop.co/stable-diffusion https://dreamstudio.ai/ 介绍 近年来&#xff0c;深度生成建模在自然语言、音频和视觉媒体等各个数据领域取得了巨大的突破。本文将重点关注视…

nohup命令解决SpringBoot/java -jar命令启动项目运行一段时间自动停止问题

问题描述&#xff1a; 在centos7上部署多个springcloud项目。出现了服务莫名其妙会挂掉一两个的问题&#xff0c;重新启动挂掉的服务之后又会出现其他服务挂掉的情况&#xff0c;查看启动日志也并没有发现有异常抛出。令人费解的是所有的服务都是通过nohup java -jar xxx.jar …

TCP / IP 参考模型

TCP / IP 参考模型 5层参考模型5层参考模型5层模型的数据封装 5层参考模型 5层参考模型 综合 OSI 和 TCP/IP 的优点应用层: 支持各种网络应用 FTP, SMTP, HTTP 传输层: 进程-进程的数据传输 TCP, UDP 网络层: 源主机到目的主机的数据分组路由与转发 IP协议、路由协议等 链路层…

JS中的扁平化数据转换为树形结构数组

递归方法和循环方法&#xff0c;我都写了两种代码&#xff0c;仅供参考。 三种递归方法&#xff0c;两种循环方法&#xff0c;本质上都一样&#xff0c;就是写法不一样&#xff0c;加油&#xff01;&#xff01;&#xff01; // 数据 const arr [{ id: 1, name: 广东, pid:…

还在手动下载github项目?想要自动化下载github项目?基于python开发项目自动下载模块帮你实现自动下载存储

GitHub是一个基于Web的代码托管平台和开发者社区。它允许开发者存储、管理和分享他们的代码&#xff0c;并进行版本控制。开发者可以在GitHub上创建仓库来存储项目代码&#xff0c;并使用Git来跟踪和管理代码的变更历史。GitHub提供了一系列协作工具&#xff0c;如问题追踪、Pu…

Vue实现在线文档预览

目录 背景在线预览Office文档文件在线预览pdf文档预览方案一方案二 Word文档预览Excel文档预览PPT文档预览 纯文本、各种代码文件预览图片文件预览视频文件预览Aliplayer阿里云播放器Xgplayer西瓜播放器Bilibiliplayer仿哔哩哔哩弹幕播放器 音频文件预览在线文档预览项目&#…

POE级联蓝牙定位系统方案_蓝牙信标,蓝牙网关,级联蓝牙网关

近年来,随着新能源行业的快速发展,在化工厂,核电厂以及电力电厂等企业,对人员定位,人员导航,资产定位,生命体征监测的需求越来越大。传统的蓝牙室内定位方案中蓝牙信标为锂亚电池供电,需定期更换电池且有安全隐患,为更好的服务有蓝牙定位导航,被动人员定位,生命体征…

MySQL之概述、安装和使用(一)

一、概述 关系数据库概述&#xff1a; https://blog.csdn.net/qq_21370419/article/details/128568920 二、数据库的安装 参考我的两篇博客&#xff1a; win10 安装mysql 5.6.36版本_windows 安装mysql5.6_人……杰的博客-CSDN博客 wind 10 安装 mysql 8.0_人……杰的博客…

50从零开始学Java之万类之王Object是怎么回事?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前面的文章中&#xff0c;壹哥跟大家说过&#xff0c;Java是面向对象的编程语言&#xff0c;而在面…

IDEA+SpringBoot+mybatis+SSM+layui+Mysql客户管理系统源码

IDEASpringBootmybatisSSMlayuiMysql客户管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.修改密码3.客户管理4.添加客户5.充值记录管理6.消费记录管理7.客户类型8.添加客户类型 三、部分代码UserMapper.javaLoginController.javaUser.java 四、其他获取源码 一、…