如何为iOS AVFoundation定义自定义检测器?

问题描述:

我想从使用iPhone的相机输入中检测一些三角形图案。我发现了一些可以使用AVFoundation检测QR /条码的示例代码。主要部分似乎是AVMetadataMachineReadableCodeObject类。下面是从AppCoda一些示例代码:如何为iOS AVFoundation定义自定义检测器?

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) { 

// Check if the metadataObjects array is not nil and it contains at least one object. 
if metadataObjects == nil || metadataObjects.count == 0 { 
    qrCodeFrameView?.frame = CGRectZero 
    messageLabel.text = "No barcode/QR code is detected" 
    return 
} 

// Get the metadata object. 
let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject 

// Here we use filter method to check if the type of metadataObj is supported 
// Instead of hardcoding the AVMetadataObjectTypeQRCode, we check if the type 
// can be found in the array of supported bar codes. 
if supportedBarCodes.contains(metadataObj.type) { 
    // if metadataObj.type == AVMetadataObjectTypeQRCode { 
    // If the found metadata is equal to the QR code metadata then update the status label's text and set the bounds 
    let barCodeObject = videoPreviewLayer?.transformedMetadataObjectForMetadataObject(metadataObj) 
    qrCodeFrameView?.frame = barCodeObject!.bounds 

    if metadataObj.stringValue != nil { 
     messageLabel.text = metadataObj.stringValue 
    } 
} 

在上面的代码中,一旦检测到QR码,一个边界框将绘制和文本字段将被更新。同样,AVMetadataFaceObject类用于人脸检测应用程序。我从参考中看到,这两个类都是AVMetadataObject的子类。

我想知道是否可以通过编写AVMetadataObject的子类自定义三角形检测器,比如我们称之为子类AVMetadataTriangleObject。 (我有一个现成的检测算法,并有Matlab编写的代码,将其转录到swift应该不是很难)。如果这种方法不可行,任何人都可以提出实现上述目标的替代方法吗?

非常感谢!

AVMetadataObject没有提供执行这样的事情的钩子,除了AVAssetResourceLoader,AVFoundation不允许太多的扩展。

我认为你应该将你的算法转录成swift,并将其与AVCaptureVideoDataOutput使用的捕获的CMSampleBuffer图像进行比较。

+0

感谢节奏快速的回应。我现在看看'CMSampleBuffer'。 – waterworld