我想使用 opencv Cameracalibration 函数 (calibrateCamera()
) 来校准我的相机。
根据opencv document , 我的棋盘至少要拍 10 张。
但是当我想计算 objectPoints
(这里是棋盘内部点的位置)时,我感到困惑:
如果原点是相机并且棋盘在移动,我很容易理解这个概念的理论基础,但很难计算objectPoints
。
第二种方法是固定棋盘并移动相机。但在这个解决方案中,我不明白如何在计算 objectPoints
或任何其他方式时应用相机与棋盘的距离对 opencv 相机校准函数说,这种距离和方向的变化。
如果你能帮助我解决我的问题,我将不胜感激。
最佳答案
您提到的第二种方法最受欢迎,因为它非常易于使用。
假设您有以下 (9,6)
棋盘,其中正方形的边长为 a
:
(来源:opencv.org)
然后,您只需按如下方式定义对象点:
// 3D coordinates of chessboard points
std::vector<cv::Point3f> objectPoints;
for(int y=0; y<6; ++y) {
for(int x=0; x<9; ++x)
objectPoints.push_back(cv::Point3f(x*a,y*a,0));
}
// One vector of chessboard points for each chessboard image
std::vector<std::vector<cv::Point3f>> arrayObjectPoints;
for(int n=0; n<number_images; ++n)
arrayObjectPoints.push_back(objectPoints);
基本上,由于您可以随意选择3D坐标系,因此您可以选择使用棋盘坐标系,这使得对象点非常容易定义。然后,calibrateCamera
函数将负责为每个图像估计一个 R,t(相对于所选坐标系的相对方向和平移),以及一个内在矩阵 K 和畸变系数 D,这些矩阵对所有图像都是通用的图片。
另外,注意对 2D 点使用相同的顺序。
关于c++ - 在 OpenCV CameraCalibration 函数中计算对象点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22338728/