OpenCV相机内在矩阵到Ogre投影矩阵,用于增强现实

时间:2012-06-11 17:03:18

标签: c++ opencv camera augmented-reality ogre

我使用 Ogre + OpenCV 编写了一个简单的增强现实应用程序。一切正常,但我需要将Ogre的虚拟相机与我的真实相机相匹配

我不知道相机参数(这是一个廉价的网络摄像头,供应商不提供它们)。我可以使用cvCalibrateCamera2(在here之后的cvFindChessboardCorners之后)获取内在相机,并使用cvSave保存它们。

cvCalibrateCamera2(objectPoints_, imagePoints_, pointCounts_,
        imageSize, cameraMatrix, distortionCoeffs_, NULL,
        NULL, CV_CALIB_FIX_ASPECT_RATIO );
cvSave(INTRINSIC_XML, intrinsicMatrix_);

AR应用程序加载内在矩阵:

CvMat* intrinsic = (CvMat*) cvLoad(INTRINSIC_XML);

所以intrinsic->data.db是指向9长度数组double(3x3矩阵)的指针 如何将其翻译为Ogre::Matrix4,我可以将其与setCustomProjectionMatrix一起使用。

我在Ogre's Forum找到了一些东西,但这不起作用。我想在OpenCV找到的3x3矩阵和Ogre::Camera所需的4x4矩阵之间需要一些其他步骤。

我希望通过cvCalibrateCamera2给出的内在函数有一些方法可以做到这一点。如果没有,我需要拿一把尺子和一个量角器并手工获取参数(大致)。

这是3x3“内在函数”矩阵:

836.391     0.000   460.430 
  0.000   836.391   281.440
  0.000     0.000     1.000

1 个答案:

答案 0 :(得分:2)

按如下方式创建投影矩阵。

mat [0,0] = fx

mat [1,1] = fy

mat [2,2] = + - .01

mat [3,2] = + - 1

mat [3,3] = 0

,其中 fx = intrinsic [0] / imageSize.Width;

fy = intrinsic [1 * 3 + 1] / imageSize.Height;

尝试mat [2,2]和mat [3,2]的负值和正值的组合。

通常两者都有负值。 其他参数可以忽略