【特征检测器】检测器

news2024/9/21 20:23:41

检测器

      • 1. Shi-Tomasi 检测器
        • 1.1 算法特点:
        • 1.2算法步骤
        • 1.3 8-邻域非最大抑制算法

在这里插入图片描述

1. Shi-Tomasi 检测器

1.1 算法特点:

  • Shi-Tomasi 检测器使用了 Harris 算法的改良版,在处理图像边缘时具有更好的性能表现,能够检测出更多的稳定角点。
  • Shi-Tomasi 检测器通过计算特征点处的协方差矩阵并对其进行特征值分解,从而得到每个特征点的角点响应函数。
  • Shi-Tomasi 检测器可以通过设置阈值来控制检测的角点数量,从而适应不同的应用场景。
  • Shi-Tomasi 检测器的计算速度比其他角点检测算法如 SIFT 和 SURF 要快得多,因此适合于实时计算机视觉应用。

总之, Shi-Tomasi 检测器作为一种快速、准确且可控制角点数量的角点检测算法,在计算机视觉领域中有着广泛的应用。

1.2算法步骤

  1. 计算图像中每个像素点 x 和 y 方向的梯度,使用 Sobel 导数滤波器或其他梯度估计算法。

  2. 对于每个像素点,计算一个 2x2 的局部自相关矩阵 M:

M = ( ∑ x , y ∈ N ( I x ) 2 ∑ x , y ∈ N I x I y ∑ x , y ∈ N I x I y ∑ x , y ∈ N ( I y ) 2 ) , M=\begin{pmatrix} \sum_{x,y\in N}(I_x)^2 & \sum_{x,y\in N}I_xI_y \\ \sum_{x,y\in N}I_xI_y & \sum_{x,y\in N}(I_y)^2 \end{pmatrix}, M=(x,yN(Ix)2x,yNIxIyx,yNIxIyx,yN(Iy)2),

其中,N 表示以当前像素点为中心的一个邻域窗口。

  1. 计算 M 的特征值 λ1 和 λ2。

  2. 判断这个像素点是否为角点。采用的方法是结合 λ1 和 λ2 来计算一个响应函数 R。

    常用响应函数包括:

R = m i n ( λ 1 , λ 2 ) R = λ 1 + λ 2 R = λ 1 λ 2 R = {\rm min}(\lambda_1, \lambda_2)\\ R = \lambda_1 + \lambda_2 \\ R = \frac{\lambda_1}{\lambda_2} R=min(λ1,λ2)R=λ1+λ2R=λ2λ1

通常使用第一种函数来计算角点得分,在比较所有像素点的得分以确定是否为角点。

  1. 进行非极大值抑制,去除重复的角点。
  2. 首先进行Shi-Tomasi角点检测,得到所有检测到的角点和它们的响应值(关键点分数)。
    对于每个关键点,计算其周围一定尺寸(例如3x3或5x5)的邻域内所有关键点的响应值,找到其中最大的响应值,并将该值与当前关键点的响应值比较。
    如果当前关键点的响应值不是最大的,则将其从候选列表中删除。否则,保留该点并继续向下处理下一个点。
