将ARFrame的捕获图像转换为UIImage方向问题

时间:2018-01-26 04:58:58

标签: ios swift uiimage arkit cvpixelbuffer

我想检测球并让AR模型与之互动。我使用opencv进行球检测并发送球的中心,我可以在hitTest中使用以获得sceneView中的坐标。我使用以下功能将CVPixelBuffer转换为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
}

这给了我旋转的图像:

enter image description here

然后我发现了使用以下方法改变方向:

let capturedImage = UIImage(cgImage: temporaryImage, scale: 1.0, orientation: .right)

虽然在设备处于纵向状态时它给出了正确的方向,但是将设备再次旋转到横向时会产生旋转图像。

现在我正在考虑使用viewWillTransition来处理它。但在此之前,我想知道:

  1. 如果还有其他方法可以正确定位转换图像吗?
  2. 为什么会这样?

1 个答案:

答案 0 :(得分:8)

<强> 1。还有另一种方法可以使用正确的方向转换图像吗?

您可以尝试使用snapshot()的{​​{1}}(继承自ARSCNView),其中:

  

绘制视图的内容并将其作为新图像对象返回

所以如果你有一个像这样的对象:

SCNView

你只需要这样做:

@IBOutlet var arkitSceneView:ARSCNView!

<强> 2。为什么会这样?

这是因为let imageFromArkitScene:UIImage? = arkitSceneView.snapshot() 来自CVPixelBuffer,即:

  

通过正在运行的AR会话从设备摄像头捕获(连续)。

好吧,由于相机方向不会随着设备的旋转而改变(它们是分开的),为了能够将框架的方向调整到当前视图,您应该重新定位从相机捕获的图像应用用ARFrame提取的仿射变换:

  

返回仿射变换,用于在标准化图像坐标和适合在屏幕上渲染摄像机图像的坐标空间之间进行转换。

您可以找到好的文档here,用法示例:

displayTransform(for:viewportSize:)