如何在Docker容器中运行ARM32和ARM64 python条形码读取器
#编程 #python #docker #raspberrypi

这些只是支持 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图像的步骤

  1. Install Docker Desktop for Windows.
  2. 安装qemu-user-static

    docker run --rm --privileged multiarch/qemu-user-static:register --reset
    
  3. 创建一个将基本图像指定为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的替代方法。

  4. 为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如何影响解码速度?默认硬件资源可以在设置中配置。

docker windows configuration

默认情况下,每个容器对主机CPU周期的访问是无限的。

docker container cpu speed

尽管无法更改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