17.OpenCV中的GFTTDetector类

news/2024/11/24 11:33:48/

文章目录

    • 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.ppmy.cn/news/779556.html

相关文章

小米手机关闭系统广告操作步骤

小米手机关闭系统广告操作步骤 设置→小米账号→声明与条款→系统广告→系统工具广告→关闭 设置→应用设置→应用管理→右上角三个点→设置→关闭“应用升级提醒”&“资源推荐” 桌面左滑打开负一屏→划到底部→设置&#xff08;⚙️&#xff09;→服务管理→选择关闭项…

【关闭广告】全网最全关闭小米手机MIUI系统广告教程攻略

这大概是目前全网最全的小米MIUI系统关闭广告的保姆级教程了。 1. 在桌面打开任意文件夹,点击文件夹名,点击关闭 今日推荐 2. 在桌面双指捏合,点击设置 -- 更多设置 -- 负一屏,点击关闭 热门活动 3. 在桌面双指捏合,点击设置 -- 更多设置 -- 负一屏 -- 隐私设置,点击关闭 个性化…

小米手机彻底关闭广告经验分享

帮朋友买了个小米12P&#xff0c;到手后发现广告一大堆&#xff0c;于是利用两个小时整理&#xff0c;总结出以下关闭广告方法 &#xff0c;如朋友们还有其他补充&#xff0c;请直接评论即可 &#xff0c;给大伙做个参考。1.设置→小米账号→声明与条款→系统广告→系统工具广告…

android升级小米系统版本,miui7怎么升级?小米升级MIUI7系统两种方法介绍

小米秋季新品发布会在北京国家会议中心如期举行&#xff0c;雷军在此次发布会上正式公布了全新的MIUI 7。在外观及界面UI方面&#xff0c;MIUI 7新增了四套全新的UI&#xff0c;首次出现了粉红色主调的女神版UI&#xff0c;系统图标、壁纸、锁屏等诸多元素进行了重绘&#xff1…

android studio 的x86文件夹,AndroidStudio修改默认C盘配置文件夹(.android.gradle.AndroidStudio)以及修改后避免踩的坑...

场景 AndroidStudio下载安装教程(图文教程): 在上面安装完Android Studio后,会默认在C:\Users\Administrator下生成以下目录 这三个文件夹的作用: .android 这个文件夹是Android SDK生成的AVD(Android Virtual Device Manager)即模拟器存放路径 .AndroidStudio 这个文件夹是…

【美化】小米平板IOS主题

开始前说一哈&#xff1a;开学大三&#xff0c;为了看考研资料和视频&#xff0c;低价收了一个二手小米平板2。虽然安卓平板是辣鸡&#xff0c;没有IOS板的app生态&#xff0c;但是美好的UI设计还是可以仿一仿的。下面是几个界面的样子吧&#xff1a; 嗯&#xff01;教程开始 …

小米4 第三方re奇兔_小米10隐藏技巧,解除限制,MIUI11内置动态壁纸恢复设为来电秀...

最近遇到一位粉丝&#xff0c;提出质疑说&#xff0c;小米动态壁纸不能设置为来电秀&#xff1b;经过我测试后&#xff0c;确实如此。内置视频壁纸没有"设为来电秀"这一选项&#xff0c;而下载的视频壁纸就有此选项。 同样是视频文件&#xff0c;设置项却不同&#x…

小米5aosp android p,为小米5刷入Lineage OS 15.1

LineageOS官方在{{上周:2.26}}正式发布了基于 AOSP项目 Android 8.1 开发的LineageOS 15.1,感动哭。我用了两个多月的 unofficial,终于可以转正了!那么就让我来把LineageOS 15.1刷进手机里去。不过,我的小米手机 5 在我的各种{{折腾:zh m}}之下出了不少问题:千疮百孔。 好在…