OpenCV(cv::cornerSubPix())



cv::cornerSubPix() 是 OpenCV 中的一个函数,用于在亚像素精度下优化图像中的角点检测结果。它在角点检测中是一个后处理步骤,常与 cv::goodFeaturesToTrack()cv::findChessboardCorners() 等角点检测函数一起使用,以提高角点的精度。



1. 函数定义

void cv::cornerSubPix(
    InputArray image,
    InputOutputArray corners,
    Size winSize,
    Size zeroZone,
    TermCriteria criteria
)

参数:

  1. image:

    • 输入图像,通常为单通道的灰度图像 (CV_8UC1)。
    • 这是角点检测的输入图像,cv::cornerSubPix() 会在这个图像上进一步优化角点的位置。
  2. corners:

    • 输入输出参数,表示角点的位置。
    • 初始时,它应该包含角点的初始位置(例如由 cv::goodFeaturesToTrack()cv::findChessboardCorners() 计算得到)。函数将基于这些初始位置来精确化角点坐标,优化后的坐标会在这个参数中输出,且为浮点精度(亚像素级别)。
  3. winSize:

    • 搜索窗口的半大小,设定为 (wx, wy),意味着搜索窗口的大小为 (2 * wx + 1, 2 * wy + 1)
    • 此窗口定义了角点精确化时考虑的区域范围。窗口越大,可能得到更准确的结果,但计算成本也会增加。
  4. zeroZone:

    • 定义一个“零区”,即在计算过程中忽略中心窗口的区域。该区域可以用 (x, y) 表示。
    • 如果将此值设为 (-1, -1),则不会忽略任何区域。在某些情况下,忽略中心区域可以提高计算的鲁棒性(例如角点检测结果周围有噪声时)。
  5. criteria:

    • 终止条件,可以是迭代次数、精度或两者结合。该参数定义了优化过程何时停止。
    • 它是一个 cv::TermCriteria 类型的对象,通常使用 TermCriteria::MAX_ITER | TermCriteria::EPS 来设定最大迭代次数和精度阈值。

返回值:

该函数没有返回值。优化后的角点位置会直接修改传入的 corners 参数。



2. 工作原理

cv::cornerSubPix() 基于输入图像的梯度信息,在指定窗口范围内迭代更新初始角点的位置,从而精确化角点的坐标。它使用二次插值方法来提高检测精度,使角点坐标达到亚像素级别的精度。



3. 典型应用场景

  1. 棋盘角点检测:
    棋盘角点常用于相机标定。在使用 cv::findChessboardCorners() 检测到角点后,通过 cv::cornerSubPix() 可以提高角点检测的精度,提升标定的准确性。

  2. 特征点提取:
    在进行计算机视觉任务(如图像拼接、运动估计等)时,通常需要高精度的特征点坐标,cv::cornerSubPix() 可以有效提高特征点的精度。



4. 示例

#include <opencv2/opencv.hpp>
#include <vector>

int main() {
    // 读取灰度图像
    cv::Mat gray = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);

    // 初步角点检测
    std::vector<cv::Point2f> corners;
    cv::goodFeaturesToTrack(gray, corners, 50, 0.01, 10);

    // 设置窗口大小、零区大小和终止条件
    cv::Size winSize(5, 5);
    cv::Size zeroZone(-1, -1);
    cv::TermCriteria criteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 40, 0.001);

    // 优化角点位置
    cv::cornerSubPix(gray, corners, winSize, zeroZone, criteria);

    // 绘制优化后的角点
    for (const auto& pt : corners) {
        cv::circle(gray, pt, 3, cv::Scalar(255, 0, 0), -1);
    }

    cv::imshow("Corners", gray);
    cv::waitKey(0);
    return 0;
}


总结

cv::cornerSubPix() 是一个强大的角点精确化工具,能够通过迭代优化方法将角点检测的精度提升到亚像素级别。这对于需要高精度角点信息的计算机视觉任务非常有用,例如相机标定、图像拼接和运动跟踪等。



posted @   做梦当财神  阅读(327)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2021-08-30 Python 子类继承父类构造函数说明
2021-08-30 Python 二分查找
2021-08-30 Python 面向对象
2021-08-30 Python __str__()
点击右上角即可分享
微信分享提示