bool compShiTomasiScore(const cv::Mat& img, const Eigen::Vector2i& px, double* score) {
  CHECK_NOTNULL(score);
  CHECK(img.type() == CV_8UC1);
  constexpr int kHalfPatchSize = 4;
  constexpr int kPatchSize = 2 * kHalfPatchSize;
  constexpr int kPatchArea = kPatchSize * kPatchSize;

  const int x_min = px(0) - kHalfPatchSize;
  const int x_max = px(0) + kHalfPatchSize;
  const int y_min = px(1) - kHalfPatchSize;
  const int y_max = px(1) + kHalfPatchSize;

  if (x_min < 1 || x_max >= img.cols - 1 || y_min < 1 || y_max >= img.rows - 1)
    return false;

  float dXX = 0.0;
  float dYY = 0.0;
  float dXY = 0.0;
  const int stride = img.step.p[0];
  for (int y = y_min; y < y_max; ++y) {
    const uint8_t* ptr_left = img.data + stride * y + x_min - 1;
    const uint8_t* ptr_right = img.data + stride * y + x_min + 1;
    const uint8_t* ptr_top = img.data + stride * (y - 1) + x_min;
    const uint8_t* ptr_bottom = img.data + stride * (y + 1) + x_min;
    for (int x = 0; x < kPatchSize; ++x, ++ptr_left, ++ptr_right, ++ptr_top, ++ptr_bottom) {
      float dx = *ptr_right - *ptr_left;
      float dy = *ptr_bottom - *ptr_top;
      dXX += dx * dx;
      dYY += dy * dy;
      dXY += dx * dy;
    }
  }

  // Find and return smaller eigenvalue:
  dXX = dXX / (2.0f * kPatchArea);
  dYY = dYY / (2.0f * kPatchArea);
  dXY = dXY / (2.0f * kPatchArea);
  *score = 0.5f * (dXX + dYY - std::sqrt((dXX - dYY) * (dXX - dYY) + 4 * dXY * dXY));
  return true;
}

这就是 Shi-Tomasi 检测器的算法步骤,它可以通过检测到图像中显著的角点来帮助计算机视觉任务,例如特征匹配和目标跟踪等应用。

1.3 8-邻域非最大抑制算法

8-邻域非最大抑制算法。非最大抑制是计算机视觉中常用的技术,它可以帮助去掉图像中冗余的特征点,只保留最具代表性的特征点。这个函数针对一个输入分数图score和一个角点网格grid进行操作,并输出筛选后的角点corners。

在具体实现时,该函数通过遍历score矩阵中每个点,确定了中心点(center)及它周围8个点(p1~p8)的坐标,并定位它们在角点网格中的位置(k)。如果中心点得分小于设定的阈值,就直接跳过。否则,检查该点与周围点之间的得分关系,如果不满足non-maximum suppression 的条件,则跳过。如果得分高于其它点且大于当前角点的得分,则更新角点信息并加入到corners列表中,具体包括点的坐标、尺度(即金字塔层数,level)、得分、角度等信息,其中角度需要调用 getAngleAtPixelUsingHistogram() 函数计算。

整个非最大抑制过程将会在每个金字塔层都执行一次,并针对不同的尺度(scale)进行处理,来获取更全局的角点特征。

  // 8-neighbor nonmax suppression
  const int stride = score.step;
  for (int y = border; y < score.rows - border; ++y) {
    const float* p = &score.at<float>(y, border);
    for (int x = border; x < score.cols - border; ++x, ++p) {
      const int k = grid.getCellIndex(x, y, scale);
      if (grid.occupancy_.at(k))
        continue;

      const float* const center = p;
      if (*center < threshold)
        continue;
      if (*(center + 1) >= *center)
        continue;
      if (*(center - 1) > *center)
        continue;
      const float* const p1 = (center + stride);
      const
      float* const p2 = (center - stride);
      if (*p1 >= *center)
        continue;
      if (*p2 > *center)
        continue;
      if (*(p1 + 1) >= *center)
        continue;
      if (*(p1 - 1) > *center)
        continue;
      if (*(p2 + 1) >= *center)
        continue;
      if (*(p2 - 1) > *center)
        continue;

      Corner& c = corners.at(k);
      if (*p > c.score) {
        c.x = x * scale;
        c.y = y * scale;
        c.level = level - 1;
        c.score = *p;
        c.angle = getAngleAtPixelUsingHistogram(img_pyr[level], Eigen::Vector2i(x, y), 4);
      }
    }
  }

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

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

相关文章

【kali学习笔记】信息收集之搜索引擎的使用技巧

一、Google 搜索引擎的使用技巧 1、Google 常用语法说明 site 指定域名 inurl URL 中存在的关键字页面 intext 网页内容里面的关键字 Filetype 指定文件类型 intitle 网页标题中的关键字 link 返回你所有的指定域名链接 info 查找指定站点信息 cache 搜索 Google 里的内容缓存…

