ARKit 透视校正

ARKit Perspective Correction

我正在使用 ARKit 进行一个项目,我正在尝试对 ARFrame.capturedImage 进行透视校正,以将一张纸放在检测到的平面上,以便我可以进纸将其转化为 CoreML 模型,该模型期望从头顶直接拍摄图像。

ARKit 给出了相对于平面的设备方向(ARCamera.transformARCamera.eulerAnglesARCamera.projectionMatrix 看起来很有希望)。

所以我知道了相机的方向(我知道飞机是水平的,因为这就是 ARKit 现在检测到的所有内容)。但我不太清楚如何创建 GLKMatrix4 将执行正确的透视校正。

原本我认为它会像ARCamera.projectionMatrix的逆变换一样简单,但似乎根本不起作用;我不完全确定该矩阵描述的是什么。它似乎并没有根据设备方向发生太大变化。

我试过使用 GLKMatrix4Rotate 和 roll/pitch/yaw 创建我自己的矩阵,但是没有用。我什至不能让它在单个旋转轴上工作。

我发现 GLKMatrix4MakePerspectiveGLKMatrix4MakeOrthoGLKMatrix4MakeFrustum 似乎可以进行透视变换,但我不知道如何获取我拥有的信息并将其转换为这些函数的输入以进行适当的透视变换。

编辑: 为了更好地解释我正在尝试做的事情,我使用了 Photoshop 中的 Perspective Warp 工具来转换示例图像;我想知道的是如何想出一个矩阵,根据我所掌握的场景信息执行类似的变换。

我最终使用了 iOS11 Vision's Rectangle Detection and then feeding it into Core Image's CIPerspectiveCorrection filter

我使用 OpenCV 透视变换解决了。 (https://docs.opencv.org/trunk/da/d6e/tutorial_py_geometric_transformations.html,https://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html#getperspectivetransform)

如果您能够在场景中获得纸张的角(例如使用 ARReferenceImage 并将它们投影为 2D),请使用它们。否则,您可以尝试通过 OpenCV 直接检测角点(参见 ),从 sceneView.snapshot() 中提取的 UIImage 和类型 ARSceneViewsceneView。在最后一种情况下,我建议您先进行二值化,然后将上面 link 片段中的 MAX_CORNERS 变量更改为 4(论文的 4 个角)。

然后根据纸张的宽度和高度比例创建一个新的cv::Mat,宽度和高度由您选择并进行透视变换。有关最后一段的指南,请查看 link 中的 "Perspective Correction using Homography" 部分:https://www.learnopencv.com/homography-examples-using-opencv-python-c/#download简洁:你要求opencv找到一个合适的变换来将你预期的论文点投影到一个完美的矩形平面(你的新cv::Mat