我想采用从 OpenCV 的 findHomography
返回的透视变换矩阵函数并将其(在 C++ 或 Objective-C 中)转换为 iOS 的 CATransform3D
。我希望它们在 Core Graphics 端准确再现“扭曲”效果方面尽可能接近。示例代码将不胜感激!
来自 iOS 的 CATransform3D.h:
/* Homogeneous three-dimensional transforms. */
struct CATransform3D
{
CGFloat m11, m12, m13, m14;
CGFloat m21, m22, m23, m24;
CGFloat m31, m32, m33, m34;
CGFloat m41, m42, m43, m44;
};
类似问题:
最佳答案
免责声明
我从来没有尝试过这个,所以对它持保留态度。
CATransform3D 是一个 4x4 矩阵,它对 3 维齐次向量 (4x1) 进行运算以生成另一个相同类型的向量。我假设在渲染时,由 4x1 向量描述的对象将每个元素除以第 4 个元素,而第 3 个元素仅用于确定哪些对象出现在哪些对象之上。假设这是正确的...
推理
findHomography 返回的 3x3 矩阵对二维齐次向量进行运算。该过程可以分为 4 个步骤
- 单应性的第一列乘以x
- 单应性的第二列乘以y
- 单应性第三列乘以1
- 生成的第一个和第二个向量元素除以第三个
您需要在 4x4 向量中复制此过程,我假设结果向量中的第 3 个元素对您的目的没有意义。
解决方案
像这样构造你的矩阵(H 是你的单应矩阵)
[H(0,0), H(0,1), 0, H(0,2),
H(1,0), H(1,1), 0, H(1,2),
0, 0, 1, 0
H(2,0), H(2,1), 0, H(2,2)]
这显然满足1,2和3。4满足,因为齐次元素总是最后一个。这就是为什么“同质行”如果你不得不被撞到一行。第3行的1是让向量的z分量不受干扰地通过。
以上所有内容都是在行主要符号(如 openCV)中完成的,以尽量避免混淆。您可以查看 Tommy 的回答,了解转换为专栏专业的方式(您基本上只是转置它)。但是请注意,目前汤米和我对如何构建矩阵存在分歧。
关于ios - 将OpenCV的findHomography透视矩阵转换为iOS的CATransform3D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14467724/