【问题标题】:Camera Calibration OpenCV相机校准 OpenCV
【发布时间】:2014-10-23 18:19:56
【问题描述】:

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

1)objectpoint 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(real World)。我试过了 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坐标pixel = u = imagepoint?

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

我已经没有什么选择了,如果有人能给我一个关于相机校准的很好的解释或指出我正确的方向(论文等),我真的很感激。

提前谢谢你

【问题讨论】:

    标签: java opencv camera-calibration


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我不知道您是否已经解决了 opnecv 校准的问题,但无论如何我会给您一些提示。首先我建议你阅读张关于校准的论文(http://research.microsoft.com/en-us/um/people/zhang/Papers/TR98-71.pdf)。 Opencv 方法基于 Zhang 的工作,因此理解它是一个真正的优先事项。 校准相机意味着确定相机 2D 坐标系(以像素为单位,以相机图像的左上角为原点)与外部世界的 3D 坐标系(例如以米为单位)之间的关系。当您将已知平面校准对象放置在相机前面时,系统应计算已知 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 希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2013-01-28
        • 1970-01-01
        • 2012-04-18
        • 2016-12-29
        • 2011-08-03
        • 2014-06-19
        • 2013-02-24
        • 2019-01-05
        • 1970-01-01
        相关资源
        最近更新 更多