Swift - 从相机获取 UIImages (AVCaptureSession)

Swift - Getting UIImages from Camera (AVCaptureSession)

简介和背景:

我一直在从事一个项目,让用户可以从他们的相机(实时馈送)进行一些自定义操作

目前,我通过以下方式启动捕获会话:

var session: AVCaptureSession?
var stillImageOutput: AVCaptureStillImageOutput?
var videoPreviewLayer: AVCaptureVideoPreviewLayer?

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    videoPreviewLayer!.frame = CameraView.bounds
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    session = AVCaptureSession()
    session!.sessionPreset = AVCaptureSessionPresetPhoto
    let backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
    var error: NSError?
    var input: AVCaptureDeviceInput!
    do {
        input = try AVCaptureDeviceInput(device: backCamera)
    } catch let error1 as NSError {
        error = error1
        input = nil
    }
    if error == nil && session!.canAddInput(input) {
        session!.addInput(input)
        stillImageOutput = AVCaptureStillImageOutput()
        stillImageOutput?.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
        if session!.canAddOutput(stillImageOutput) {
            session!.addOutput(stillImageOutput)
            videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session)
            videoPreviewLayer!.videoGravity = AVLayerVideoGravityResizeAspect
            videoPreviewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
            CameraView.layer.addSublayer(videoPreviewLayer!)
            session!.startRunning()
        }
    }
}

其中 CameraView 是我的 viewcontroller 的 UIView。我现在有一个名为:singleTapped() 的函数,我想获取捕获的每一帧,对其进行处理,然后放入 CameraView 帧(也许我应该改用 UIImageView?)...

研究:

我查看了 and here,以及许多其他获取相机帧的方法,但这些并不一定是我需要的结论。有趣的是我提供的第一个 link:在他们的回答中他们有:

self.stillImageOutput.captureStillImageAsynchronouslyFromConnection(self.stillImageOutput.connectionWithMediaType(AVMediaTypeVideo)) { (buffer:CMSampleBuffer!, error:NSError!) -> Void in
    var image = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer)
    var data_image = UIImage(data: image) //THEY EXTRACTED A UIIMAGE HERE
    self.imageView.image = data_image
}

哪个 确实从相机中获取了 UIImage,但这是 30fps 的可行方法吗?

理性与约束:

我需要 UIImage 的原因是因为我正在利用别人编写的库以自定义方式快速转换 UIImage。我想向用户展示这个转换 "live".

总结

如果我遗漏了什么,或者我是否应该改写什么,请告诉我。如上所述,这是我的第一个 post,所以我不太了解如此细微的差别。谢谢,干杯

您也许应该重新考虑使用 AVCaptureSession。对于您正在做的事情(我假设),您应该尝试使用 OpenCV。它非常适合图像处理,尤其是当您以 30/60fps* 进行处理时(处理后的实际帧速率可能,我保证会更低)。根据给定的这种操作,您可以使用桥接 headers 轻松地将其移植到 XCode 中,或者将所有内容完全转换为 C++ 以便与 OpenCV 一起使用。

使用 OpenCV,您可以从 built-in 函数调用相机,这可以为您节省大量处理时间,从而节省运行时间。例如,看看 this.

我已经将 OpenCV 用于您刚才描述的类似情况,我认为您可以从中受益。 Swift 很好,但有时通过其他方式处理某些事情会更好...