摄像机校准OpenCV

时间:2014-08-29 17:30:39

标签: java opencv camera-calibration

我最近是OpenCV的新手,我一直在努力校准我的相机。经过几天的研究,我对它有了基本的了解。但我仍然无法理解一些基本观点。

1)对象点Matrix的初始化,为什么要在0,0

中初始化这个矩阵
Mat a = new MatOfPoint3f();
        for(int y=0; y<SIZE_Y; ++y) 
        {
            for(int x=0; x<SIZE_X; ++x)
            {
                points = new MatOfPoint3f(new Point3(x*distance_Board , y*distance_Board , 0));
                a.push_back(points);
            }
        }

在电路板处于3D世界的位置初始化它会更有意义吗

Mat a = new MatOfPoint3f();
        for(int y=1; y<=SIZE_Y; ++y) 
        {
            for(int x=1; x<=SIZE_X; ++x)
            {
                points = new MatOfPoint3f(new Point3(x*distance_Board + FirstPoint.x, y*distance_Board + FirstPoint.y, 0));
                a.push_back(points);
            }
        }

2)

我尝试使用

校准我的相机
         Calib3d.calibrateCamera(object_points, corners, gray.size(), cameraMatrix, distCoeffs, rvecs, tvecs);

我尝试了超过15张图片,但结果仍然很差,因为我不了解为图像设置rvec和tvec的重要性(我理解逻辑,因为对于每个点旋转和翻译是不同的)但它如何帮助我们与其他点/其他图像。我认为校准为我们提供了一个很好的方法,可以将3d点转换成整个场景中的2d点。

这就是我跑步的原因

        Calib3d.projectPoints(objectPoints, rvecs.get(i), tvecs.get(i), cameraMatrix, distCoeffs, imagePoints);

我真的不知道选择哪种rvecs和tvecs

3)

是否有从2D(imagePoints)转换为3D(真实世界)的方法。我试过了 this但由于校准参数不正确,结果不正确

4)

我也尝试过从2D到3D的翻译,如下所示

x ̃  =  x * ( 1 +  k1 * r^2 + k2 * r^4 ) + [ 2 p1 * x * y + p2 * ( r^2 + 2 * x^2 ) ] 

y ̃  =  y * ( 1 +  k1 * r^2 + k2 * r^4 ] + [ 2 p2 * x * y + p2 * ( r^2 + 2 * y^2 ) ],

a)但是什么是r? r = sqrt(x ^ 2 + y ^ 2)?并且x =(x坐标像素) - (相机中心像素)?

b)摄像机中心是否为像素= cx =摄像机矩阵的参数?

c)x坐标像素= u = imagepoint?

网上有很多信息,但我没有找到100%可靠的来源

我的选项已经用完了,如果有人能给我一个很好的解释相机校准或指向正确的方向(论文等),我真的会感到沮丧。

提前谢谢

2 个答案:

答案 0 :(得分:1)

你有没有想过为什么你有两只眼睛?在最原始的意义上,这是因为只有双眼我们才能知道物体的距离或距离。在一些需要恢复3D信息的应用中,它是通过使用两个相机制作的,这称为立体视觉(http://en.wikipedia.org/wiki/Stereoscopy)。如果您尝试使用单个相机描绘3D信息,则只能得到较差的近似值,在这种情况下,它需要一个称为单应性(http://en.wikipedia.org/wiki/Homography)的变换,最后才能尝试对透视进行建模(或者物体的距离或近处)。 在大多数情况下,当我们想要校准单个相机时,我们会尝试去除相机镜头产生的径向扭曲(http://en.wikipedia.org/wiki/Distortion_%28optics%29)。 Opencv为您提供了执行此过程的工具,在大多数情况下,它需要一个Chess板来帮助完成此过程,您可以查看:http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html,尽管更具体,但函数cvFindChessboardCorners。我希望这对你有用,对不起英语,不是母语人士。

答案 1 :(得分:0)

我不知道您是否已经使用opnecv校准解决了问题,但无论如何我会给你一些提示。首先,我建议你阅读有关校准的张论文(http://research.microsoft.com/en-us/um/people/zhang/Papers/TR98-71.pdf)。 Opencv方法基于Zhang的工作,因此理解它是一个真正的优先事项。 校准相机意味着确定相机2D坐标系(以像素为单位,相机图像的左上角的原点)与外部世界的3D坐标系(例如,以米为单位)之间的关系。当您将已知的平面校准对象放置在摄像机前时,系统应计算knonw 3D对象与2D图像之间的均匀变换(即“rvecs.get(i),tvecs.get(i) “你在谈论。 图像坐标始终为像素,内在校准矩阵也以像素表示。 您无法从2D图像坐标“平移”到3D世界坐标,但您可以计算正确的变换:它由内部校准矩阵和旋转平移矩阵组成。另请参阅本文http://research.microsoft.com/en-us/um/people/zhang/Papers/Camera%20Calibration%20-%20book%20chapter.pdf 希望这有帮助!