【问题标题】:How BarCode,QR Code are recognized without capturing the image?BarCode、QR Code 如何在不抓图的情况下识别?
【发布时间】:2013-04-19 05:57:09
【问题描述】:

我想知道如何在不捕获条形码和 QR 码(甚至字符)的情况下识别它。我在许多应用程序中看到,当我们将设备置于其中任何一个(QR/条形码)之上时,应用程序会自动识别它并开始处理。是否有任何用于此的扫描机制?如何做到这一点?这其中涉及哪些机制?

提前致谢。

【问题讨论】:

  • 在 ios 中有像 ZBar 这样的第三方库,可以解码开发人员实现的二维码/条形码
  • @LochanaRagupathy:是的,我知道有一些 SDK 可用。但我的疑问是,这些功能如何工作?无论是通过捕获还是不捕获图像?据我所知,我们正在做一些事情比如扫描然后处理它。

标签: ios camera qr-code barcode-scanner scanning


【解决方案1】:
  1) The phone camera will be launched by the library it will autofocus and scans until it finds the decoded info from the image displayed by camera

  2) The info will be parsed by the library and it will give you the result.

解码后的信息是“其中包含解码信息的条形码”

Example for QRCode: The data is present as square 

        for barcode: the data is present as vertical lines 

该库具有用于根据格式检测代码类型和解码的所有逻辑。 请阅读更多二维码/条形码库文档或实施并学习

【讨论】:

  • 但在许多应用程序中,如果不单击捕获按钮,它会自动聚焦到条码上,单独选择条码并开始处理。他们是否在后台执行任何捕获操作。
  • 是的,它会持续自动对焦,直到它检测到条形码中存在的 QRCode 图像或条形码图像,一旦获得它就会捕获它并将这些数据发送到库。它会持续自动对焦,直到检测到条形码图像,如果没有找到它不会给你任何结果
  • 只有捕获手段?当你说捕捉它想在相机启动后捕捉图像
  • 最好问问那些二维码/条形码库的作者!!,.
【解决方案2】:

您可以使用AVCaptureSession,例如:

let session = AVCaptureSession()
var qrPayload: String?

func startSession() {
    guard !started else { return }

    let output = AVCaptureMetadataOutput()
    output.setMetadataObjectsDelegate(self, queue: .main)

    let device: AVCaptureDevice?

    if #available(iOS 10.0, *) {
        device = AVCaptureDevice
            .DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: .metadataObject, position: .back)
            .devices
            .first
    } else {
        device = AVCaptureDevice.devices().first { $0.position == .back }
    }

    guard
        let camera = device,
        let input = try? AVCaptureDeviceInput(device: camera),
        session.canAddInput(input),
        session.canAddOutput(output)
    else {
        // handle failures here
        return
    }

    session.addInput(input)

    session.addOutput(output)
    output.metadataObjectTypes = [.qr]

    let videoLayer = AVCaptureVideoPreviewLayer(session: session)
    videoLayer.frame = view.bounds
    videoLayer.videoGravity = .resizeAspectFill

    view.layer.addSublayer(videoLayer)

    session.startRunning()
}

并扩展您的视图控制器以符合AVCaptureMetadataOutputObjectsDelegate

extension QRViewController: AVCaptureMetadataOutputObjectsDelegate {
    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        guard
            qrPayload == nil,
            let object = metadataObjects.first as? AVMetadataMachineReadableCodeObject,
            let string = object.stringValue
        else { return }

        qrPayload = string
        print(qrPayload)

        // perhaps dismiss this view controller now that you’ve succeeded
    }
}

注意,我正在测试以确保 qrPayloadnil,因为我发现您可以看到 metadataOutput(_:didOutput:from:) 在视图控制器被关闭之前被调用了几次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2013-12-12
    • 2011-10-06
    • 1970-01-01
    • 2019-01-19
    • 2020-02-19
    • 2021-08-05
    相关资源
    最近更新 更多