【账号篇】华硕电脑-华硕账号注销教程

【账号篇】华硕电脑-华硕账号注销教程 手机号和邮箱号注册的华硕账户无法合并&#xff0c;无法互相关联&#xff0c;需要数据同步的可以选择先注销删除其中一个账号再关联—【蘇小沐】 文章目录 【账号篇】华硕电脑-华硕账号注销教程1.实验环境 &#xff08;一&#xff09;华硕…

(二叉树) 116. 填充每个节点的下一个右侧节点指针 ——【Leetcode每日一题】

❓ 116. 填充每个节点的下一个右侧节点指针 难度&#xff1a;中等 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; }填充它的每个 …

MySQL 高级语句二

目录 表连接查询内连接 inner join左连接 left join右连接 right join 表的自我连接 &#xff08;算排名&#xff09;view 的视图的运用union 联级union&#xff08;合并后去重&#xff09;union all &#xff08;合并后不去重&#xff09; 多种方式求表与表的交集值取两个SQL语…

基于spss的多元统计分析 之 实例1(挤压塑料胶卷的最优工艺研究)(6/8)

挤压塑料胶卷的最优工艺研究 摘要 多元方差分析是同时分析多个响应变量和一个共同预测变量集之间关系的检验。与方差分析一样&#xff0c;多元方差分析需要连续响应变量和类别预测变量。与运行多个方差分析&#xff08;一次一个响应变量&#xff09;相比&#xff0c;多元方差分…

综合专题学期实训IV综合报告

综合专题学期实训IV综合报告 题目 基于Java的聊天系统设计与实现 所在院系 计算机与信息工程学院 学科专业名称 计算机科学与技术 导师及职称 夏端峰&#xff08;副高&#xff09;、黄烜&#xff08;讲师&#xff09; 撰写时间 2023年6月16日 目 录 1 概述 1 2 相关技术 1 2.…

2-2 A pretrained model that fakes it until it makes it

1.The GAN game Let’s suppose, for a moment, that we’re career criminals who want to move into selling forgeries of “lost” paintings by famous artists. We’re criminals, not painters, so as we paint our fake Rembrandts and Picassos, it quickly becomes a…

【系统开发】尚硅谷 - 谷粒商城项目笔记(九):Sentinel高并发方法论

文章目录 Sentinel高并发方法论Sentinel是什么&#xff1f;基本概念及作用整合SpringBoot引入Sentinel依赖下载Sentinel控制台cmd启动Sentinel配置Sentinel控制台地址信息在控制台设置流控规则规则持久化流量监控自定义流控返回数据适配Feign&#xff0c;并加上熔断保护方法自定…

CorelDRAW2023最新工作室Win版矢量图形编辑与排版工具软件

CorelDRAW简称CDR,是一款专业的平面设计软件,专注于矢量图形编辑与排版。ps和cdr是常用的两款平面设计软件&#xff0c;一直以来深受广大设计师的喜爱&#xff0c;但仍然有很多小伙伴不知道它们之间的区别。那初学者先学ps还是cdr&#xff0c;初学者cdr哪个版本好&#xff1f;我…

【openGauss高级数据管理】--略有小成

【openGauss高级数据管理】--略有小成 &#x1f53b; 一、openGauss高级数据管理&#x1f530; 1.1 约束⛳ 1.1.1 NOT NULL约束⛳ 1.1.2 UNIQUE约束⛳ 1.1.3 PRIMARY KEY⛳ 1.1.4 FOREIGN KEY⛳ 1.1.5 CHECK约束 &#x1f530; 1.2 JOIN⛳ 2.3.1 CROSS JOIN---交叉连接⛳ 1.2.1…

基于spss的多元统计分析 之 实例2(挤压塑料胶卷的最优工艺研究)(7/8)

