Ubuntu 18.04/20.04 下 编译zxing-cpp for python(支持venv)

zxing-cpp简介

zxing是识别生成二维码的工具库,是一个java库。java的JRE开销其实不小,为了加快效率,zxing-cpp是不错的选择。

zxing-cpp,又有多个变种。这里选择zxing官方库推荐的“recent cpp port”库:

image-20210118171552311

准备工作

  • 工作目录创建

    1
    2
    3
    4
    5
    6
    7
    8
    mkdir /srv/zxing-env -p
    cd /srv/zxing-env
    python3 -m venv venv
    . venv/bin/activate # 之后所有的安装都在这个python虚拟环境中
    # 安装几个python的依赖
    # numpy (1.19.5)
    # Pillow (8.1.0)
    pip install numpy pillow
  • 安装必要依赖

    ubuntu 18.04的cmake版本过于低,不能通过apt安装。(zxing-cpp最低要求3.14,18.04自带3.10)

    1
    2
    3
    4
    # --- 20.04 -----
    sudo apt install cmake
    # --- 18.04 -----
    sudo apt install libssl-dev
  • 获取相关代码

    1
    2
    3
    git clone https://github.com/nu-book/zxing-cpp.git
    # --- 18.04 -----
    wget https://github.com/Kitware/CMake/releases/download/v3.19.3/cmake-3.19.3.tar.gz

编译zxing-cpp

  • 18.04 需要先编译一个合适的cmake(20.04不需要这个操作)

    1
    2
    3
    4
    5
    6
    sudo apt remove --purge --auto-remove cmake
    tar xvzf cmake-3.19.3.tar.gz
    cd cmake-3.19.3/
    ./bootstrap
    make -j$(nproc)
    sudo make install

    测试下:(需要重启下终端)

    1
    cmake --version

    应该是 3.19.3.

  • build目录

    1
    2
    3
    cd /srv/zxing-env/zxing-cpp
    mkdir build
    cd build
  • 编译生成

    1
    2
    3
    4
    #需要更改CMakeLists.txt
    #打开python支持
    -- option (BUILD_PYTHON_MODULE "Build the python module" OFF)
    ++ option (BUILD_PYTHON_MODULE "Build the python module" ON)
1
2
cmake -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" ..
make

安装python wrapper

1
2
cd /srv/zxing-cpp/wrappers/python
python setup.py install

测试下,看看效果:

1
2
3
4
5
6
7
8
pip list
numpy (1.19.5)
Pillow (8.1.0)
pip (9.0.1)
pkg-resources (0.0.0)
setuptools (39.0.1)
zxing (0.0.1) #<---- 成功了

测试

1
2
3
4
5
6
7
8
9
Python 3.6.9 (default, Oct 8 2020, 12:12:24)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import zxing
>>> from PIL import Image
>>> img = Image.open('b.png')
>>> r = zxing.read_barcode(img)
>>> print(r.text, r.format, r.position)
https://www.baidu.com BarcodeFormat.QRCode 251x126 366x143 339x261 230x250

搞定。配合下Django之类的,你也可以实现个在线二维码识别服务了。

2021-01-26更新:

貌似目前不支持识别Multi-Barcode。不过还好,够我用了。