视觉框架条形码检测感兴趣区域不起作用
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)
如果条形码在蓝色区域内和在蓝色区域上方的任何一点,包括蓝色区域顶部区域的任何地方,它都会检测到。如果条形码在蓝色区域下方,则不会检测到任何东西。
请确保,如果您查看 regionOfInterest
,documentation 表示:
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)
我正在尝试解码出现在感兴趣区域的条形码,即屏幕宽度的 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)
如果条形码在蓝色区域内和在蓝色区域上方的任何一点,包括蓝色区域顶部区域的任何地方,它都会检测到。如果条形码在蓝色区域下方,则不会检测到任何东西。
请确保,如果您查看 regionOfInterest
,documentation 表示:
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)