OpenCV 特征检测与描述入门:为什么角点是好特征,以及 Feature Detection / Description 的完整概念框架
OpenCV 特征检测与描述入门为什么角点是好特征以及 Feature Detection / Description 的完整概念框架【免费下载链接】opencvOpen Source Computer Vision Library项目地址: https://gitcode.com/GitHub_Trending/opencv31/opencv本文基于 OpenCV 官方 Python 教程中的《Understanding Features》一章展开从拼图这个经典问题讲起解释什么是图像特征、为什么角点corner和团块blob被认为是好的特征以及特征检测Feature Detection与特征描述Feature Description这两个核心概念各自的职责。读完本文你将建立起整套特征点算法Harris、Shi-Tomasi、SIFT、FAST、ORB 等的概念底座并能在 OpenCV features 模块源码 中找到这些概念对应的一等 APIKeyPoint、Feature2D、goodFeaturesToTrack、SimpleBlobDetector与各类 Matcher。从拼图游戏说起计算机为什么需要特征原文档的出发点非常直观几乎每个人都玩过拼图jigsaw puzzle游戏——给你一堆打乱的小图块你要把它们拼回一张完整的图。问题在于你是怎么拼的把这个能力移植给计算机就能让计算机玩拼图再进一步把若干张同一自然风景的实拍照片交给计算机让它把照片缝合成一张大图全景拼接甚至再进一步给它一栋建筑的很多张照片让它建出 3D 模型SfM/视觉重建。这些能力都依赖于同一个最基础的问题拼图到底是怎么拼的答案是我们人在无意识地寻找那些独特、容易被跟踪、容易被比较的特定图案或特征。原文档指出如果要给这种特征下定义可能很难用语言精确表达但我们都知道它是什么。如果有人让你指出一个可以在多张图之间被比较的好特征你一定能指出来。这正是小孩子也能简单玩这些游戏的原因。我们在图像中搜索这些特征、找到它们、再到其他图像中寻找同样的特征然后对齐它们。就这样。在拼图中我们更多地依赖不同图像之间的连续性。也就是说整套流程被压缩成一句朴素的话在图像中找到特征 - 在其他图像中找到同样的特征 - 对齐人类的大脑天生具备这种能力这是程序化在大脑里的但计算机不行——它需要一套可以被精确描述的数学定义。于是原文档把什么是这些特征答案也要让计算机能理解作为核心追问并用两张图来回答。建筑图实验平坦区 边缘 角点这张图位于 feature_building.jpg非常简洁原图上方放置了 6 个小图块patch题目是让你在原图中找到这些图块的精确位置。原文档的结论值得逐条细读因为它直接给出了特征好坏的判据——局部窗口在任意方向移动时外观变化是否显著A、B 是平坦区域flat surface这类区域在图中大面积分布比如均匀的天空或墙面。把一个平坦图块放在哪里看起来都一样因此很难确定它的精确位置。C、D 是建筑的边缘edge比平坦区好能找到大致位置但精确位置仍然困难。原因是沿着边缘图案到处都一样along the edge the pattern is the same everywhere——图块可以沿边缘方向平移而不被察觉只有在垂直于边缘沿梯度方向移动时才会变化。所以边缘比平坦区好拼图里靠边缘连续性对缝确实有用但还不够格。E、F 是建筑的角点corner无论往哪个方向移动图块它看起来都不一样因此可以轻易找到精确位置是好特征。这个A/B 平坦、C/D 边缘、E/F 角点的分级是整章的灵魂它把特征从一个模糊的直觉概念变成了可操作的判别标准——在一个小邻域内朝所有方向做微小位移响应变化最大的位置就是特征点。原文档明确说这个直觉将在后续章节中被翻译成计算机语言对应 Harris 响应函数、Shi-Tomasi 的极值检测等而这正是Feature Detection特征检测这个名字的由来。简化模型蓝色/黑色/红色图块为了更清楚地说明原文档换了一张更简单的图feature_simple.png其中有三类图块蓝色图块平坦区域。无论怎么移动看起来都一样——难以定位、难以跟踪。黑色图块包含一条边缘。沿垂直方向即沿梯度方向移动时它会变沿边缘方向平行于边缘移动时它看起来不变。红色图块角点。无论往哪个方向移动它看起来都不同——意味着它是独特的unique。由此得出本章的核心结论角点被认为是图像中的好特征。不仅仅是角点在某些情况下 blob/团块也被认为是好特征。这里原文档特意补充了blob 也是好特征这一句这并非闲笔——OpenCV 的 SimpleBlobDetector 就是专门检测 blob 的特征检测器后文会看到它在源码中的位置。特征的两大核心概念Detection 与 Description原文档用找完之后怎么办引出第二个关键概念。找到特征点后你需要在其他图像中找到同一个特征点。原文档给出的类比很生动我们取特征周围的区域用自己的话描述它——比如上半部分是蓝天下半部分是建筑区域建筑上还有玻璃窗——然后拿这个描述去其他图像里搜索同一片区域。本质上你是在描述这个特征。计算机同样需要描述特征周围的区域才能在别的图像里找到它。于是两个术语被正式定义原文加粗强调Feature Detection特征检测找到特征点的过程。直觉定义是寻找那些在周围所有方向上做微小位移时变化最大的区域即前文角点的判别标准。Feature Description特征描述对特征点周围的区域生成一段描述在 OpenCV 中通常是描述子向量 descriptor使得同一特征点在不同图像不同视角、尺度、光照下仍然可以被找到。最后一步原文档也交代了拿到特征及其描述之后就可以在所有图像中找到相同的特征把它们对齐align、拼接stitch或做任何你想做的事。原文档的收尾明确了本模块py_features 教程系列的范围在本模块中我们将研究 OpenCV 中用于查找特征、描述特征、匹配特征等的不同算法。概念到代码OpenCV features 模块中的对应实现上面这些概念在 OpenCV 仓库中都有精确的落点全部集中在 modules/features 模块教程系列后续章节对应的实现也大多在这里KeyPoint特征的检测结果数据结构。每一个被检测到的特征点的位置、尺度、方向、响应强度等都用cv::KeyPoint表示它是后续所有检测/描述/匹配算法的统一输入输出格式基础实现在 keypoint.cpp。Feature2D所有特征算法的抽象基类。定义在 features.hpp第 227 行附近class CV_EXPORTS_W Feature2D : public Algorithm。检测器Detector与描述子提取器DescriptorExtractor都继承自它这也正是教程检测器 描述子两分法的类型系统体现。goodFeaturesToTrack角点检测的 API。声明于 features.hpp 的CV_EXPORTS_W void goodFeaturesToTrack(InputArray image, OutputArray corners, ...)它实现的就是本文微小位移下各方向变化最大的角点判据内部基于 Shi-Tomasi 思想即教程目录中的 py_shi_tomasi 一章。同文件中第 647 行附近的注释也说明它是goodFeaturesToTrack的包装类GFTTFeatureDetector。SimpleBlobDetectorblob 检测的 API。声明于 features.hppclass CV_EXPORTS_W SimpleBlobDetector : public Feature2D实现见 blobdetector.cppSimpleBlobDetectorImpl第 59 行附近。它正是原文档那句在某些情况下 blob 也被认为是好特征在源码中的直接体现。特征描述与匹配描述子算法SIFT、ORB 等与匹配器Brute-Force、FLANN都位于本模块例如 orb.cpp、sift.dispatch.cpp 与 matchers.cppOpenCL 加速版本在 src/opencl/ 下如orb.cl、sift.cl。可以推断教程中检测—描述—匹配三步流程与源码的组织结构是一一对应的*FeatureDetector*/检测函数产出KeyPoint列表*DescriptorExtractor*为每个KeyPoint生成描述子向量*DescriptorMatcher*再在两张图的描述子之间建立对应关系。本篇在 py_features 教程系列中的位置本篇是 特征检测与描述教程目录tutorial_py_table_of_contents_features的第一课tutorial_py_features_meaning后续章节按先回答是什么再回答怎么做的顺序展开后续章节解决的问题相对路径Harris 角点角点是好特征但我们怎么找到它们py_features_harrisShi-Tomasi工程化的角点检测goodFeaturesToTrackpy_shi_tomasiSIFTHarris 在图像尺度变化时不够用Lowe 提出尺度不变特征py_sift_introFAST前面方法不够快、无法支撑 SLAM 等实时应用py_fastORB免费、快速的 SIFT/SURF 替代方案py_orbMatcher用 Brute-Force 与 FLANN 两种技术匹配描述子py_matcherHomography结合 3D 模块在复杂图像中定位物体py_feature_homography这也解释了为什么本篇纯概念章节是整套特征的起点它定义了三个贯穿始终的判据——可区分性uniqueness特征窗口在任意方向平移后外观必须显著变化角点满足、边缘半满足、平坦区不满足可定位性特征必须能被精确找到位置平坦区即使存在也无法精确定位可描述/可比较性特征周围区域必须能被描述从而在别的图像中被重新找到——这直接引出描述子与匹配器的必要性。小结什么是特征的答案是在图像中做微小位移时响应变化最大的区域最典型的是角点此外 blob 在特定场景下也是好特征平坦区域因无法定位而被排除边缘因沿自身方向不可区分而只是次好。Feature Detection负责找到这些位置Feature Description负责描述特征邻域使其可跨图比较两者结合匹配matching之后就支撑起图像对齐、全景拼接与 3D 重建等应用。这些概念在 OpenCV 中都有明确的一等公民对应物KeyPoint、Feature2D基类、goodFeaturesToTrack角点、SimpleBlobDetectorblob、SIFT/ORB 描述子与 Brute-Force/FLANN 匹配器源码均位于 modules/features可结合上述教程目录逐章深入。【免费下载链接】opencvOpen Source Computer Vision Library项目地址: https://gitcode.com/GitHub_Trending/opencv31/opencv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考