我正在使用OpenCV(使用ARuco)实现ARKit的标记跟踪,并在进行相机的纵向定位时看到良好的效果,但在做横向时略微偏移 .
已知位置的ARuco标记:
纵向模式下的检测有效:
在横向方向,检测显示偏移:
详细说明我在做什么:
-
对于每个
ARFrame
执行以下操作: -
获取CVPixelBuffer
height, width, baseaddress
并转换为cv::Mat
-
使用
ARFrame
中的内在运行标记检测和姿势估计(cv::aruco::detectMarkers
,cv::aruco::estimatePoseSingleMarkers
) . -
内在需要转换为ARKit column-major到OpenCV行主矩阵存储 .
-
OpenCV
rvec
和tvec
使用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之间的问题 .