首页 > 解决方案 > 视觉框架条形码检测感兴趣区域不起作用

问题描述

我正在尝试解码出现在感兴趣区域上的条形码,即屏幕宽度的 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)

如果条码位于蓝色区域内以及高于该区域的任何位置,包括蓝色区域顶部区域的任何位置,它都会检测到。如果条形码位于蓝色区域下方,则它不会检测到任何东西。

标签: swiftswift5vision

解决方案


只要确保,如果你看regionOfInterest文档说:

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

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

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

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

您需要做的就是将高度从 更改0.60.2。你会想要:

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

推荐阅读