opencv - 将 opencv 仿射矩阵转换为 CGAffineTransform

标签 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 时,它至少朝正确的方向旋转。只是看起来有点偏离,因为旋转得有点太远了。

最佳答案

你的问题是 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]

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

关于opencv - 将 opencv 仿射矩阵转换为 CGAffineTransform,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14387806/

相关文章:

c - 如何在C中对矩阵乘法进行计时?

c++ - 试图使矩阵类工作

ios - 如何获取在CGPath的CGContextSetLineDash之后创建的每个虚线的最后一点

python - 使用Python/OpenCV将mp4视频的长度加倍?

c++ - OpenCV 功能检测和匹配 - 绘图匹配段错误

javascript - 在html5 Canvas 上用图像绘制矩阵并检测特定颜色

IOS 如何用省略号截断段落的最后可见行?

opencv - OpenCV cv::resize()可以更改图像的最小值和最大值吗? (使用INTER_LINEAR方法)

python - Opencv:错误:(-210)在函数阈值中

ios - 如何在两个图像之间进行锯齿形图层分离