OpenCV相机内参矩阵转换为Ogre投影矩阵用于增强现实。

3
我使用Ogre + OpenCV编写了一个简单的增强现实应用程序。一切正常,但我需要将Ogre的虚拟摄像头与我的真实摄像头匹配。
我不知道摄像头参数(它是一款廉价的网络摄像头,供应商没有提供)。我可以使用cvCalibrateCamera2(在执行了一些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的双精度数组的指针(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

你可以输入相机矩阵的实际值吗? - Sumeet Jindal
@SumeetJindal 我已经编辑了问题,添加了内置函数。 - Alessandro Pezzato
1个回答

2
创建投影矩阵的方法如下:
mat[0,0] = fx
mat[1,1] = fy
mat[2,2] = +- .01
mat[3,2] = +- 1
mat[3,3] = 0
其中,
fx = 内参 [0] / 图像尺寸.宽度;
fy = 内参 [1*3 + 1] / 图像尺寸.高度;
请尝试对 mat[2,2] 和 mat[3,2] 进行正负值组合。
通常两者都为负值。其他参数可以忽略。

请问,您能解释一下吗?mat[2,2]与近/远裁剪距离有关吗? - Alessandro Pezzato
是的,Z = mat[3,2] * ZObject + mat[3,3]。near = (0 - mat[3,3])/mat[3,2]。 - Sumeet Jindal
Nearplane 是指在 ZProjected 变为 0 的 Z 值,而 far plane 则是指在 ZProjected 变为 1 的 Z 值。 - Sumeet Jindal
你需要将所有其他矩阵元素设为零。无需执行getProjectionMatrix操作。先尝试在原点渲染一些物体。 - Sumeet Jindal
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接