【问题标题】:Vision framework barcode detection region of interest not working视觉框架条形码检测感兴趣区域不起作用
【发布时间】:2021-05-05 22:03:24
【问题描述】:

我正在尝试解码出现在感兴趣区域上的条形码,即屏幕宽度的 80% 和屏幕高度的 20%,并以两个方向为中心(蓝色矩形)。

相机像素缓冲区向右旋转。

这就是苹果对这个方向的评价:

原点 (0,0) 的 (x,y) 像素坐标表示 分别是顶行和最右列。像素 (x,y) 位置 从上到下,从右到左增加。如果图像编码为 这个方向,然后由不知道方向的软件显示 元数据,图像似乎逆时针旋转了 90°。 (那 是,要以预期的方向呈现图像,您必须旋转 顺时针90°。)

所以,当我定义我的VNDetectBarcodesRequest 感兴趣的区域时,我会这样做:

  lazy var barcodeRequest: VNDetectBarcodesRequest = {
    let barcodeRequest = VNDetectBarcodesRequest {[weak self] request, error in
      guard error == nil else {
        print ("ERROR")
        return
      }
      self?.classification(request)
    }

    barcodeRequest.regionOfInterest = CGRect(x: 0.1,
                                             y: 0.4,
                                             width: 0.9,
                                             height: 0.6)

如果条形码位于蓝色区域内,并且在其上方的任何位置,包括蓝色区域顶部区域的任何位置,它都会检测到。如果条形码在蓝色区域下方,则不会检测到任何内容。

【问题讨论】:

    标签: swift swift5 vision


    【解决方案1】:

    只要确保,如果您查看 regionOfInterestdocumentation 会说:

    矩形被标准化为处理后图像的尺寸。它的原点是相对于图像的左下角指定的。

    所以原点 (0,0) 在左下角。使用您当前的 CGRect,

    CGRect(x: 0.1,
           y: 0.4,
           width: 0.9,
           height: 0.6)
    

    您将得到预期的结果 - “如果条形码位于蓝色区域内并且在其上方的任何位置,包括蓝色区域顶部区域的任何位置,它将检测到。”

    您只需将高度从0.6 更改为0.2。你会想要:

    barcodeRequest.regionOfInterest = CGRect(x: 0.1,
                                             y: 0.4,
                                             width: 0.9,
                                             height: 0.2) /// your height is wrong
    

    【讨论】:

    • 我接受你的回答并支持你,因为它有效,但我不明白这一点。我没有看到它怎么可能是 0.2!来自相机的图像是向右的,所以它的 0,0 坐标在右上角。
    • 我看不懂这个归一化坐标系。
    • @Duck 但是你让请求处理程序类似于imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .right),对吧?这告诉 Vision 图像的方向是正确的,因此它会自动为您旋转它。这个“处理后的图像”被旋转为直立,是 regionOfInterest 适用的。
    • 那么regionOfInterest是一个CGRect。但与大多数 UIKit rects 不同的是,原点位于左下角。
    • 好的。但它不仅仅是一个矩形,我不明白。
    【解决方案2】:

    只是为了增加清晰度,因为这也让我绊倒了。

    regionOfInterest 的文档说:

    默认值为 { { 0, 0 }, { 1, 1 } }

    我也对 2 点感到困惑(左下角和右上角)。但是最后一对应该是归一化的宽度和高度;不是归一化坐标。

    // ❌
    request.regionOfInterest = CGRect(x: 0.1, y: 0.4, width: 0.9, height: 0.6)
    
    // ✔️
    request.regionOfInterest = CGRect(x: 0.1, y: 0.4, width: 0.8, height: 0.2)
    

    【讨论】:

    • 我喜欢 Apple 文档。
    猜你喜欢
    • 2014-05-20
    • 2011-08-10
    • 2013-02-28
    • 1970-01-01
    • 2018-02-25
    • 2012-02-22
    • 1970-01-01
    • 2012-04-25
    相关资源
    最近更新 更多