条形码检测
备注
此 API 需要有效的 软件许可证 。
条形码检测 API 允许您检测和解码 2D 图像中的条形码。
条形码是一种可视的、机器可读的数据表示形式,通常由平行线、空白区域或特定形状组成的图案来编码信息,例如产品编号。Zivid SDK 支持以下线性(一维)和矩阵(二维)条形码格式:
线性条码:EAN-13、EAN-8、Code 128、Code 93、Code 39、UPC-A、UPC-E
矩阵:QR Code, Data Matrix
支持的条形码格式示例。
条形码有多种尺寸,其中最小条形或间距的宽度是主要的尺寸参数。例如,标准零售用的一维条形码通常在 7 mil(0.178 毫米)到 13 mil(0.330 毫米)之间。较小的条形码需要更高的分辨率才能被可靠地检测和解码。
从相同距离拍摄的不同尺寸的 Code 128 条形码示例。
条形码检测 API
首先初始化条形码检测器。请注意,此操作只需执行一次,无需 在每次采集数据时都执行。
然后指定要检测哪些受支持的条形码格式,而不是检测所有格式。这将加快检测速度并提高解码的可靠性。在本例中,为了简单起见,我们概括地选择了所有受支持的格式。
// Select your specific barcode formats for optimal performance
const auto linearFormatFilter = LinearBarcodeFormat::code128 | LinearBarcodeFormat::code93
| LinearBarcodeFormat::code39 | LinearBarcodeFormat::ean13
| LinearBarcodeFormat::ean8 | LinearBarcodeFormat::upcA
| LinearBarcodeFormat::upcE;
const auto matrixFormatFilter = MatrixBarcodeFormat::qrcode | MatrixBarcodeFormat::dataMatrix;
# Select your specific barcode formats for optimal performance
linear_format_filter = {
LinearBarcodeFormat.code128,
LinearBarcodeFormat.code93,
LinearBarcodeFormat.code39,
LinearBarcodeFormat.ean13,
LinearBarcodeFormat.ean8,
LinearBarcodeFormat.upcA,
LinearBarcodeFormat.upcE,
}
matrix_format_filter = {MatrixBarcodeFormat.qrcode, MatrixBarcodeFormat.dataMatrix}
成功检测和解码条形码很大程度上取决于清晰且曝光良好的 2D 图像。请使用条形码检测器建议的 2D 设置,并捕获 2D frame。
然后对捕获的 2D frame 执行条形码检测和解码。这里我们同时读取线性条形码和矩阵条形码,但请确保只读取您所需的特定条形码类型。
最后,打印出生成的条形码代码、格式和像素位置。
if(!linearBarcodeResults.empty())
{
std::cout << "Detected " << linearBarcodeResults.size() << " linear barcodes:" << std::endl;
for(const auto &result : linearBarcodeResults)
{
std::cout << "-- Detected barcode " << result.code() << " on format " << toString(result.codeFormat())
<< " at pixel " << result.centerPosition() << std::endl;
}
}
if(!matrixBarcodeResults.empty())
{
std::cout << "Detected " << matrixBarcodeResults.size() << " matrix barcodes:" << std::endl;
for(const auto &result : matrixBarcodeResults)
{
std::cout << "-- Detected barcode " << result.code() << " on format " << toString(result.codeFormat())
<< " at pixel " << result.centerPosition() << std::endl;
}
}
if linear_barcode_results:
print(f"Detected {len(linear_barcode_results)} linear barcodes:")
for result in linear_barcode_results:
print(
f"-- Detected barcode {result.code()} on format {result.code_format()} at pixel {result.center_position()}"
)
if matrix_barcode_results:
print(f"Detected {len(matrix_barcode_results)} matrix barcodes:")
for result in matrix_barcode_results:
print(
f"-- Detected barcode {result.code()} on format {result.code_format()} at pixel {result.center_position()}"
)
Zivid Studio 中的条形码检测
小技巧
Zivid Studio 中的条形码检测功能*不需要*软件许可证。
您可以使用 Zivid Studio 轻松测试条形码检测。连接相机,选择条形码预设,对包含条形码的场景进行 2D 图像捕获。然后点击 View → Show barcodes 即可在图像中可视化解码后的条形码。
在 Zivid Studio 中可视化检测到的条形码。
您可以通过在 View → Configure barcodes to detect 中选择特定的条形码格式来加快检测速度。
条形码检测性能
检测和解码的性能取决于多种因素,包括:
条形码尺寸
到条形码的距离
图像分辨率
图像聚焦
水平和垂直视野
这些因素有效地决定了条形码表面的空间分辨率,而空间分辨率对于可靠的检测和解码至关重要。
图像分辨率和对焦可通过相机设置进行控制,我们建议使用 BarcodeDetector::suggestSettings(camera) 以获得最佳拍摄设置。每款相机的水平和垂直视野 (FOV) 都是固定的,视野越大,空间分辨率越低。条形码的拍摄距离可在一定限制条件下由应用程序控制,但同时也受相机工作范围的限制。
因此,我们推荐使用相机 Zivid 2+ MR130 和 MR60用于条形码检测,因为它们在其工作范围内能够提供足够的空间分辨率。以下是针对不同距离、方向和视场内位置的各种静态条形码的基准测试结果。
小技巧
为了获得可靠的解码结果,请在绿色区域内操作。
版本历史记录
SDK |
变更 |
|---|---|
2.17.0 |
新增了条形码检测 API |