ARKit肖像和风景之间的内在差异?

Chr*_*bek 8 opencv augmented-reality ios arkit

我正在使用OpenCV(使用ARuco)实现ARKit的标记跟踪,并在进行相机的纵向定位时看到良好的效果,但在做横向时略微偏移.

已知位置的ARuco标记:

ARu​​co模式

纵向模式下的检测有效:

肖像标记

在横向方向,检测显示偏移:

景观标记

详细说明我在做什么:

  • 每个人都ARFrame做以下事情:
  • 获取CVPixelBuffer height, width, baseaddress并转换为cv::Mat
  • 使用内在来运行标记检测和姿势估计(cv::aruco::detectMarkers,cv::aruco::estimatePoseSingleMarkers)ARFrame.
    • 内部需要将ARKit column-major转换为OpenCV行主矩阵存储.
    • OpenCV rvectvec使用转换为4x4变换cv::Rodrigues,然后从OpenCV转换为OpenGL坐标空间diag(1,-1,-1,1) * transform
    • 结果从row-major转换回column-major,并且是相机空间中标记的变换.
  • 将变换与ARCameras变换相乘得到世界坐标中的标记平面,我将其视为绿色矩形.

我的问题:

  • 我错过了什么吗?
  • 应该frame.displayTransform扮演转换的任何部分吗?
  • 旋转设备时为什么内在会发生变化?像素缓冲区的宽度和高度不会改变.
  • 还有其他想法吗?

更新25.07.2017:

  • 我想出来了!这是Apple的错误!他们弄乱了UIInterfaceOrientation.landscapeLeft和landscapeRight之间的内在函数.如果你缓存这些值并交换它们,那么一切都很好.
  • iOS 11 Beta 4不会改变任何东西
  • 我一直保持这个问题,直到它被Apple解决(雷达上的错误ID 33519315).

更新于2014年9月14日:

  • Apple关闭了这个bug,说一切都是正确的.我不确定它们是否正确,但可能它确实是OpenCV和ARKit之间的问题.