视觉框架条形码检测感兴趣区域不起作用

Vision framework barcode detection region of interest not working

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

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

这是 Apple 对这个方向的评价:

The (x,y) pixel coordinates of the origin point (0,0) represent the top row and rightmost column, respectively. Pixel (x,y) positions increase top-to-bottom, right-to-left. If an image is encoded with this orientation, then displayed by software unaware of orientation metadata, the image appears to be rotated 90° counter-clockwise. (That is, to present the image in its intended orientation, you must rotate it 90° clockwise.)

所以,当我定义 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)

如果条形码在蓝色区域内和在蓝色区域上方的任何一点,包括蓝色区域顶部区域的任何地方,它都会检测到。如果条形码在蓝色区域下方,则不会检测到任何东西。

请确保,如果您查看 regionOfInterestdocumentation 表示:

The rectangle is normalized to the dimensions of the processed image. Its origin is specified relative to the image's lower-left corner.

所以原点 (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

只是为了更清楚地插话,因为这也让我感到困惑。

regionOfInterest 的文档说:

The default value is { { 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)