opencv的亚像素角点检测函数cornerSubPix

在 OpenCV 中,cornerSubPix 函数用于对角点的亚像素精确化。这个函数可以提高角点检测的精度,通常在角点检测之后使用,如在 Harris 或 Shi-Tomasi 角点检测之后。

函数原型

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

参数说明

  • image: 输入图像,通常为灰度图像。
  • corners: 输入输出参数,表示检测到的角点坐标。输入时为检测到的角点,输出时为亚像素精确化后的角点。
  • winSize: 窗口大小,用于计算角点的精确位置。通常使用 Size(5, 5)Size(11, 11)
  • zeroZone: 设置为 Size(-1, -1) 表示不使用零区。零区是指在计算光流时,窗口中心不能使用的区域。
  • criteria: 终止条件,用于指定算法的停止条件,通常设置为最大迭代次数或精度。

示例代码

以下是一个使用 cornerSubPix 的示例:

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

int main() {
    // 加载图像
    cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
    if (image.empty()) {
        std::cerr << "Could not open or find the image!" << std::endl;
        return -1;
    }

    // 检测角点
    std::vector<cv::Point2f> corners;
    cv::goodFeaturesToTrack(image, corners, 100, 0.01, 10);

    // 设置亚像素精确化参数
    cv::Size winSize(5, 5);
    cv::Size zeroZone(-1, -1);
    cv::TermCriteria criteria(cv::TermCriteria::EPS | cv::TermCriteria::COUNT, 30, 0.01);

    // 亚像素精确化
    cv::cornerSubPix(image, corners, winSize, zeroZone, criteria);

    // 在图像上绘制角点
    for (const auto& corner : corners) {
        cv::circle(image, corner, 3, cv::Scalar(255, 0, 0), -1);
    }

    // 显示结果
    cv::imshow("Corners", image);
    cv::waitKey(0);

    return 0;
}

输出

在上述代码中,检测到的角点会被绘制在图像上,显示为红色小圆点。

注意事项

  • 确保输入图像是灰度图像,以便正确进行角点检测。
  • 调整窗口大小 winSize 和终止条件 criteria 可以提高亚像素精确化的效果。
  • cornerSubPix 通常在进行特征匹配或网格检测时使用,以精确确定特征点的位置。

总结

cornerSubPix 是一个强大的工具,可以显著提高角点的检测精度,适合在计算机视觉应用中进行特征提取和分析。

在 OpenCV 中,criteria 是一个控制迭代算法终止条件的参数,通常用于函数如 cornerSubPix 和其他需要迭代优化的算法。它定义了算法何时停止迭代,确保在达到所需精度或执行一定次数后结束计算。

TermCriteria 结构

TermCriteria 结构的定义如下:

class cv::TermCriteria {
public:
    TermCriteria(int type, int maxCount, double epsilon);
    
    int type;      // 终止条件类型
    int maxCount;  // 最大迭代次数
    double epsilon; // 精度要求
};

参数说明

  1. type:

    • 这个参数指定了终止条件的类型,可以是以下几种组合:
      • cv::TermCriteria::COUNT: 表示算法会在达到最大迭代次数后停止。
      • cv::TermCriteria::EPS: 表示算法会在结果的变化小于 epsilon 时停止。
      • cv::TermCriteria::COUNT | cv::TermCriteria::EPS: 表示两者同时生效。
  2. maxCount:

    • 最大迭代次数。如果算法在达到此次数之前没有满足终止条件,则会强制停止。
  3. epsilon:

    • 精度要求,表示结果的变化阈值。当算法的结果变化小于此值时,会停止迭代。

示例

以下是如何设置和使用 TermCriteria 的示例:

cv::TermCriteria criteria(cv::TermCriteria::EPS | cv::TermCriteria::COUNT, 30, 0.01);

在这个示例中:

  • cv::TermCriteria::EPS | cv::TermCriteria::COUNT: 表示终止条件同时依赖于变化小于 epsilon 和达到最大迭代次数。
  • 30: 最大迭代次数为 30。
  • 0.01: 结果变化小于 0.01 时停止。

总结

criteria 是控制迭代算法何时终止的重要参数。通过合理设置这些条件,可以在保持结果精度的同时,避免不必要的计算,从而提高算法的效率。

posted @   aisuanfa  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示