ios - 将OpenCV的findHomography透视矩阵转换为iOS的CATransform3D

标签 ios opencv matrix perspective catransform3d

我想采用从 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;
};

类似问题:

Apply homography matrix using Core Graphics

convert an opencv affine matrix to CGAffineTransform

最佳答案

免责声明

我从来没有尝试过这个,所以对它持保留态度。

CATransform3D 是一个 4x4 矩阵,它对 3 维齐次向量 (4x1) 进行运算以生成另一个相同类型的向量。我假设在渲染时,由 4x1 向量描述的对象将每个元素除以第 4 个元素,而第 3 个元素仅用于确定哪些对象出现在哪些对象之上。假设这是正确的...

推理

findHomography 返回的 3x3 矩阵对二维齐次向量进行运算。该过程可以分为 4 个步骤

  1. 单应性的第一列乘以x
  2. 单应性的第二列乘以y
  3. 单应性第三列乘以1
  4. 生成的第一个和第二个向量元素除以第三个

您需要在 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/

相关文章:

python - 从 3D numpy 数组中删除索引

r - 为什么这段代码要双重转置一个向量——这是一个空操作吗?

matlab - 确保矩阵是对称的(并且是正半定的)

ios - TableView 单元格高度自动调整为屏幕大小

ios - 贴纸包中缺少应用程序图标,但我已设置所有图标

ios - 在 iOS 中获取或模拟 GL_PACK_ROW_LENGTH 和 GL_UNPACK_ROW_LENGTH

python-2.7 - 置换矩阵的行和列

ios - 从 Paypal MPL 到 PaypalMobile iOS SDK 的迁移问题

python - 执行图像配准时图像之间的匹配不当

OpenCV cvMatchTemplate 相同的图像大小