在 OpenCV 中,undistortPoints
函数用于将畸变的图像点转换为未畸变的点。这个函数特别有用在相机标定后,校正图像中的点以消除镜头畸变。
函数原型
void cv::undistortPoints(InputArray src, OutputArray dst, InputArray cameraMatrix, InputArray distCoeffs, InputArray R = noArray(), InputArray P = noArray()
);
参数说明
- src: 输入的畸变点,通常是一个 (N \times 1 \times 2) 或 (N \times 2) 的矩阵,表示图像中的点。
- dst: 输出的未畸变点,格式与
src
相同。 - cameraMatrix: 相机内参矩阵,包含焦距和主点坐标。
- distCoeffs: 畸变系数,包括径向和切向畸变系数。
- R: 可选参数,表示旋转矩阵。如果没有提供,默认为单位矩阵。
- P: 可选参数,表示新的相机内参矩阵。如果没有提供,默认为与
cameraMatrix
相同的矩阵。
示例代码
以下是一个使用 undistortPoints
的示例:
#include <opencv2/opencv.hpp>
#include <vector>int main() {// 相机内参矩阵cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << 1000, 0, 320,0, 1000, 240,0, 0, 1);// 畸变系数cv::Mat distCoeffs = (cv::Mat_<double>(5, 1) << 0.1, -0.05, 0, 0, 0);// 输入的畸变点std::vector<cv::Point2f> distortedPoints = { {100, 100}, {150, 150}, {200, 200} };// 输出的未畸变点std::vector<cv::Point2f> undistortedPoints;// 使用 undistortPoints 函数cv::undistortPoints(distortedPoints, undistortedPoints, cameraMatrix, distCoeffs);// 打印未畸变的点for (const auto& point : undistortedPoints) {std::cout << "Undistorted Point: (" << point.x << ", " << point.y << ")\n";}return 0;
}
代码解析
- 相机内参和畸变系数: 定义相机的内参矩阵和畸变系数。
- 输入和输出点: 创建一个包含畸变点的向量,并定义一个空的向量来存储未畸变的结果。
- 调用
undistortPoints
: 使用该函数将畸变点转换为未畸变点。 - 输出结果: 打印未畸变后的点。
注意事项
undistortPoints
函数假设输入点是以归一化坐标表示的(即相对于相机主点的坐标),如果你提供的是图像像素坐标,你可能需要先将其转换为归一化坐标。- 如果你想生成新的图像,可以使用
cv::undistort
函数,它将整个图像进行畸变校正。
总结
undistortPoints
是一个强大的工具,用于消除图像点的畸变,常用于相机标定和图像处理任务中。通过正确使用内参和畸变系数,可以有效地校正图像数据。