【问题标题】:convert an opencv affine matrix to CGAffineTransform将opencv仿射矩阵转换为CGAffineTransform
【发布时间】:2013-01-18 08:16:07
【问题描述】:

我想从 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 时,它至少朝正确的方向旋转。它看起来有点不对劲,因为旋转得有点过头了。

【问题讨论】:

  • 我很惊讶切换bc 不起作用,因为这会导致正确的旋转。您发布的代码当前构造了不正确的旋转。
  • 是的,我试过 t.b = T.at&lt;float&gt;(1,0)t.c = T.at&lt;float&gt;(0,1) 但没有运气。我认为这可能与起源有关。

标签: opencv matrix core-graphics transformation cgaffinetransform


【解决方案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]

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

【讨论】:

  • 好的,谢谢,我会尝试用图片等更详细地更新。
  • 知道了!它是交换 b 和 c 的组合,需要将图层的 anchorPoint 设置为 0,0,然后平移图像宽度 -1/2,图像高度 -1/2。谢谢。
  • @taber:第一部分——b 和 c 被交换——是你得到倾斜行为的原因。您可以通过手动交换 my affine transform test app 中的数字来亲眼看到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多