在iOS进行视频图像处理的过程中,图像数据通过硬件(摄像头)捕获传入内存,再使用各类软件框架提供的功能对数据进行处理,最后将结果显示在屏幕上。在整个过程中涉及到不同的环节,而这些环节由于各种原因(历史因素、设计因素等)使用的参照坐标系是不相同的。在图像处理过程中,一类重要的数据是与图像相关的位置(position)和尺寸(size)数据,而这类数据与当前的参照坐标系密切相关。这使得在上一环节处理中得到的数据在下一环节中要能正确处理,则必须要根据参照坐标系的不同而作相应的转换,否则得到的是扭曲变形甚至错误的图像结果。初学者在学习视频处理的时候,经常被不同环节过程中参照坐标系的变化弄得迷惑不解,或是错误的处理图像。本文在此详细说明各处理环节中的参照坐标系定义及各环节之间的变换方法。
1.视频捕获的图像显示
打开xcode创建新项目,选择iOS-Application-SingleView Application,输入项目名称VideoProcess,点击Next-Create完成项目创建。
打开ViewController.swift文件,导入框架
import AVFoundation
添加属性
let captureSession=AVCaptureSession()
在viewDidLoad方法加入以下代码
captureSession.sessionPreset = AVCaptureSessionPresetPhoto
let devices = AVCaptureDevice.devices()
for device in devices {
if (device.hasMediaType(AVMediaTypeVideo)) {
//前置摄像头
if (device.position == AVCaptureDevicePosition.Front) {
if let captureDevice=try? AVCaptureDeviceInput(device: device as! AVCaptureDevice) {
if captureSession.canAddInput(captureDevice) {
captureSession.addInput(captureDevice)
setupSessionOutput()
}
}
}
}
}
以上代码加入前置摄像头作为输入设备。如果添加成功,则调用setupSessionOutput()方法设置会话期的输出设备。
接下来实现setupSessionOutput()方法,代码如下
func setupSessionOutput() {
//添加输出设备到session中,这里添加的是AVCaptureVideoDataOutput,表示视频里的每一帧,除此之外,还有AVCaptureMovieFileOutput(完整的视频)、AVCaptureAudioDataOutput(音频)、AVCaptureStillImageOutput(静态图)等
let output = AVCaptureVideoDataOutput()
let cameraQueue = dispatch_queue_create("cameraQueue", DISPATCH_QUEUE_SERIAL)
output.setSampleBufferDelegate(self, queue: cameraQueue)
//videoSettings指定一个字典,但是目前只支持kCVPixelBufferPixelFormatTypeKey,用它指定像素的输出格式,这个参数直接影响到生成图像的成功与否
output.videoSettings = [kCVPixelBufferPixelFormatTypeKey: Int(kCVPixelFormatType_32BGRA)]
if captureSession.canAddOutput(output) {
captureSession.addOutput(output)
}
}