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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hyperledger Fabric测试网络的准备和基本使用

文章目录 相关安装启动测试网络创建channel打包链码安装链码包通过链码定义链码定义提交给通道调用链码关闭网络遇到的问题1.docker保持启动状态2.忘起测试网络了3.Java版本过高&#xff0c;推荐1.8 相关安装 npm、node、git、docker、docker-compose。docker保证一直运行 serv…

[Error] invalid preprocessing directive #inclued问题解决

错误代码 报错内容 [Error] invalid preprocessing directive #inclued 错误原因 #inclued写错了应该写成#include

flutter页面添加透明遮罩

路由工具 import package:test/main.dart; import package:flutter/material.dart;import circle_page_route.dart;class NavigatorUtil {static push(Widget page, {BuildContext context}) {return Navigator.push(context ?? navigatorKey.currentContext,MaterialPageRo…

HTTP以及Servlet的学习

HTTP和Servlet 联系&#xff1a; HTTP是一个通信协议&#xff0c;而Servlet是服务器端程序&#xff0c;用于处理HTTP请求。Servlet通常用于处理HTTP请求&#xff0c;在服务器上生成动态内容&#xff0c;并生成HTTP响应。HTTP协议就是Servlet处理的基础。 区别&#xff1a; …

Matlab数学建模实战——(Lokta-Volterra掠食者-猎物方程)

1.题目 问题1 该数学建模的第一问和第二问主要是用Matlab求解微分方程组&#xff0c;直接编程即可。 求解 Step1改写 y(1)ry(2)f Step2得y的导数 y(1).2y(1)-ay(1)*y(2)y(2).-y(2)a*y(1)*y(2) Step3编程 clear; a0.01; F(t,y)[2*y(1)-a*y(1)*y(2);-y(2)a*y(1)*y(2)]; […

MySQL的数据备份与还原--练习题

MySQLdump MySQLdump是MySQL提供的一个非常有用的数据库备份工具。MySQLdump命令执行时&#xff0c;可以将数据库备份成一个文本文件&#xff0c;该文件中实际上包含了多个CREATE 和 INSERT语句&#xff0c;使用这些语句可以重新创建表和插入数据。 看题&#xff1a; 第一题&a…

【新手上路】如何在Web3时代成为XR创建者

目录 0 XR在Web3里的作用 1 XR的概念、特征、技术、设备、平台、应用和工具 1.1 VR的概念、特征和技术 1.2 AR的概念、特征和技术 1.2 XR的设备、平台、应用和工具 2 选择XR的方法 2.1 何时使用VR 2.2 何时使用AR 3 开发XR作品的4个步骤 4 成为XR构建者的路径 4.1 三…

Win10使用gdc-client下载TCGA数据集【安装使用教程】成功解决闪退问题!

做实验需要下载TCGA数据集&#xff0c;数据量比较大的时候&#xff0c;直接从网页下载速度非常慢&#xff0c;容易出现下载不全等情况。 调研后选择在Win10端使用gdc-client来帮助下载Cart文件。 一、下载软件、配置环境 下载软件 下载网站链接&#xff1a;https://gdc.can…

解决dotnet调用https请求被中止未能创建SSL/TLS安全通道

环境:dotnet4.7.2/winserver2012 问题描述: 调用https出现请求被中止,未能创建SSL/TLS安全通道 第一试 自定义SetCertificatePolicy 函数&#xff0c;在建立http连接之前调用 SetCertificatePolicy 函数。 public static void SetCertificatePolicy() {ServicePointManage…

实战攻防之积极防御体系建设 | 中睿天下受邀参与诸子云沙龙

7月8日&#xff0c;中睿天下受邀参与由诸子云举办的“网络与数据安全”主题沙龙&#xff0c;中睿天下技术经理徐丹丹就《实战攻防之积极防御体系建设》这一主题进行了分享交流。 本次沙龙由南京分会会长宋士明主持&#xff0c;活动邀请到BASF、江苏省联社、华泰证券、宁证期货、…

工作日志2 input 的事件优先级 字符串.trim() this.$set()的应用 获取jq的自定义属性

input 的事件优先级 1.input输入框的事件 字符串.trim() 除去前后空格的方法 undefind不可以使用 this.$set()的应用

记录jeecg-boot及a-table前端问题

标签页重复 原因&#xff1a; 在TabLayout中它有监听$route&#xff0c;是根据route.fullpath去判断的。这就会出现一种情况&#xff0c;我是同一个path比如/detail,但是我带了个参数/detail?id132165151651和/detail?id256151561651这两个fullpath明显不同&#xff0c;所以…

单片机能否替代PLC实现控制和自动化系统?

是的&#xff0c;单片机可以在某些情况下替代PLC&#xff0c;但在其他情况下可能并不适用。以下是对这个问题的详细解释&#xff1a; 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 灵活性和可编程性&#xff1a;PLC相对于单片机来说更具有灵活性和可编…

k8s 持久化存储

我们继续来查看 k8s 的卷&#xff0c;上一次我们分享了将磁盘挂载到容器中&#xff0c;empyDir 和 gitRepo 都是会随着 pod 的启动而创建&#xff0c;随着 pod 的删除而销毁 那么我们或许会有这样的需求&#xff0c;期望在 pod 上面读取节点的文件或者使用节点的文件系统来访问…

Linux学习之变量引用和作用范围

使用${变量名}或者$变量名就可以引用变量&#xff0c;$变量名其实是${变量名}的省略写法。 要是变量名后边还有其他字符就需要加上{}&#xff0c;比如helloToBash这个变量的值是Hello Bash&#xff0c;而需要输出的字符串是“Hello Bashing”&#xff0c;这样就需要加上{}&…

COMDEL射频电源维修康戴尔高频电源CLX2750

美国COMDEL电源维修常见型号包括&#xff1a;CLX2750&#xff1b;CLX2500&#xff1b;CLX-600H&#xff1b;CX600AS&#xff1b;CX-5000S&#xff1b;CX-3500S&#xff1b;CX-2500S&#xff1b;CV500&#xff1b;CDX2000等。 Comdel成立于1966年&#xff0c;总部设在马萨诸塞州…

设计模式-建造者模式在Java中使用示例

场景 建造者模式 复杂对象的组装与创建 没有人买车会只买一个轮胎或者方向盘&#xff0c;大家买的都是一辆包含轮胎、方向盘和发动机等多个部件的完整汽车。 如何将这些部件组装成一辆完整的汽车并返回给用户&#xff0c;这是建造者模式需要解决的问题。 建造者模式又称为…

Windows git bash输入vim报错,不能使用vim-plug插件管理器

Windows系统下的git bash在安装时自带了默认的vim&#xff0c;我自己也下了个gvim&#xff0c;并且配置了.vimrc&#xff0c;其中使用了vim-plug管理nerdtree这些插件。但是在bash中vim <file>时&#xff0c;就会蹦出来几行报错&#xff1a; 处理 /c/Users/<username…

Redis报错-CROSSSLOT keys in request don‘t hash in the same slot

背景 问题涉及&#xff1a;spring security、spring session、redis 问题描述 springbootspringsecurityspringsessionantd 登录功能的时候&#xff0c;在源码中使用到了redis的rename命令&#xff08;如下图所示&#xff09; 在这里就会报错 CROSSSLOT keys in request d…

Shell通配符和正则表达式

目录 ​​​​​​​grep 通配符 正则表达式 grep grep家族有三大成员分别为&#xff1a; grep&#xff1a;支持使用基本正则表达式。 egrep&#xff1a;支持使用扩展正则表达式。 fgrep&#xff1a;不支持使用正则表达式&#xff0c;即所有的正则表达式中的元字符都将作…