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

时间:2017-07-23 16:38:01

标签: ios opencv augmented-reality arkit

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

已知位置的ARuco标记:

ARuco pattern

纵向模式下的检测有效:

Portrait markers

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

Landscape markers

详细说明我在做什么:

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

我的问题:

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

更新25.07.2017:

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

更新14.09.2017:

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

0 个答案:

没有答案