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
相关产品推荐
相关产品推荐

