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
是控制迭代算法何时终止的重要参数。通过合理设置这些条件,可以在保持结果精度的同时,避免不必要的计算,从而提高算法的效率。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?