opencv(cpp)基础学习--2026年5月2日
以下是整理后的博客版本,已修正表述并优化了排版,可直接复制使用:
角点检测(Corner Detection)
角点检测的核心原理是计算图像中每个像素点的角点响应值,响应值越大,该点是角点的概率越高。角点通常对应于图像中物体的拐角、交叉点等具有显著梯度变化的区域。
① Harris 角点检测
函数:cv::cornerHarris()
cv::cornerHarris(
src, // 输入:单通道灰度图(CV_8UC1 或 CV_32FC1)
dst, // 输出:角点响应值矩阵(CV_32FC1),每个像素对应一个响应值
blockSize,// 邻域大小:计算角点响应时考虑的邻域窗口尺寸(如 2、3)
ksize, // Sobel 卷积核大小:用于计算图像梯度的 Sobel 算子尺寸,必须是奇数(如 3、5)
k // Harris 参数:对"角点"与"边缘"的区分敏感度,经验值通常为 0.04 ~ 0.06
);
处理流程:
- 调用
cornerHarris()计算每个像素的角点响应值。 - 对输出矩阵进行归一化处理(通常使用
cv::normalize()),将响应值映射到便于观察或阈值筛选的范围。 - 使用阈值筛选或局部极大值抑制提取最终角点。
② Shi-Tomasi 角点检测(goodFeaturesToTrack)
Harris 算法的改进版,直接选取响应值最高的 N 个角点,效果更稳定。
函数:cv::goodFeaturesToTrack()
std::vector<cv::Point2f> corners; // 存储检测到的角点坐标
cv::goodFeaturesToTrack(
src, // 输入:单通道灰度图
corners, // 输出:检测到的角点坐标数组,使用 vector<cv::Point2f> 存储
maxCorners, // 最多返回的高质量角点数量
qualityLevel, // 质量水平:如 0.01,表示仅保留响应值大于最大响应值 1% 的角点
minDistance // 最小距离:如 10,表示保留的角点之间至少相距 10 个像素,避免同一区域角点过于密集
);
参数说明:
| 参数 | 说明 |
|---|---|
corners |
使用 std::vector<cv::Point2f> 存储角点的像素坐标 |
qualityLevel |
相对质量阈值。例如 0.01 表示只保留响应值大于全局最大响应值 1% 的角点,其余舍弃 |
minDistance |
角点之间的最小欧氏距离(直线距离)。若多个角点距离小于该值,仅保留响应值最高的那个,防止角点扎堆 |
③ SIFT(尺度不变特征变换)
SIFT 是一种经典的局部特征描述算法,对图像的缩放、旋转、亮度变化具有鲁棒性,能够检测并描述图像中的关键点(角点、边缘点、斑点等)。
使用步骤:
// 1. 创建 SIFT 检测器
cv::Ptr<cv::SIFT> sift = cv::SIFT::create();
// 2. 检测关键点
std::vector<cv::KeyPoint> keypoints;
sift->detect(grayImg, keypoints); // 输入灰度图,输出检测到的关键点信息
// 可选:计算特征描述子
cv::Mat descriptors;
sift->compute(grayImg, keypoints, descriptors);
关键点信息存储在 cv::KeyPoint 中,包含坐标、尺度、方向等属性。
④ ORB(Oriented FAST and Rotated BRIEF)
ORB 是 SIFT 的轻量级替代方案,计算速度更快,且对旋转和缩放同样具有鲁棒性,适合实时应用。
使用步骤:
// 1. 创建 ORB 检测器
cv::Ptr<cv::ORB> orb = cv::ORB::create();
// 2. 同时检测关键点并计算描述子
std::vector<cv::KeyPoint> keypoints;
cv::Mat descriptors;
orb->detectAndCompute(
grayImg, // 输入:灰度图
cv::noArray(),// 掩码:不使用掩码时传入 cv::noArray()
keypoints, // 输出:检测到的关键点信息
descriptors // 输出:关键点的二进制特征描述子矩阵(每行对应一个关键点的描述向量)
);
说明:
keypoints:使用std::vector<cv::KeyPoint>存储,包含每个关键点的坐标、尺度、方向等信息。descriptors:cv::Mat类型,每行对应一个关键点的特征描述向量,用于后续的特征匹配。
四种角点检测方法对比
| 方法 | 特点 | 适用场景 |
|---|---|---|
| Harris | 计算角点响应图,需手动阈值筛选;对旋转不变,但对尺度敏感 | 教学理解角点检测原理,简单场景 |
| Shi-Tomasi | Harris 的改进版,直接返回最优 N 个角点;稳定性更好 | 需要固定数量角点的跟踪、标定等任务 |
| SIFT | 尺度、旋转、亮度不变;特征描述能力强;计算量大 | 图像拼接、三维重建、物体识别等离线高精度任务 |
| ORB | 速度远快于 SIFT;具备旋转和尺度不变性;描述子为二进制,匹配效率高 | 实时应用、SLAM、移动端等对速度敏感的场景 |
补充说明
- 关键点(KeyPoint)与角点(Corner):严格来说,角点是关键点的一种。SIFT 和 ORB 检测的"关键点"不仅包含角点,还可能包含边缘点、斑点(Blob)等具有局部显著性的特征点。
- 描述子(Descriptor):SIFT 和 ORB 不仅检测关键点位置,还会计算该点周围邻域的特征向量(描述子),用于不同图像间(如旋转、缩放后的图像)关键点的匹配。Harris 和 Shi-Tomasi 仅检测位置,不生成描述子,如需匹配需额外计算(如使用 SIFT/ORB 的描述子,或自定义描述方法)。

浙公网安备 33010602011771号