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

tab*_*ber 4 opencv matrix perspective catransform3d ios

我想从OpenCV findHomography函数返回透视变换矩阵并将其转换(在C++或Objective-C中)到iOS' CATransform3D.我希望它们尽可能地准确地再现核心图形方面的"扭曲"效果.示例代码真的很感激!

来自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;
};
Run Code Online (Sandbox Code Playgroud)

类似的问题:

使用Core Graphics应用单应矩阵

将opencv仿射矩阵转换为CGAffineTransform

Ham*_*mer 5

放弃

我从来没有试过这个,所以拿一粒盐.

CATRansform3D是一个4x4矩阵,它在3维均匀矢量(4x1)上运算,以产生相同类型的另一个矢量.我假设在渲染时,4x1向量描述的对象将每个元素除以第4个元素,而第3个元素仅用于确定哪些对象出现在其中.假设这是正确的......

推理

findHomography返回的3x3矩阵在2维均匀向量上运行.可以通过4个步骤来考虑该过程

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

您需要在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)]
Run Code Online (Sandbox Code Playgroud)

这显然满足1,2和3. 4因为均匀元素总是最后一个.这就是为什么"同质排",如果你不得不被撞到一行.第3行的1是让向量的z分量通过unmolested.

所有这些都是以行主要表示法(如openCV)完成的,以避免让人感到困惑.您可以查看Tommy的答案,了解转换为专业列的外观(基本上只是转置它).但请注意,目前Tommy和我不同意如何构建矩阵.