在OpenCV CameraCalibration函数中计算对象点

Zhr*_*aie 8 c++ opencv camera-calibration

我想使用opencv Cameracalibration功能(calibrateCamera())来校准我的相机.
根据opencv文件,我必须拍摄至少10张我的棋盘.
但是当我想计算objectPoints(这里,棋盘内点的位置)时,我感到困惑:

如果原产地是相机和棋盘移动,很容易让我理解这个概念的理论基础,但难以计算的objectPoints.
第二个方法是修复棋盘,并在此解决方案移动camera.But,我不明白如何在计算中应用相机的距离objectPoints或以任何其他方式对opencv相机校准功能进行测量,这种方式会改变距离和方向.

如果你能帮助我解决我的问题,我将不胜感激.

BCo*_*nic 9

您提到的第二种方法是最受欢迎的,因为它非常易于使用.

假设您有以下(9,6)棋盘,其中正方形的长度为a:

opencv校准棋盘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);
Run Code Online (Sandbox Code Playgroud)

基本上,由于您可以根据需要选择3D坐标系,因此您可以选择使用棋盘坐标系,这使得对象点很容易定义.然后,该calibrateCamera函数将负责估计每个图像的一个R,t(相对于所选择的坐标系的相对方向和平移),以及对于所有图像共同的一个内在矩阵K和失真系数D.

另外,请注意对2D点使用相同的顺序.