我想使用opencv Cameracalibration功能(calibrateCamera()
)来校准我的相机
根据{{3}},我必须拍摄至少10张我的棋盘
但是当我想计算objectPoints
(这里,棋盘内点的位置)时,我感到困惑:
如果原点是相机并且棋盘正在移动,我很容易理解概念的理论基础但很难计算objectPoints
。
第二种方法是固定棋盘并移动相机。但是在这个解决方案中,我不知道如何在计算objectPoints
或任何其他方式时应用棋盘中的相机距离opencv摄像机校准功能,这种距离和方向的变化。
如果你能帮我解决问题,我将不胜感激。
答案 0 :(得分:8)
您提到的第二种方法是最受欢迎的,因为它非常易于使用。
我们假设您有以下(9,6)
棋盘,其中正方形的边长a
:
opencv calibration chessboard http://docs.opencv.org/_images/fileListImage.jpg
然后,您只需按如下方式定义对象点:
// 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. / p>
另外,请注意对2D点使用相同的顺序。