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

Opencv 如何将4x4矩阵转换为3x3矩阵?,opencv,matrix,catransform3d,Opencv,Matrix,Catransform3d,我正在iOS上编写AR应用程序,并在UIView上使用CATTransform3D转换 通过OpenCV,我可以通过调用cvGetPerspectiveTransform()获得透视矩阵。这将返回一个3x3矩阵 我不记得是在哪里找到的,但我有一个示例代码,可以执行以下操作: //the opencv transform matrix is put into map_matrix cvGetPerspectiveTransform (src_pnt, dst_pnt, map_matrix);

我正在iOS上编写AR应用程序,并在UIView上使用CATTransform3D转换

通过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图形和变换数学,但这是一项相当艰巨的任务

4x4矩阵与3x3矩阵的正确映射是什么


谢谢大家!

可能存在不同的问题:

首先,您应该尝试矩阵的逆运算(如果您得到的变换实际上是从目标到源的)。使用mat.inv(),或交换发送到getPerspectiveMatrix的参数

如果它不能解决您的问题,您必须将3x3矩阵分解为旋转和平移,并将其组合成4x4矩阵。近似的解决方案是删除最后一行和第三列(对应于三维旋转),但这只是一个粗略的近似

请检查这篇关于创建透视变换矩阵的好文章