主成分分析 摘要 主成分分析是利用降维的思想&#xff0c;把多指标转化为少数几个综合指标的多元统计分析方法。 对同一个个体进行多项观察时&#xff0c;必定涉及多个随机变量&#xff0c;它们都是相关的&#xff0c;一时难以综合。这时就需要进行主成分分析来概括诸多信息…

7.延时消息与原理探究

highlight: arduino-light 4.3 延时消息 延迟消息对应的Topic是SCHEDULETOPICXXXX,注意就是SCHEDULETOPICXXXX,XXXX不是某某某的意思。 SCHEDULETOPICXXXX的队列名称是从2开始到17&#xff0c;对应的delayLevel为3到18&#xff0c;3对应10s&#xff0c;18对应2h&#xff0c;在类…

因为计算机中丢失mfc140.dll无法启动修复步骤分享

计算机报错提示mfc140.dll无法启动是怎么回事&#xff1f;mfc140.dll是什么文件&#xff0c;为什么会影响到软件程序的运行?相信你也有不少困惑&#xff0c;遇到这个情况不用慌&#xff0c;小编下面就分享关于mfc140.dll丢失的详细修复步骤以及mfc140.dll是什么。 mfc140.dll是…

java中集合类forEach删除元素报错:ConcurrentModificationException

如题所示&#xff0c;我们在java开发中&#xff0c;可能会有这样的一种情况&#xff0c;一个集合使用完了&#xff0c;我们想删除里面所有的元素&#xff0c;可能会遍历他们&#xff0c;然后依次调用删除操作。最简单的我们使用forEach遍历。 示例如下&#xff1a; public cla…

EasyCode代码生成插件-模板分享(基于数据表生成MyBatisPlus格式的dao,service,controller和vue组件)

目录 概述 使用演示 模板代码 实体类pojo 表现层controller 业务层service接口 业务层serviceImpl实现类 持久层dao Vue组件 概述 本片博客用于分享EasyCode的自定义模板&#xff08;模板在篇末&#xff09;&#xff0c;用于简化开发&#xff0c;免去重复性的工作。 …

SQL 基础语句

SQL 基础语句 DDL Data Definition Language 数据定义语言创建 create删除 drop修改 alter清空 truncate show tables ; --查看所有表&#xff1a; drop database db1; --删除数据库 create database db1 default character set utf8; --创建数据库 use databas…

【统信uos-server-20-1060e】-详细安装openGauss

【统信uos-server-20-1060e】-详细安装openGauss &#x1f53b; 前言&#x1f53b; 一、安装前准备&#x1f530; 1.1 openGauss安装包下载&#x1f530; 1.2 安装环境准备⛳ 1.2.1 硬件环境要求⛳ 1.2.2 软件环境要求⛳ 1.2.3 软件依赖要求⛳ 1.2.4 关闭操作系统防火墙、selin…

Redis 2023面试5题(四)

一、AOF 持久化&#xff08;Append Only File&#xff09;如何配置&#xff1f; AOF&#xff08;Append Only File&#xff09;持久化是 Redis 的一种持久化方式&#xff0c;它通过记录所有收到的写命令来保存数据。以下是一些关于如何配置 AOF 持久化的重要信息&#xff1a; …

Linux系统下使用移动硬盘或者U盘,如何挂载硬盘分区到Linux系统

本文目录 1、查看当前磁盘分区状态2、查看当前磁盘的挂载状态3、将磁盘挂载到指定目录下4、从文件系统里卸载磁盘 Linux系统里&#xff0c;除根目录以外&#xff0c;任何文件或者目录要想被访问&#xff0c;需要将其“关联”到根目录下的某个目录来实现&#xff0c;这种关联操作…

网络安全等级保护2.0 | 等保合规5件事

网络安全等级保护工作包括定级、备案、安全建设、等级测评、监督检查五个阶段。 1、定级 确认定级对象&#xff0c;参考《定级指南》等初步确认等级&#xff0c;组织专家评审&#xff0c;主管单位审核&#xff0c;公安机关备案审查。 备案 持定级报告和备案表等材料到公安机…