AVCaptureSession - 捕获帧的某个部分

时间:2016-02-29 16:49:28

标签: ios objective-c swift

我正在使用AVCaptureSession创建一个带有AVCaptureMetadataOutput的QR码扫描程序。

一切都按预期工作,但我想在扫描仪上放置图形叠加层。在这样做时,我希望扫描仪仅在QR码位于帧的给定部分时才扫描。目前,它会在视图中的任何位置检测到QR码,我希望它只在屏幕中间触发。

这甚至可能吗?对于AVCapturePreviewLayer,我设置rectForMetadataOutputRectOfInterest但它似乎没有工作。也许我这样做错了?

有些见解会很棒。提前致谢!

1 个答案:

答案 0 :(得分:0)

我还没有做到这一点,但是我相信这是可以实现的。您会看到,当您捕获AVCaptureMetadataOutput时,可以使用AVCaptureVideoPreviewLayer在视图中获取QR码框架,这在您要在捕获的QR周围绘制矩形时非常有用。

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
    guard let readableCode = metadataObjects.first as? AVMetadataMachineReadableCodeObject, let code = readableCode.stringValue else { return }

    if let barcodeObject = videoPreview?.transformedMetadataObject(for: readableCode) {
        qrCodeFrameView?.frame = barcodeObject.bounds
    }
    stopReading()
    didRead?(code)
}

您可以使用barcodeObject使用CGRect's contains(_:) method来询问您的矩形是否包含条形码

if qrReader.frame.contains(barcodeObject.bounds) {
    stopReading()
    didRead?(code)
}

我认为那可以/应该工作。