我想检测球并让 AR 模型与其交互。我使用 opencv 进行球检测并发送球中心,我可以在其中使用hitTest
获取坐标sceneView
。我一直在转换CVPixelBuffer
to UIImage
使用以下函数:
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
}
这给了我旋转图像:
然后我发现可以使用以下方法更改方向:
let capturedImage = UIImage(cgImage: temporaryImage, scale: 1.0, orientation: .right)
虽然设备处于纵向时它给出了正确的方向,但将设备旋转到横向时再次给出了旋转的图像。
现在我正在考虑使用处理它viewWillTransition
。但在此之前我想知道:
- 是否有其他方法可以以正确的方向转换图像?
- 为什么会发生这种情况?
1.是否有其他方法可以将图像转换为正确的方向?
您可以尝试使用snapshot()
of ARSCNView
(继承自SCNView
), 哪个:
绘制视图的内容并将它们作为新的图像对象返回
所以如果你有一个像这样的对象:
@IBOutlet var arkitSceneView:ARSCNView!
你只需要这样做:
let imageFromArkitScene:UIImage? = arkitSceneView.snapshot()
2、为什么会出现这种情况?
这是因为CVPixelBuffer
来自ARFrame
,即:
由运行的 AR 会话从设备摄像头(连续)捕获。
好吧,由于相机方向不会随着设备的旋转而改变(它们是分开的),为了能够将框架的方向调整到当前视图,您应该应用仿射重新调整从相机捕获的图像的方向变换提取为displayTransform(for:viewportSize:)
:
返回仿射变换,用于在标准化图像坐标和适合在屏幕上渲染相机图像的坐标空间之间进行转换。
你可能会找到很好的文档here https://developer.apple.com/documentation/arkit/arframe/2923543-displaytransform,用法示例:
let orient = UIApplication.shared.statusBarOrientation
let viewportSize = yourSceneView.bounds.size
let transform = frame.displayTransform(for: orient, viewportSize: viewportSize).inverted()
var finalImage = CIImage(cvPixelBuffer: pixelBuffer).transformed(by: transform)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)