Swift-从照相机获取图像(AVCaptureSession)

Swift-从照相机获取图像(AVCaptureSession),swift,uiimage,avcapturesession,Swift,Uiimage,Avcapturesession,简介和背景: 我已经在一个项目上工作了一段时间,该项目允许用户从他们的相机(实时提要)执行一些自定义操作 目前,我以以下方式启动捕获会话: var session: AVCaptureSession? var stillImageOutput: AVCaptureStillImageOutput? var videoPreviewLayer: AVCaptureVideoPreviewLayer? override func viewDidAppear(_ animated: Bool) {

简介和背景:

我已经在一个项目上工作了一段时间,该项目允许用户从他们的相机(实时提要)执行一些自定义操作

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

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?)

研究:

我和其他许多人一样,已经看过了,也看过了相机的框架,但这些并不一定能说明我需要什么。有趣的是我提供的第一个链接:在他们的答案中:

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”用户演示此转换

总之


请让我知道我是否遗漏了什么,或者我是否应该改写什么。正如上面所说的,这是我的第一篇文章,所以我对这些细微差别不是很清楚。谢谢,干杯

您应该尝试重新考虑使用AVCaptureSession。对于你正在做的(我想)你应该尝试使用。这对于图像处理来说是一个非常有用的工具,特别是如果你以30/60fps*的速度操作(处理后的实际帧速率可能会更低,我保证会更低)。取决于你得到了什么操作,你可以很容易地将它转换为使用桥接头的XCODE,或者完全转换为C++,以供OpenCV使用。p> 使用OpenCV,您可以从内置函数调用摄影机,这可以节省大量处理时间,从而节省运行时间。例如,看一看


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

如果您计划以30 fps或更快的速度处理和显示位图,即使您不是从相机获取位图,使用位图
UIImage
s也不是一个好的解决方案。你最好看看
avcapturedevideodataoutput
和一些解决方案,这些解决方案可以在GPU上使用捕获出来的
CVPixelBuffer
s进行图像处理,例如Metal或CoreImage。有趣的。。。我来看看这个。。。非常感谢。是的,更多的阅读资料,请看