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号