将opencv仿射矩阵转换为CGAffineTransform

时间:2013-01-17 20:46:19

标签: opencv matrix core-graphics transformation cgaffinetransform

我想从OpenCV中获取一个仿射矩阵:

Mat T = getAffineTransform(src_pt, dst_pt);

然后将其转换为CGAffineTransform,以便在Core Graphics / Objective-C / iOS中使用。 (CGAffineTransform docs

我试过了:

CGAffineTransform t = CGAffineTransformIdentity;
t.a = T.at<float>(0,0);
t.b = T.at<float>(0,1);
t.c = T.at<float>(1,0);
t.d = T.at<float>(1,1);
t.tx = T.at<float>(0,2);
t.ty = T.at<float>(1,2);

这适用于x和y平移,但是如果矩阵中有任何旋转则不行。似乎缺少某些东西,因为产生的图像看起来很奇怪。我尝试将.b.c乘以-1并切换.b.c,但这些似乎都不起作用。图像仍然不正确地倾斜。

编辑:我应该提一下,几乎正确旋转。当我切换b和c时,它至少向右旋转。它似乎有点偏离,就像旋转太远了一样。

1 个答案:

答案 0 :(得分:1)

你的问题是opencv是行主要而CGAffineTransform是你想要的专栏

t.a = T.at<float>(0,0);
t.b = T.at<float>(1,0);
t.c = T.at<float>(0,1);
t.d = T.at<float>(1,1);

你可以说,因为在文档中CGAffineTransform采用

形式
[a  b  0
 c  d  0
 tx ty 1]

请注意,tx和ty位于底行。在标准行主要矩阵中,转换组件位于最右边的列中

[a c tx
 b d ty
 0 0 1]

如果在进行此更改后问题仍然存在(您的问题表明您已尝试过),那么您需要发布更多信息。正如您所说,问题可能出在您的坐标系的原点,但没有任何关于您的起源的信息,没有人能够帮助您。