You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VisionKit条码扫描中RegionOfInterest的使用示例及应用方法咨询

VisionKit 条码扫描中 RegionOfInterest 的使用示例

在VisionKit的条码扫描流程中,regionOfInterest是通过VNBarcodeScannerRequest来设置的,核心是把UI层面的扫描区域转换为Vision框架要求的归一化坐标系(原点在图像左下角,所有数值范围0-1),以下是完整的实现步骤和代码示例:

1. 坐标系转换(关键)

Vision使用的坐标系和UIKit完全不同:

  • UIKit:原点在屏幕左上角,数值为实际像素/点
  • Vision:原点在图像左下角,数值是相对于图像尺寸的比例(0到1之间)

假设你在界面上用一个UIView(比如叫scanRegionView)标记了要扫描的区域,先把它的frame转换成Vision的归一化坐标:

// 获取预览层的边界(假设你用AVCaptureVideoPreviewLayer做预览)
let previewBounds = previewLayer.bounds
// 获取UI上的扫描区域frame
let scanFrame = scanRegionView.frame

// 转换为Vision的归一化坐标系
let xRatio = scanFrame.origin.x / previewBounds.width
let yRatio = 1.0 - (scanFrame.origin.y + scanFrame.height) / previewBounds.height
let widthRatio = scanFrame.width / previewBounds.width
let heightRatio = scanFrame.height / previewBounds.height

let visionROI = CGRect(x: xRatio, y: yRatio, width: widthRatio, height: heightRatio)

2. 给条码扫描请求设置兴趣区域

创建VNBarcodeScannerRequest时,直接赋值regionOfInterest属性即可:

// 创建条码扫描请求
let barcodeRequest = VNBarcodeScannerRequest(completionHandler: { request, error in
    guard let barcodeObservations = request.results as? [VNBarcodeObservation], error == nil else {
        // 处理错误或无结果的情况
        return
    }
    
    // 遍历识别到的条码(只会在你设置的兴趣区域内识别)
    for observation in barcodeObservations {
        if let payload = observation.payloadStringValue {
            print("识别到条码:\(payload)")
            // 这里做你的业务逻辑处理
        }
    }
})

// 应用兴趣区域
barcodeRequest.regionOfInterest = visionROI

3. 注意事项

  • regionOfInterest的所有参数必须在0-1范围内,超出的部分会被自动裁剪到有效区间
  • 如果设备支持横屏,需要根据previewLayer.connection?.videoOrientation调整坐标系转换逻辑,避免扫描区域错位
  • 当预览层尺寸变化(比如屏幕旋转、设备切换)时,需要重新计算regionOfInterest的值,保证扫描区域始终准确

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:45:53