位置: IT常识 - 正文

OpenCV实战(17)——FAST特征点检测(opencv教程)

编辑:rootadmin
OpenCV实战(17)——FAST特征点检测 OpenCV实战(17)——FAST特征点检测0. 前言1. FAST 特征点检测2. 自适应特征检测3. 完整代码小结系列链接0. 前言

推荐整理分享OpenCV实战(17)——FAST特征点检测(opencv教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opencv教程,opencv实战识别,opencv实战识别,opencv实战车牌识别,opencv实战项目教程,opencv实战口罩识别,opencv实战口罩识别,opencv实战项目教程,内容如对您有帮助,希望把文章链接给更多的朋友!

Harris 算子根据两个垂直方向上的强度变化率给出了角点(或更一般地说,兴趣点)的数学定义。但使用这种定义需要计算图像导数,计算代价较为高昂,特别是兴趣点检测通常只是更复杂算法的先决步骤。 在本中,我们将学习另一个特征点检测算子 FAST (Features from Accelerated Segment Test)。其专门设计用于快速检测图像中的兴趣点;关键点检测仅基于几个像素的比较。

1. FAST 特征点检测

使用 OpenCV 通用接口进行特征点检测,能够轻松使用任意特征点检测器。本节将介绍 FAST 检测器,顾名思义,其被设计为进行快速计算。

(1) 创建一个关键点向量来存储结果:

std::vector<cv::KeyPoint> keypoints;

(2) 创建一个阈值为 40 的 FAST 检测器:

// FAST 检测器cv::Ptr<cv::FastFeatureDetector> ptrFAST = new cv::FastFeatureDetector(40);

(3) 检测加载图像的所有关键点:

ptrFAST->detect(image, keypoints);

OpenCV 还提供了一个通用函数来在图像上绘制关键点:

cv::drawKeypoints(image, keypoints, image, cv::Scalar(255, 255, 255), cv::DrawMatchesFlags::DRAW_OVER_OUTIMG);OpenCV实战(17)——FAST特征点检测(opencv教程)

通过指定绘图标志,将关键点绘制在输入图像上,可以得到以下输出结果:

当我们将关键点颜色指定为负值时,绘制的每个圆圈将使用不同的随机颜色。 与 Harris 角点一样,FAST 特征算法源于角点定义,该定义基于特征点周围的图像强度。关键点的检测通过检查以候选点为中心的像素圆进行,如果找到长度大于圆周长 3/4 的连续点(弧),其所有像素都与中心点的强度显着不同,则该候选点为一个关键点。 这是一个可以快速计算的检测过程。此外,在其公式中,该算法使用了一个额外的技巧来进一步加快计算过程。事实上,如果我们首先测试圆上相距 90 度的四个点(例如,上、下、右、左),为了满足检测条件,其中至少三个点都必须比中心像素更亮或更暗,否则,可以立即否定该点,而无需检查圆周上的其他点。这是一个非常高效的检测技巧,因为在实践中,大多数图像点都无法满足此四点检测条件。 要检查像素圆的半径是该方法需要考虑的一个因素,在实践中发现,半径为 3 时检测效果较好,效率也更高,此时,需要考虑圆周上的 16 个像素: R≈[16121531441351261171098]R\approx\left[ \begin{array}{ccc} & & 16 & 1 & 2 & &\\ & 15 & & & & 3& \\ 14&&&&&&4\\ 13&&&0&&&5\\ 12&&&&&&6\\ & 11 & & & & 7&\\ & & 10 & 9 & 8 & &\\\end{array}\right]R≈​141312​1511​1610​109​28​37​456​​

在以上示例中,用于预测试的四个点的像素值为 1、5、9 和 13,所需满足条件的连续较暗或较亮的像素点数为 12。但是,可以观察到通过将连续段的长度减少到 9,可以更好的检测到角点在不同图像上的可重复性。这种变体通常称为 FAST-9 角点检测器,这也是 OpenCV 中所采用的。此外,OpenCV 中的 cv::FASTX 函数实现了 FAST 检测器的另一个变体。 一个像素点的强度必须与中心像素的强度相差指定的量才会被视为满足更暗或更亮的检测条件,相差的量使用函数中的阈值参数指定,阈值越大,检测到的角点就越少。 而对于 Harris 特征而言,通常需要对已经检测到的角点进行非极大值抑制。因此,需要定义角点强度度量。也可以考虑以下替代方案,角点强度由中心像素与所识别的连续弧上的像素之间的绝对差之和给出,该算法也可通过直接函数调用实现:

cv::FAST(image, // 输入图像 keypoints, // 输出关键点向量 40, // 阈值 false); // 是否使用非极大值抑制

但是,推荐使用 cv::FeatureDetector 接口,提高应用程序的灵活性。 FAST 特征点检测算法实现了非常快的兴趣点检测,因此,当程序需要效率优先时,应该首选该算法,例如,在实时视觉跟踪或对象识别应用程序中,必须在实时视频流中跟踪或匹配多个特征点。 为了改进特征点的检测,OpenCV 提供使用许多类适配器,以更好地控制关键点的提取。

2. 自适应特征检测

如果希望更好地控制特征点的数量,可以使用 cv::FeatureDetector 类的子类 cv::DynamicAdaptedFeatureDetector,其可以指定检测的兴趣点数量,在 FAST 特征检测器中用法如下:

cv::DynamicAdaptedFeatureDetector fastD( new cv::FastAdjuster(40), // 特征检测器 150, // 最少特征数量 200, // 最大特征数量 50); // 最大迭代次数fastD->detect(image, keypoints);

然后迭代地检测兴趣点,每次迭代后,检查检测到的兴趣点数量,并相应地调整检测器阈值以产生更多或更少的点;重复此过程,直到检测到的兴趣点数位于指定的区间内。 通过指定最大迭代次数,避免过多检测耗费太多时间。要以通用方式实现此方法,使用的 cv::FeatureDetector 类必须实现 cv::AdjusterAdapter 接口,该类包括一个 tooFew 方法和一个 tooMany 方法,这两个方法都会修改检测器的内部阈值以产生更多或更少的关键点;此外,还有一个断言方法,当检测器阈值仍然可以调整时返回 true。 虽然可以使用 cv::DynamicAdaptedFeatureDetector 类获得适当数量的特征点,但是这需要以降低效率为代价;此外,该类无法保证一定会在指定的迭代次数内获得所需数量的特征点。 可以看到,我们将动态分配对象的地址作为参数传递,以指定适配器类将使用的特征检测器。我们无需手动释放分配的内存来避免内存泄漏,这是因为指针会被转移到 cv::Ptr<FeatureDetector> 参数,它会自动释放所指向的对象。 另一个有用的类适配器是 cv::GridAdaptedFeatureDetector 类,它会在图像上定义网格,然后,可以限制每个单元格包含的最大元素数量,以将检测到的关键点散布在图像上。在检测图像中的关键点时,通常会在特定纹理区域中看到集中的兴趣点。例如,在以上图像的眼睛周围检测到非常密集的 FAST 特征点,通过使用此类适配器可以改进检测结果:

cv::GridAdaptedFeatureDetector fastG( new cv::FastFeatureDetector(10), // 特征检测器 1200, // 最大特征点数量 5, // 网格行数 2); // 网格列数fastG->detect(image, keypoints);

类适配器通过使用提供的 cv::FeatureDetector 对象检测每个单元格上的特征点,还可以指定最大总特征点数,在每个单元格中只保留强度最大的数个点,以免超过指定的最大值。 cv::PyramidAdaptedFeatureDetector 适配器可以在图像金字塔上应用特征检测器,结果组合在关键点的输出向量中:

cv::PyramidAdaptedFeatureDetector fastP( new cv::FastFeatureDetector(60), // 特征检测器 3); // 金字塔层数fastP->detect(image, keypoints);

每个点的坐标通过原始图像坐标指定,此外设置 cv::Keypoint 类的 size 属性,以便在原始分辨率的一半处检测到的点的大小是原始图像中检测到的点的大小的两倍。将 cv::drawKeypoints 函数中的 flag 参数设为 cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS,可以令绘制的半径等于关键点 size 属性。

3. 完整代码

头文件 (harrisDetector.h) 完整代码参考 Harris 特征点检测一节,主函数文件 (fastCorners.cpp) 完整代码如下所示:

#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/features2d/features2d.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/xfeatures2d.hpp>#include "harrisDetector.h"int main() { // 读取图像 cv::Mat image = cv::imread("1.png", 0); if (!image.data) return 0; cv::transpose(image, image); cv::flip(image, image, 0); cv::namedWindow("Original"); cv::imshow("Original",image); std::vector<cv::KeyPoint> keypoints; // FAST 特征 image = cv::imread("1.png", 0); cv::transpose(image, image); cv::flip(image, image, 0); keypoints.clear(); // FAST 检测器 cv::Ptr<cv::FastFeatureDetector> ptrFAST = cv::FastFeatureDetector::create(40); ptrFAST->detect(image, keypoints); cv::drawKeypoints(image, keypoints, image, cv::Scalar(255, 255, 255), cv::DrawMatchesFlags::DRAW_OVER_OUTIMG); std::cout << "Number of keypoints (FAST): " << keypoints.size() << std::endl; cv::namedWindow("FAST"); cv::imshow("FAST",image); // 未使用非极大值抑制的 FAST 特征 image = cv::imread("1.png", 0); cv::transpose(image, image); cv::flip(image, image, 0); keypoints.clear(); ptrFAST->setNonmaxSuppression(false); ptrFAST->detect(image, keypoints); cv::drawKeypoints(image, keypoints, image, cv::Scalar(255, 255, 255), cv::DrawMatchesFlags::DRAW_OVER_OUTIMG); cv::namedWindow("FAST Features (all)"); cv::imshow("FAST Features (all)",image); // 读取图像 image = cv::imread("1.png", 0); cv::transpose(image, image); cv::flip(image, image, 0); int total(100); // 关键点数量 int hstep(5), vstep(3); // 4x3 的网格 int hsize(image.cols/hstep), vsize(image.rows/vstep); int subtotal(total/(hstep*vstep)); // 每个网格中的关键点数量 cv::Mat imageROI; std::vector<cv::KeyPoint> gridpoints; std::cout << "Grid of " << vstep << " by " << hstep << " each of size " << vsize << " by " << hsize << std::endl; // 使用低阈值探测 ptrFAST->setThreshold(20); // 非极大值抑制 ptrFAST->setNonmaxSuppression(true); keypoints.clear(); for (int i=0; i<vstep; i++) { for (int j=0; j<hstep; j++) { // 在当前网格上创建ROI imageROI = image(cv::Rect(j*hsize, i*vsize, hsize, vsize)); // 在网格中检测关键点 gridpoints.clear(); ptrFAST->detect(imageROI, gridpoints); std::cout << "Number of FAST in grid " << i << "," << j << ": " << gridpoints.size() << std::endl; if (gridpoints.size()>subtotal) { for (auto it=gridpoints.begin(); it!=gridpoints.end()+subtotal; ++it) { std::cout << " " << it->response << std::endl; } } // 获取最强 FAST 特征 auto itEnd(gridpoints.end()); if (gridpoints.size()>subtotal) { std::nth_element(gridpoints.begin(), gridpoints.end()+subtotal, gridpoints.end(), [](cv::KeyPoint& a, cv::KeyPoint& b) {return a.response>b.response;}); itEnd = gridpoints.begin() + subtotal; } // 添加到全局关键点向量 for (auto it=gridpoints.begin(); it!=itEnd; ++it) { it->pt += cv::Point2f(j*hsize, i*vsize); keypoints.push_back(*it); std::cout << " " << it->response << std::endl; } } } cv::drawKeypoints(image, keypoints, image, cv::Scalar(255, 255, 255), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); cv::namedWindow("FAST Features (grid)"); cv::imshow("FAST Features (grid)", image); cv::waitKey(); return 0;}小结

为了解决 Harris 角点检测算法计算代价较为高昂的缺点,特征点检测算子 FAST (Features from Accelerated Segment Test) 被专门设计用于快速检测图像中的角点。本节,我们介绍了如何使用通用接口调用 OpenCV 中的 FAST 特征点检测算法。

系列链接

OpenCV实战(1)——OpenCV与图像处理基础 OpenCV实战(2)——OpenCV核心数据结构 OpenCV实战(3)——图像感兴趣区域 OpenCV实战(4)——像素操作 OpenCV实战(5)——图像运算详解 OpenCV实战(6)——OpenCV策略设计模式 OpenCV实战(7)——OpenCV色彩空间转换 OpenCV实战(8)——直方图详解 OpenCV实战(9)——基于反向投影直方图检测图像内容 OpenCV实战(10)——积分图像详解 OpenCV实战(11)——形态学变换详解 OpenCV实战(12)——图像滤波详解 OpenCV实战(13)——高通滤波器及其应用 OpenCV实战(14)——图像线条提取 OpenCV实战(15)——轮廓检测详解 OpenCV实战(16)——角点检测详解

本文链接地址:https://www.jiuchutong.com/zhishi/300494.html 转载请保留说明!

上一篇:Vue开发实例(20)之实现登录功能(vue企业开发实战)

下一篇:echarts文档解读(echarts api文档)

  • 拉黑再删除永久加不上怎么办(拉黑再删除永久加不上怎么设置)

    拉黑再删除永久加不上怎么办(拉黑再删除永久加不上怎么设置)

  • 支付宝电子照片怎么弄(支付宝电子照片用手机怎么照)

    支付宝电子照片怎么弄(支付宝电子照片用手机怎么照)

  • 正在运行ussd代码什么意思(正在运行ussd代码怎么办)

    正在运行ussd代码什么意思(正在运行ussd代码怎么办)

  • 优酷账号分享不合法IP上限(优酷怎么没分享了)

    优酷账号分享不合法IP上限(优酷怎么没分享了)

  • 表格属性在布局选项卡的什么组中(表格属性在布局选项卡的哪里)

    表格属性在布局选项卡的什么组中(表格属性在布局选项卡的哪里)

  • 华为p40pro发货时间(华为mate40pro发货好慢)

    华为p40pro发货时间(华为mate40pro发货好慢)

  • 华为荣耀30返回键在哪里(华为荣耀30返回键怎么设置位置)

    华为荣耀30返回键在哪里(华为荣耀30返回键怎么设置位置)

  • 6s是a几处理器(苹果12用的什么处理器)

    6s是a几处理器(苹果12用的什么处理器)

  • 苹果手机序列号fk开头什么意思(苹果手机序列号真伪查询官网)

    苹果手机序列号fk开头什么意思(苹果手机序列号真伪查询官网)

  • 华为荣耀30s有没有指纹解锁(华为荣耀30s有没有陀螺仪)

    华为荣耀30s有没有指纹解锁(华为荣耀30s有没有陀螺仪)

  • 隔空打印机是什么意思(隔空打印机什么好)

    隔空打印机是什么意思(隔空打印机什么好)

  • oppo手机摄像头黑屏是怎么回事(oppo手机摄像头转换不过来怎么办)

    oppo手机摄像头黑屏是怎么回事(oppo手机摄像头转换不过来怎么办)

  • qq标识小海螺是什么(qq海螺是什么意思)

    qq标识小海螺是什么(qq海螺是什么意思)

  • 淘宝为什么不能代付了(淘宝为什么不能访问相册)

    淘宝为什么不能代付了(淘宝为什么不能访问相册)

  • 形状环绕方式怎么设置(word2010形状环绕方式)

    形状环绕方式怎么设置(word2010形状环绕方式)

  • ipad充电时显示什么图标(ipad充电时显示不支持此配件是什么意思)

    ipad充电时显示什么图标(ipad充电时显示不支持此配件是什么意思)

  • vivox27怎么没有面部解锁(vivox27怎么没有更多设置功能)

    vivox27怎么没有面部解锁(vivox27怎么没有更多设置功能)

  • oppor11打电话听筒声音小(oppor 11接电话声音小怎么回事)

    oppor11打电话听筒声音小(oppor 11接电话声音小怎么回事)

  • 微信里运行日志有用吗(微信里运行日志在哪里看)

    微信里运行日志有用吗(微信里运行日志在哪里看)

  • qq音乐铭牌在哪里看(qq音乐铭牌怎么看)

    qq音乐铭牌在哪里看(qq音乐铭牌怎么看)

  • 陌陌怎么不能视频了?(陌陌怎么不能视频聊天了)

    陌陌怎么不能视频了?(陌陌怎么不能视频聊天了)

  • oppoFindx前置摄像头指示灯怎么亮(oppofindx前置摄像头黑屏)

    oppoFindx前置摄像头指示灯怎么亮(oppofindx前置摄像头黑屏)

  • 笔记本切换投影(笔记本切换投影仪fn+什么)

    笔记本切换投影(笔记本切换投影仪fn+什么)

  • 58同城如何删除发布的信息(58同城如何删除兼职简历)

    58同城如何删除发布的信息(58同城如何删除兼职简历)

  • 怎么避免Win10一个文件夹卡死无响应关闭所有文件夹?(如何防止win10自动重启)

    怎么避免Win10一个文件夹卡死无响应关闭所有文件夹?(如何防止win10自动重启)

  • 不能从销项税额中抵扣的进项税额都有什么
  • 受托加工的物资是哪个科目
  • 个税申报没填过租房信息,却有怎么回事
  • 以销定产如何核算成本
  • 银行入息是入几个月的
  • 每股未分配利润是什么意思
  • 公司注销固定资产怎么处理税怎么交
  • 应交增值税和应交税费
  • 企业职工薪酬的个人所得税纳税筹划研究
  • 本年利润怎样结转未分配利润
  • 在建工程会计分录什么意思
  • 加工费发票可以不开数量吗
  • 福利费进项税可以抵扣
  • 对供应商的罚款怎么入账
  • 工地水电包公包料的细节
  • 增值税普通发票几个点
  • 所得税的费用限额怎么算
  • 其他综合收益影响递延所得税负债吗
  • 一般纳税人的资质在哪里打印
  • 营业成本包括费用类吗
  • 闲置资金的利息收益要冲减财务费用
  • 购进农产品怎么做账
  • 企业增资需要缴纳什么税
  • 股东不发工资只给员工钱
  • 深度操作系统的窗口管理器
  • Mac系统怎么设置ftp
  • 绿化租赁价格
  • 认缴出资怎么记账
  • 除了电脑杀毒软件还有啥
  • 系统搜索力
  • nbscheduler是什么程序
  • 从上布法罗荒野地区的惠特克顶小道向东看,阿肯色州奥沙克国家森林 (© Jens Lambert Photography/Getty Images Plus)
  • php执行mysql语句的函数
  • 企业发生的利得和损失应计入所有者权益
  • 煤炭贸易公司账务大全
  • elementui中的el-tab-pane为什么内容会为0
  • 应收票据终止确认的情形
  • 两个岗位 如何选择
  • vue鼠标点击事件点击改变效果,再次点击恢复效果
  • 其他业务收入是什么意思
  • yolov3模型训练
  • node教程
  • 缴纳残保金会计分录最新
  • 应交税费会计分录怎么做明细科目
  • 税务机关代开的增值税专用发票不含税销售额是什么意思
  • 应付职工薪酬属于什么会计科目
  • mongodb win7
  • bkuzmic/jquerycrossdomaindataplugin
  • 员工旅游的费用账务处理
  • 固定资产处置增值税政策
  • PostgreSQL教程(十八):客户端命令(2)
  • 异常凭证一定要转出吗
  • 办公室装修用什么材料便宜
  • 个体工商户的免税证明
  • 增值税零税率与免税谁更优惠
  • 委托加工物资账务
  • 买的仪器
  • 建筑业老项目和新项目如何计税
  • 企业存货计价方法发生变更案例
  • sqlserver锁表是什么意思
  • win10如何固定桌面图标
  • imessage对方看了会显示已读吗
  • windows的设置
  • win8关闭开机启动项
  • 进程registry
  • 如何设置windows hello
  • win10怎么禁用device/credential guard
  • win7 64位旗舰版电脑被唤醒之后显示器依然黑屏怎么办?
  • 微软 系统设计
  • form表单中input设置为readonly和disabled的区别
  • yarn使用教程
  • 自动化软件安装工具
  • netmon.exe
  • unable to instantiate decoder
  • 中国税务稽查官网
  • 打印格式不对怎么设置A4
  • 重庆市电子税务局官网
  • 西安二手房几年可以过户
  • 国家税务总局黑龙江电子税务局下载
  • 单位固定资产转到个人名下要交税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设