我正在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图形和变换数学,但这是一项相当艰巨的任务。
4x4矩阵与3x3矩阵的正确映射是什么?
谢谢!
答案 0 :(得分:2)
可能存在不同的问题:
首先,您应该尝试矩阵的逆矩阵(如果您获得的变换实际上是从目标到源)。使用mat.inv(),或将发送的参数交换到getPerspectiveMatrix。
如果它无法解决您的问题,您必须将3x3矩阵分解为旋转和平移并将其组合以形成4x4矩阵。近似解决方案是删除最后一行和第三列(对应于3D旋转) - 但这只是粗略的近似。
请查看关于创建透视变换矩阵的这篇非常好的文章 Opencv virtually camera rotating/translating for bird's eye view