如何将一个4x4矩阵转换为一个3x3矩阵?

3
我正在iOS上编写一个AR应用程序,并在UIView上使用CATransform3D变换。
通过OpenCV,我可以通过调用cvGetPerspectiveTransform()获取透视矩阵。这将返回一个3x3矩阵。
我记不清我在哪里找到它了,但我有一些示例代码执行以下操作:
//the opencv transform matrix is put into map_matrix
cvGetPerspectiveTransform (src_pnt, dst_pnt, map_matrix);

CATransform3D t = CATransform3DIdentity;

// map over the CATransform3D 4x4 matrix from the opencv 3x3 matrix
t.m11 = cvmGet(map_matrix,0,0); 
t.m12 = cvmGet(map_matrix,1,0); 
t.m14 = cvmGet(map_matrix,2,0); 
t.m21 = cvmGet(map_matrix,0,1); 
t.m22 = cvmGet(map_matrix,1,1); 
t.m24 = cvmGet(map_matrix,2,1); 
t.m41 = cvmGet(map_matrix,0,2); 
t.m42 = cvmGet(map_matrix,1,2); 
t.m44 = cvmGet(map_matrix,2,2); 

myView.layer.transform = t;

然而,应用这种形式会导致我的视图疯狂地跳来跳去。经过一些试验,我发现只有这三个映射有点作用:

t.m14 = cvmGet(map_matrix,2,0); //left and right transform
t.m24 = cvmGet(map_matrix,2,1); //up and down transform
t.m21 = cvmGet(map_matrix,0,1); //some kind of skew?

我一直在学习3D图形和变换数学,但这是一个相当令人望而生畏的任务。
从3x3矩阵到4x4矩阵的正确映射是什么?
谢谢!
1个回答

2
可能会出现不同的问题:
首先,您应该尝试矩阵的逆(以防您获得的变换实际上是从目标到源的)。使用mat.inv(),或交换发送到getPerspectiveMatrix的参数。
如果这不能解决您的问题,您必须将3x3矩阵分解为旋转和平移,并将它们组合成4x4矩阵。一个近似的解决方案是删除最后一行和第三列(对应于3D旋转)-但这只是一个粗略的近似。
请还要查看这篇非常好的帖子,关于创建透视变换矩阵 Opencv virtually camera rotating/translating for bird's eye view

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