I'm working on a project with ARKit
and I'm trying to do a perspective correction of the ARFrame.capturedImage
to orient a piece of paper sitting on a detected plane so I can feed that into a CoreML
model which expects images to be taken from directly overhead.
ARKit
gives me the device orientation relative to the plane (ARCamera.transform
, ARCamera.eulerAngles
, and ARCamera.projectionMatrix
all look promising).
So I have the orientation of the camera (and I know the plane is horizontal since that's all ARKit
detects right now).. but I can't quite figure out how to create a GLKMatrix4
that will perform the correct perspective correction.
Originally I thought it would be as easy as transforming by the inverse of ARCamera.projectionMatrix
but that doesn't appear to work at all; I'm not entirely sure what that matrix is describing.. it doesn't seem to change much based on the device orientation.
I've tried creating my own matrix using GLKMatrix4Rotate
and the roll/pitch/yaw but that didn't work.. I couldn't even get it working with a single axis of rotation.
I found GLKMatrix4MakePerspective
, GLKMatrix4MakeOrtho
, and GLKMatrix4MakeFrustum
which seem to do perspective transforms but I can't figure out how to take the information I have and translate it to the inputs of those functions to make the proper perspective transformation.
Edit:
As an example to better explain what I'm trying to do, I used the Perspective Warp
tool in Photoshop to transform an example image; what I want to know is how to come up with a matrix that will perform a similar transform given the info I have about the scene.
I ended up using iOS11 Vision
's Rectangle Detection and then feeding it into Core Image's CIPerspectiveCorrection
filter.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With