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

已知位置的ARuco标记:

ARuco pattern

纵向模式下的检测有效:

Portrait markers

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

Landscape markers

详细说明我在做什么:

  • 对于每个 ARFrame 执行以下操作:

  • 获取CVPixelBuffer height, width, baseaddress 并转换为 cv::Mat

  • 使用 ARFrame 中的内在运行标记检测和姿势估计( cv::aruco::detectMarkerscv::aruco::estimatePoseSingleMarkers ) .

  • 内在需要转换为ARKit column-major到OpenCV行主矩阵存储 .

  • OpenCV rvectvec 使用 cv::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解决(Radar上的错误ID 33519315) .

更新于2014年9月14日:

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