我正在与ARKit合作做一个项目,我试图对ARFrame.capturedImage做一个透视校正,将一张纸定位在检测到的飞机上,这样我就可以把它输入到CoreML模型中,该模型期望从头顶直接获取图像。
ARKit给出了相对于平面的设备方向(ARCamera.transform、ARCamera.eulerAngles和ARCamera.projectionMatrix看起来都很有前途)。
所以我有相机的方向(我知道飞机是水平的,因为ARKit现在只检测到这一点)。但我不太清楚如何创建一个GLKMatrix4来执行正确的透视图校正。
起初,我以为它就像ARCamera.projectionMatrix的逆变换一样容易,但这似乎根本不起作用;我不完全确定矩阵描述的是什么。根据设备的方向,它似乎没有太大的变化。
我试过用GLKMatrix4Rotate和滚动/俯仰/偏航创建我自己的矩阵,但这不起作用。我甚至不能让它在一个旋转轴上工作。
我找到了GLKMatrix4MakePerspective、GLKMatrix4MakeOrtho和GLKMatrix4MakeFrustum,它们似乎进行透视图转换,但我想不出如何利用我拥有的信息并将其转换到这些函数的输入中来进行正确的透视图转换。
编辑:为了更好地解释我想做什么,我使用Photoshop中的Perspective Warp工具来转换一个示例图像;我想知道的是,鉴于我对场景的了解,如何找到一个矩阵来执行类似的转换。

发布于 2019-07-03 09:57:43
我使用OpenCV透视图转换进行了求解。(transformations.html#getperspectivetransform)
如果你能够在场景中找到你的论文的角落(例如,用一个ARReferenceImage并将它们投影到2D中),那就拿它们吧。否则,您可以尝试通过OpenCV (请参阅https://stackoverflow.com/a/12636153/9298773)从从sceneView.snapshot()获取的UIImage中直接检测拐角,而sceneView类型为ARSceneView。在最后一种情况下,我建议您先进行二进制化,并将上面链接处的代码段中的MAX_CORNERS变量更改为4(论文的4个角)。
然后创建一个新的cv::Mat与您选择的宽度和高度,,尊重您的纸张的比例,宽度和高度,,并做透视转换。关于这最后一段的指导方针,请看一下这个链接:https://www.learnopencv.com/homography-examples-using-opencv-python-c/#download中的“使用单形的透视校正”一节。简洁的:您要求opencv找到适当的转换,将您的预期论文点投影到一个完美的矩形平面(您的新cv::Mat)。
https://stackoverflow.com/questions/45494586
复制相似问题