I want to detect ball and have AR model interact with it. I used opencv for ball detection and send center of ball which I can use in hitTest
to get coordinates in sceneView
. I have been converting CVPixelBuffer
to UIImage
using following function:
static func convertToUIImage(buffer: CVPixelBuffer) -> UIImage?{
let ciImage = CIImage(cvPixelBuffer: buffer)
let temporaryContext = CIContext(options: nil)
if let temporaryImage = temporaryContext.createCGImage(ciImage, from: CGRect(x: 0, y: 0, width: CVPixelBufferGetWidth(buffer), height: CVPixelBufferGetHeight(buffer)))
{
let capturedImage = UIImage(cgImage: temporaryImage)
return capturedImage
}
return nil
}
This gave me rotated image:
Then i found about changing orientation using:
let capturedImage = UIImage(cgImage: temporaryImage, scale: 1.0, orientation: .right)
While it gave correct orientation while device is in portrait, rotating device to landscape again gave rotated image.
Now I am thinking about handling it using viewWillTransition
. But before that i want to know:
- If there is other way around to convert image with correct orientation?
- Why does this happen?
1. Is there another way to convert the image with the correct orientation?
You may try to use
snapshot()
ofARSCNView
(inherited fromSCNView
), which:so if you have an object like:
you only need to do so:
2. Why does this happen?
It's because the
CVPixelBuffer
comes fromARFrame
, which is :Well, since the camera orientation does not change with the rotation of the device (they are separate), to be able to adjust the orientation of your frame to the current view, you should re-orient the image captured from your camera applying the affine transform extracted with
displayTransform(for:viewportSize:)
:you may find good documentation here, usage example:
sceneView.scene.background.contentsTransform = SCNMatrix4MakeRotation(.pi / 2, 0, 0, 1)