Ios 通过CATTransferM3D将单应性(OpenCV)应用于CALayer

Ios 通过CATTransferM3D将单应性(OpenCV)应用于CALayer,ios,opencv,Ios,Opencv,我在iPhone上玩AR,我在将单应性应用于CALayer时遇到了一个问题,我无法解决这个问题。所以我请求你的帮助 应用程序 只支持方向的景观权 从iPhone摄像头接收640x480帧流 使用OpenCV函数处理每个帧: 试图找到将目标图像映射到从相机接收的帧上的单应性 第一幅图显示计算的单应性是正确的:彩色目标图像精确地放置在帧中包含的相应灰度图像的顶部。灰度帧对应于从照相机接收的经处理的RGB照相机帧。见截图 作为第二步,我尝试在识别的目标图像上覆盖一部电影。我添加了一个MPMovi

我在iPhone上玩AR,我在将单应性应用于CALayer时遇到了一个问题,我无法解决这个问题。所以我请求你的帮助

应用程序

  • 只支持方向的景观权
  • 从iPhone摄像头接收640x480帧流
  • 使用OpenCV函数处理每个帧:
  • 试图找到将目标图像映射到从相机接收的帧上的单应性
第一幅图显示计算的单应性是正确的:彩色目标图像精确地放置在帧中包含的相应灰度图像的顶部。灰度帧对应于从照相机接收的经处理的RGB照相机帧。见截图

作为第二步,我尝试在识别的目标图像上覆盖一部电影。我添加了一个
MPMoviePlayerController
,然后将计算出的单应性
F
转换为4x4 CATTransferM3D矩阵
ttt

矩阵
ttt
的值按以下方式设置(
F
具有行主顺序,ttt需要为列主顺序):

电影尺寸为480x270

可能存在与纵横比相关的问题,但在阅读了大量文档后,我没有其他想法进行测试。所以我希望有人能帮助我

 CATransform3D ttt;
 ttt.m11 = (CGFloat) F.at<double>(0,0);
 ttt.m12 = (CGFloat) F.at<double>(1,0);
 ttt.m13 = (CGFloat) 0;
 ttt.m14 = (CGFloat) F.at<double>(2,0);

 ttt.m21 = (CGFloat) F.at<double>(0,1);
 ttt.m22 = (CGFloat) F.at<double>(1,1);
 ttt.m23 = (CGFloat) 0;
 ttt.m24 = (CGFloat) F.at<double>(2,1);

 ttt.m31 = (CGFloat) 0;
 ttt.m32 = (CGFloat) 0;
 ttt.m33 = (CGFloat) 1;
 ttt.m34 = (CGFloat) 0;

 ttt.m41 = (CGFloat) F.at<double>(0,2); 
 ttt.m42 = (CGFloat) F.at<double>(1,2);
 ttt.m43 = (CGFloat) 0;
 ttt.m44 = (CGFloat) F.at<double>(2,2);
    [moviePlayer.view.layer setFrame:CGRectMake(0, 0, 640, 480)];
    [moviePlayer setScalingMode:MPMovieScalingModeFill];

    [moviePlayer.view.layer setBounds:CGRectMake(0, 0, 640, 480)];

    [moviePlayer.view.layer setAnchorPoint:CGPointMake(0, 0)];

    CGFloat borderW = 4.0;
    moviePlayer.view.layer.borderWidth = borderW;
    CGColorRef borderColor = [UIColor redColor].CGColor;
    moviePlayer.view.layer.borderColor = borderColor;