我正在研究一个ARKit
的项目,我正在尝试对ARFrame.capturedImage
进行透视校正,以便将一张纸放在检测到的平面上,这样我就可以将其输入一个CoreML
模型,它希望从头顶直接拍摄图像。
ARKit
为我提供了相对于平面的设备方向(ARCamera.transform
,ARCamera.eulerAngles
和ARCamera.projectionMatrix
看起来都很有希望。)
所以我有相机的方向(我知道飞机是水平的,因为现在所有的ARKit
都检测到了)..但我无法弄清楚如何创建GLKMatrix4
这将执行正确的透视校正。
最初我认为它会像ARCamera.projectionMatrix
的逆转换一样容易,但似乎根本不起作用;我不完全确定该矩阵在描述什么......根据设备方向,它似乎没有太大变化。
我尝试使用GLKMatrix4Rotate
和滚动/俯仰/偏航来创建我自己的矩阵,但这不起作用..我甚至无法使用单个旋转轴。
我发现GLKMatrix4MakePerspective
,GLKMatrix4MakeOrtho
和GLKMatrix4MakeFrustum
似乎进行了透视变换,但我无法弄清楚如何获取我拥有的信息并将其转换为输入这些功能可以进行适当的透视转换。
编辑:
作为更好地解释我正在尝试做什么的一个例子,我使用Photoshop中的Perspective Warp
工具来转换示例图像;我想知道的是如何根据我对场景的信息提出一个矩阵来执行类似的变换。
答案 0 :(得分:2)
我最终使用iOS11 Vision
的矩形检测,然后将其输入Core Image's CIPerspectiveCorrection
filter。
答案 1 :(得分: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直接从{{1}中获取的UIImage
类型为sceneView.snapshot()
的{{1}}中检测拐角(请参见https://stackoverflow.com/a/12636153/9298773)。在后一种情况下,建议您首先进行二值化处理,然后将上面链接中的代码段中的sceneView
变量更改为4(纸张的4个角)。
然后创建一个新的ARSceneView
,其宽度和高度可以选择尊重纸张的宽度和高度的比例,并进行透视变换。有关此最后一段的指南,请查看以下链接的“使用同形照相术进行透视校正”部分:https://www.learnopencv.com/homography-examples-using-opencv-python-c/#download。 简洁:您要求opencv查找适当的变换,以将预期的纸张点投影到完美的矩形平面(您的新MAX_CORNERS
)中