Things to Do with DBR 6.0 and Python Barcode Extension
Dynamsoft Barcode Reader 6.0 SDK is the best version ever. It dramatically improved barcode detecting speed and accuracy, especially for multiple barcodes per frame. Since there are some new APIs and parameters, I have to update both C++ and Python code for the Python barcode extension that was built with DBR 5.2 correspondingly.
Download
- Dynamsoft Barcode Reader 6.0
-
NumPy
pip install numpy
Setup.py for Building and Installing Python Barcode Extension
Import relevant modules.
from distutils.core import setup, Extension
import sys, os, numpy
from distutils.command.install import install
Dynamically get the header file directory of NumPy.
numpy_include = os.path.join(os.path.dirname(numpy.__file__), "core", "include", "numpy")
Set the library (.lib and .dll) paths of Dynamsoft Barcode Reader. To build the extension yourself, you have to replace following code with yours.
dbr_lib_dir = r'e:\Program Files (x86)\Dynamsoft\Barcode Reader 6.0\Components\C_C++\Lib'
dbr_dll = r'e:\Program Files (x86)\Dynamsoft\Barcode Reader 6.0\Components\C_C++\Redist\x86\DynamsoftBarcodeReaderx86.dll'
Specify parameters for Python extension.
module_dbr = Extension('dbr', sources=['dbr.c'], include_dirs=[
numpy_include], library_dirs=[dbr_lib_dir], libraries=['DBRx86'])
Create a customized class to extending installation command.
class CustomInstall(install):
def run(self):
install.run(self)
import shutil
from distutils.sysconfig import get_python_lib
src = dbr_dll
dst = get_python_lib()
shutil.copy2(src, dst)
setup(name='dbr',
version='6.0',
description='Python barcode extension',
author='Xiao Ling',
author_email='xiao@dynamsoft.com',
url='https://www.dynamsoft.com/Products/Dynamic-Barcode-Reader.aspx',
license = 'https://www.dynamsoft.com/Products/barcode-reader-license-agreement.aspx',
ext_modules=[module_dbr],
long_description='Dynamsoft Barcode Reader is a software development toolkit which enables barcode recognition of Code 39, Code 129, QR Code, DataMatrix, PDF417.',
platforms=['Windows'],
cmdclass={'install': CustomInstall}
)
What does the customized class do? Distutils will build and install dbr.pyd to Python library directory but not include dependent DynamsoftBarcodeReaderx86.dll. I used to manually copy the file to the Python library directory, though, a smarter way is to trigger a post-install event and copy the file automatically.
Parameter Templates for Reading Barcode
Parameter template is a new feature of DBR 6.0. Instead of hardcoding parameters, we can now just modify a JSON file to make the application run differently without re-compile the source code.
Writing less code is cool.
Create a function to load the template.
static PyObject *
loadSettings(PyObject *self, PyObject *args)
{
if (!createDBR())
{
return NULL;
}
char *pszSettingFile;
if (!PyArg_ParseTuple(args, "s", &pszSettingFile)) {
return NULL;
}
char szErrorMsg[256];
int ret = DBR_LoadSettingsFromFile(hBarcode, pszSettingFile, szErrorMsg, 256);
return Py_BuildValue("i", ret);
}
Create test.py. Put templates folder, which contains default.settings.json and custom.json, in the same directory. The default.settings.json file is for global settings. Usually, we do not need to edit it.
import os
import dbr
import cv2
def loadSettings(setting_file):
dbr.loadSettings(setting_file)
def initLicense(license):
dbr.initLicense(license)
def decodeFile(fileName):
formats = 0x3FF | 0x2000000 | 0x8000000 | 0x4000000 # 1D, QRCODE, PDF417, DataMatrix
results = dbr.decodeFile(fileName, formats, 'CUSTOM')
for result in results:
print("barcode format: " + result[0])
print("barcode value: " + result[1])
def decodeBuffer(image):
formats = 0x3FF | 0x2000000 | 0x8000000 | 0x4000000 # 1D, QRCODE, PDF417, DataMatrix
results = dbr.decodeBuffer(image, formats, 'CUSTOM')
for result in results:
print("barcode format: " + result[0])
print("barcode value: " + result[1])
if __name__ == "__main__":
import sys
if sys.version_info < (3, 0):
barcode_image = raw_input("Enter the barcode file: ")
else:
barcode_image = input("Enter the barcode file: ")
if not os.path.isfile(barcode_image):
print("It is not a valid file.")
else:
initLicense("t0068MgAAABt/IBmbdOLQj2EIDtPBkg8tPVp6wuFflHU0+y14UaUt5KpXdhAxlERuDYvJy7AOB514QK4H50mznL6NZtBjITQ=")
setting_file = os.path.join(os.getcwd(), 'templates', 'default.settings.json')
loadSettings(setting_file)
decodeFile(barcode_image)
image = cv2.imread(barcode_image, 1)
decodeBuffer(image)