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; // 精度要求
};
参数说明
- 
type:- 这个参数指定了终止条件的类型,可以是以下几种组合:
- cv::TermCriteria::COUNT: 表示算法会在达到最大迭代次数后停止。
- cv::TermCriteria::EPS: 表示算法会在结果的变化小于- epsilon时停止。
- cv::TermCriteria::COUNT | cv::TermCriteria::EPS: 表示两者同时生效。
 
 
- 这个参数指定了终止条件的类型,可以是以下几种组合:
- 
maxCount:- 最大迭代次数。如果算法在达到此次数之前没有满足终止条件,则会强制停止。
 
- 
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 是控制迭代算法何时终止的重要参数。通过合理设置这些条件,可以在保持结果精度的同时,避免不必要的计算,从而提高算法的效率。
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号