【特征检测器】检测器

news/2024/11/19 23:33:48/

检测器

      • 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 suppressionconst 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);constfloat* 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.ppmy.cn/news/500992.html

相关文章

基于XDP技术的高性能rtp媒体转发服务程序

在软交换中&#xff0c;经常有公网转发音频、视频媒体的需求&#xff0c;开源软件有rtpproxy、rtpengine之类&#xff0c;但性能并不是太好&#xff0c;经常有人说跑音、视频几百路就把机器CPU跑满了。 以前写过一篇“跨平台、高性能的媒体转发服务器实现”&#xff0c;本质上…

基于SpringCloud微服务FTP客户端设计

一、引言 21世纪是信息化时代,是多媒体的时代,网络技术快速发展,推动了世界范围的信息传输和信息交流。人与人之间共享文件越来越频繁,随着科技质量的提高,文件变的相比较而言比以前大了不少,这时人们对文件处理需求就会有很大要求。我们可以通过邮件来传输,或者通过U盘…

three.js几何体的_UV_、法向属性以及BufferGeometry类介绍

一、几何体的_UV_以及法向属性 UV属性是一组二维坐标&#xff0c;每个顶点都有一个对应的UV坐标。在三维模型上贴上二维的纹理贴图时&#xff0c;需要将所有顶点映射到纹理上的对应位置。UV属性的取值范围一般是[0,1]&#xff0c;表示纹理上的相对位置。通过修改UV属性&#xf…

提升项目经理能力,有什么方法?

一&#xff0c;项目管理是职场的基础能力 他思考了一会&#xff0c;和我说&#xff1a;项目经理这个职业&#xff0c;同事专业性强&#xff0c;薪酬稳定&#xff0c;福利优越。只要有几年的项目管理经验&#xff0c;也能生存无忧。 但是&#xff0c;如果你不满足于只做一个普…

时间序列中的无监督表示学习

自监督学习中&#xff0c;有一个常用的方法是对比学习&#xff1b; 2.  时间序列的表示学习 1.1 采用对比学习的方式 Time-series representation learning via temporal and contextual contrasting(IJCAI’21) 本文采用对比学习的方式进行时间序列表示学习。首先对于同一…

中望3d快捷键命令大全_中望3D快捷键设置

三维CAD软件大都是通过鼠标点击来完成工作&#xff0c;然而作为一名长期坐在电脑旁使用三维软件来工作的人&#xff0c;如果长期使用单手工作是不利于健康的&#xff0c;且工作效率也比使用双手配合工作的人低。此时&#xff0c;我们可以通过在三维CAD中设置快捷键的方式来减少…

3DMAX部分快捷键

F3 线框覆盖 F4 边面 Z 选择物体单独最大化显示&#xff0c;没有选择物体时则是场景中所有物体最大化显示 Alt 鼠标中键 环绕操作 Alt W 最大化视图切换 Ctrl N 数值表达求值器 Q 选择物体 Ctrl 加选 Alt 减选 Ctrl I 反选 Ctrl A 全选 Ctrl Z 撤销 W 移动 …

3ds Max,Maya用户转Blender的方案“同快捷键或同操作方案”

目录 系列文章目录 文章目录 前言 一、3ds Max 、Maya用户最快捷加入Blender的方案&#xff08;插件篇&#xff09; 1、Blender插件【BsMax】获取地址&#xff1a; 2、Blender快速实现操作习惯的同步&#xff08;纯属个人经验&#xff0c;仅供参考&#xff09; 2.1 3ds M…