这些只是支持 ARM32 和 ARM64 架构的几个Python条形码SDK。 Dynamsoft Barcode Reader是唯一为ARM32和ARM64设备提供条形码识别功能的商业1D和2D条形码SDK。本文演示了如何在Windows上创建ARM32和ARM64模拟环境以使用DynamSoft Python条形码SDK实现条形码扫描。
开始使用DynamSoft Python条形码SDK
您可以使用PIP安装DynamSoft Python条形码SDK:
pip install dbr
Python软件包支持 Python 3.6及以上。
支持的平台
- Windows(x64)
- linux(x64,arm32和arm64)
- macos(x64和arm64)
注册码
安装Python条形码SDK后,您需要申请valid license以激活它。
from dbr import *
BarcodeReader.init_license(license_key)
快速开始
from dbr import *
license_key = "Input your own license"
image = r"Please input your own image path"
BarcodeReader.init_license(license_key)
reader = BarcodeReader()
try:
text_results = reader.decode_file(image)
if text_results != None:
for text_result in text_results:
print("Barcode Format : ")
print(text_result.barcode_format_string)
print("Barcode Text : ")
print(text_result.barcode_text)
print("Localization Points : ")
print(text_result.localization_result.localization_points)
print("Exception : ")
print(text_result.exception)
print("-------------")
except BarcodeReaderError as bre:
print(bre)
示例代码
https://github.com/Dynamsoft/barcode-reader-python-samples
在线API文档
https://www.dynamsoft.com/barcode-reader/docs/server/programming/python/
视觉工作室代码扩展
https://marketplace.visualstudio.com/items?itemName=yushulx.dbr-code-generator
为什么需要ARM32和ARM64模拟环境?
如果您想创建可以在ARM32或ARM64设备上运行的Python条形码扫描应用程序,例如Raspberry Pi和Jetson Nano,则模拟环境是不需要物理ARM设备编写和测试代码的便捷方法。
如何在Windows上创建包含DynamSoft条形码SDK的Docker ARM32和ARM64图像
QEMU是一种流行的开源仿真器,可以模仿各种CPU架构,包括ARM,POWERPC和MIPS。 multiarch/qemu-user-static是一个Docker映像,可让您使用QEMU模拟主机上的不同CPU架构。
这是创建Docker ARM32和ARM64图像的步骤
- Install Docker Desktop for Windows.
-
docker run --rm --privileged multiarch/qemu-user-static:register --reset
-
创建一个将基本图像指定为ARM32或ARM64体系结构的Dockerfile,并安装必要的工具和依赖项:Cmake,DynamSoft Barcode Reader,OpenCV和Pillow。
。dockerfilearm32
FROM arm32v7/python RUN apt-get update && apt-get install -y cmake libgl1-mesa-glx RUN pip install dbr opencv-python pillow
dockerfilearm64
FROM arm64v8/python RUN apt-get update && apt-get install -y cmake libgl1-mesa-glx RUN pip install dbr opencv-python pillow
opencv-python
软件包用于将图像加载和将图像解码为numpy阵列,但它不为ARM32提供预构建的车轮。因此,从源代码构建包装可能需要很长时间。pillow
软件包是加载和解码图像的opencv-python
的替代方法。 -
为ARM32和ARM64构建Docker图像:
docker build --platform linux/arm64 -f DockerfileArm64 -t <IMAGE-NAME> . docker build --platform linux/arm/v7 -f DockerfileArm32 -t <IMAGE-NAME> .
现在,我们成功地创建了包含DynamSoft Python条形码SDK的Docker ARM32和ARM64图像。接下来,我们可以编写Python条形码读取器脚本并在Docker容器中运行。
如何在ARM32或ARM64 Docker容器中运行Python条形码识别脚本
大多数单板计算机,例如Raspberry Pi和Jetson Nano,都不具有高端硬件。因此,解码速度可能不是大型图像的理想选择。常见的情况是从低分辨率(例如640x480)的USB摄像机和扫描条形码QR码从中获取图像。
要模拟该过程,我们首先编写一个Python脚本以捕获包含USB摄像机QR码的连续帧并将其保存到文件夹中。
import cv2 as cv
from dbr import *
capture = cv.VideoCapture(0)
if not capture.isOpened():
print("Cannot open camera")
exit()
BarcodeReader.init_license("DLS2eyJoYW5kc2hha2VDb2RlIjoiMjAwMDAxLTE2NDk4Mjk3OTI2MzUiLCJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSIsInNlc3Npb25QYXNzd29yZCI6IndTcGR6Vm05WDJrcEQ5YUoifQ==")
reader = BarcodeReader()
index = 0
while True:
frame = capture.read()[1]
cv.imshow("frame", frame)
if cv.waitKey(1) == ord('q'):
break
results = reader.decode_buffer(frame)
if results != None and len(results) > 0:
cv.imwrite('images/' + str(index) + '.png', frame)
index += 1
if index == 30:
break
在Windows上运行脚本,然后将图像保存到名为images
的文件夹。
然后,我们编写另一个Python脚本以使用PIL
读取图像,并用DynamSoft Barcode读取器解码条形码。
#!/usr/bin/env python3
import os
from dbr import *
import dbr
import time
from PIL import Image
def main():
print('version: ' + dbr.__version__)
BarcodeReader.init_license("DLS2eyJoYW5kc2hha2VDb2RlIjoiMjAwMDAxLTE2NDk4Mjk3OTI2MzUiLCJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSIsInNlc3Npb25QYXNzd29yZCI6IndTcGR6Vm05WDJrcEQ5YUoifQ==")
reader = BarcodeReader()
reader.init_runtime_settings_with_file('faster.json', conflict_mode=EnumConflictMode.CM_OVERWRITE)
# read file list
folder = 'images'
target_dir = os.path.join(os.getcwd(), folder)
if os.path.exists(target_dir):
filelist = os.listdir('images')
index = 0
while index < 5:
file = filelist[index]
filapath = os.path.join(target_dir, file)
index += 1
with Image.open(filapath) as im:
try:
start_time = time.time()
results = reader.decode_buffer_manually(im.tobytes(), im.width, im.height, im.width * 3, EnumImagePixelFormat.IPF_RGB_888)
elapsed_time = time.time() - start_time
print(file + ", elapsed time: " + str(round(elapsed_time * 1000)) + "ms, " + ' results: ' + str(len(results)))
if results != None:
for result in results:
print(result.barcode_format_string + ': ' + result.barcode_text)
else:
print(' results: 0')
except Exception as err:
print(err)
if __name__ == '__main__':
main()
我们可以将当前的Windows文件夹安装到Docker容器中并在容器中运行脚本。
docker run --platform linux/arm64 -it --rm -v ${pwd}:/usr/src/myapp -w /usr/src/myapp <IMAGE-NAME> python pillow_test.py
docker run --platform linux/arm/v7 -it --rm -v ${pwd}:/usr/src/myapp -w /usr/src/myapp <IMAGE-NAME> python pillow_test.py
还有一个问题:CPU如何影响解码速度?默认硬件资源可以在设置中配置。
默认情况下,每个容器对主机CPU周期的访问是无限的。
尽管无法更改Docker中的CPU速度,但我们可以使用--cpuset-cpus来限制CPU内核的数量。
例如,我们可以将CPU内核限制为2并在容器中运行脚本以检查性能差异。
docker run --cpuset-cpus="0,1" --platform linux/arm64 -it --rm -v ${pwd}:/usr/src/myapp -w /usr/src/myapp yushulx/dbr-arm64:1.0 python pillow_test.py
nproc
命令可用于验证核心号码:
docker run --cpuset-cpus="0,1" --platform linux/arm64 -it --rm -v ${pwd}:/usr/src/myapp -w /usr/src/myapp yushulx/dbr-arm64:1.0 nproc
2
覆盆子Pi模拟器
为了使模拟环境更加现实,我们可以使用dockerpi效仿不同的Raspberry Pi模型。
docker run -it lukechilds/dockerpi pi2
pi@raspberrypi:~$ lscpu
Architecture: armv7l
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Vendor ID: ARM
Model: 5
Model name: Cortex-A7
Stepping: r0p5
CPU max MHz: 700.0000
CPU min MHz: 700.0000
BogoMIPS: 125.00
Flags: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
docker run -it lukechilds/dockerpi pi3
pi@raspberrypi:~$ lscpu
Architecture: aarch64
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Vendor ID: ARM
Model: 4
Model name: Cortex-A53
Stepping: r0p4
CPU max MHz: 700.0000
CPU min MHz: 700.0000
BogoMIPS: 125.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
源代码
https://github.com/yushulx/docker-arm64-arm32-python-barcode-detection