OpenCV(cv::cornerSubPix())
cv::cornerSubPix()
是 OpenCV 中的一个函数,用于在亚像素精度下优化图像中的角点检测结果。它在角点检测中是一个后处理步骤,常与 cv::goodFeaturesToTrack()
或 cv::findChessboardCorners()
等角点检测函数一起使用,以提高角点的精度。
1. 函数定义
void cv::cornerSubPix(
InputArray image,
InputOutputArray corners,
Size winSize,
Size zeroZone,
TermCriteria criteria
)
参数:
-
image
:- 输入图像,通常为单通道的灰度图像 (
CV_8UC1
)。 - 这是角点检测的输入图像,
cv::cornerSubPix()
会在这个图像上进一步优化角点的位置。
- 输入图像,通常为单通道的灰度图像 (
-
corners
:- 输入输出参数,表示角点的位置。
- 初始时,它应该包含角点的初始位置(例如由
cv::goodFeaturesToTrack()
或cv::findChessboardCorners()
计算得到)。函数将基于这些初始位置来精确化角点坐标,优化后的坐标会在这个参数中输出,且为浮点精度(亚像素级别)。
-
winSize
:- 搜索窗口的半大小,设定为
(wx, wy)
,意味着搜索窗口的大小为(2 * wx + 1, 2 * wy + 1)
。 - 此窗口定义了角点精确化时考虑的区域范围。窗口越大,可能得到更准确的结果,但计算成本也会增加。
- 搜索窗口的半大小,设定为
-
zeroZone
:- 定义一个“零区”,即在计算过程中忽略中心窗口的区域。该区域可以用
(x, y)
表示。 - 如果将此值设为
(-1, -1)
,则不会忽略任何区域。在某些情况下,忽略中心区域可以提高计算的鲁棒性(例如角点检测结果周围有噪声时)。
- 定义一个“零区”,即在计算过程中忽略中心窗口的区域。该区域可以用
-
criteria
:- 终止条件,可以是迭代次数、精度或两者结合。该参数定义了优化过程何时停止。
- 它是一个
cv::TermCriteria
类型的对象,通常使用TermCriteria::MAX_ITER | TermCriteria::EPS
来设定最大迭代次数和精度阈值。
返回值:
该函数没有返回值。优化后的角点位置会直接修改传入的 corners
参数。
2. 工作原理
cv::cornerSubPix()
基于输入图像的梯度信息,在指定窗口范围内迭代更新初始角点的位置,从而精确化角点的坐标。它使用二次插值方法来提高检测精度,使角点坐标达到亚像素级别的精度。
3. 典型应用场景
-
棋盘角点检测:
棋盘角点常用于相机标定。在使用cv::findChessboardCorners()
检测到角点后,通过cv::cornerSubPix()
可以提高角点检测的精度,提升标定的准确性。 -
特征点提取:
在进行计算机视觉任务(如图像拼接、运动估计等)时,通常需要高精度的特征点坐标,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()
是一个强大的角点精确化工具,能够通过迭代优化方法将角点检测的精度提升到亚像素级别。这对于需要高精度角点信息的计算机视觉任务非常有用,例如相机标定、图像拼接和运动跟踪等。
分类:
图像算法 / OpenCV
标签:
图像算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需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__()