ARKit透视校正

5
我正在使用 ARKit 开发一个项目,尝试对检测到的平面上的一张纸进行透视校正,以便将其输入到期望从正上方拍摄图像的 CoreML 模型中。 ARKit 给出了设备相对于平面的方向(ARCamera.transformARCamera.eulerAnglesARCamera.projectionMatrix 都看起来很有前途)。
因此,我知道相机的方向(而且我知道平面是水平的,因为这是目前 ARKit 检测到的所有内容),但我无法确定如何创建一个执行正确透视校正的 GLKMatrix4
最初,我认为只需要通过 ARCamera.projectionMatrix 的逆变换即可实现,但这似乎根本不起作用;我不太确定该矩阵在描述什么..它似乎不会随着设备方向的改变而改变。
我尝试使用GLKMatrix4Rotate和滚动/俯仰/偏航来创建自己的矩阵,但那没用...我甚至无法通过单个旋转轴使其工作。
我找到了GLKMatrix4MakePerspectiveGLKMatrix4MakeOrthoGLKMatrix4MakeFrustum,它们似乎可以进行透视变换,但我无法弄清如何将我拥有的信息转换为这些函数的输入,以进行正确的透视变换。
编辑: 为了更好地解释我的尝试,我使用Photoshop中的Perspective Warp工具转换了一个示例图像;我想知道如何得到一个矩阵,可以给定我对场景的信息执行类似的变换。

enter image description here

2个回答

3

你能否使用CIPerspectiveCorrection进行无裁剪的变换?不介意的话,能分享一下你的代码吗? - enigrify

0

我使用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检测角落(请参见https://stackoverflow.com/a/12636153/9298773),从sceneView类型为ARSceneViewsceneView.snapshot()拍摄的UIImage中进行检测。在这种情况下,我建议您首先进行二值化,并将上面链接中的代码段中的MAX_CORNERS变量更改为4(即您的纸张的4个角落)。

然后创建一个新的cv::Mat,其宽度和高度由您选择,但要保持与纸张宽度和高度成比例,并进行透视变换。有关此最后一段的指南,请参阅以下链接中的“使用Homography进行透视校正”部分:https://www.learnopencv.com/homography-examples-using-opencv-python-c/#download。简而言之:您要求opencv找到一个适当的变换,将您预测的纸张点投影到一个完美矩形平面中(即您的新cv::Mat)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接