2014-08-29 165 views
0

我最近在OpenCV中是新手,我一直在努力校准我的摄像机。经过几天的研究,我对它有了一个基本的了解。但我仍然不明白一些基本观点。摄像机校准OpenCV

1)objectpoint矩阵的初始化,我们为什么初始化这个矩阵中的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)

我试图使用校准

我的相机

我试过超过15张图片,但结果仍然很差,因为我不明白有一个rvec和tvec为非常形象的意义(我理解逻辑,因为每一个点的旋转和翻译是不同的),但它如何帮助我们与其他点/其他图像。我认为校准为我们提供了一个公平的好方法,在整个场景转换的三维点到二维点..

这就是为什么当我运行

 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) ], 

一)但是,什么是R' r = sqrt(x^2 + y^2)?和x =(x坐标像素) - (以像素为单位的相机中心)?

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

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

有大量的信息在网上,但我还没有找到一个100%可靠的来源

我已经走投无路,我真的apreciate如果有人可以给我的相机校准或点的一个很好的解释我走向正确的方向(论文等)。

预先感谢您

回答

0

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

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。我希望这可能对你有用,对于英语不会说母语,对不起。