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 很好,但有时通过其他方式处理某些事情会更好...
简介和背景:
我一直在从事一个项目,让用户可以从他们的相机(实时馈送)进行一些自定义操作
目前,我通过以下方式启动捕获会话:
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".
总结
如果我遗漏了什么,或者我是否应该改写什么,请告诉我。如上所述,这是我的第一个 post,所以我不太了解如此细微的差别。谢谢,干杯
您也许应该重新考虑使用 AVCaptureSession。对于您正在做的事情(我假设),您应该尝试使用 OpenCV。它非常适合图像处理,尤其是当您以 30/60fps* 进行处理时(处理后的实际帧速率可能,我保证会更低)。根据给定的这种操作,您可以使用桥接 headers 轻松地将其移植到 XCode 中,或者将所有内容完全转换为 C++ 以便与 OpenCV 一起使用。
使用 OpenCV,您可以从 built-in 函数调用相机,这可以为您节省大量处理时间,从而节省运行时间。例如,看看 this.
我已经将 OpenCV 用于您刚才描述的类似情况,我认为您可以从中受益。 Swift 很好,但有时通过其他方式处理某些事情会更好...