Raspberry Pi Barcode Scanner with Webcam and Python

In this post, we will talk about building a Raspberry Pi barcode scanner with a USB webcam and Python by using Dynamsoft’s C/C++ barcode reader SDK.

Watch the video and see how the Raspberry Pi Barcode Scanner works:

How to Use Webcam with Raspberry Pi

To check whether the Linux system can identify the USB webcam, use the following commands:

lsusb
ls /dev/video*

Install fswebcam:

sudo apt-get install fswebcam

Take a picture from webcam:

fswebcam test.jpg

If the webcam can work well, you can take the next step.

Building Custom C/C++ Extension for Python

Get Dynamsoft Barcode Reader C/C++ SDK for Raspberry Pi Beta
Download free trial >

Extract the package and generate the symbolic link:

sudo ln -s <Your library path>/libDynamsoftBarcodeReader.so /usr/lib/libDynamsoftBarcodeReader.so

Create dbr.c in which you need to glue Dynamsoft Barcode Reader APIs to Python native code:

static PyObject *
initLicense(PyObject *self, PyObject *args)
{
    char *license;
    if (!PyArg_ParseTuple(args, "s", &license)) {
    return NULL;
    }
    printf("License: %s\n", license);
    int ret = DBR_InitLicense(license);
    return Py_BuildValue("i", ret);
}
 
static PyObject *
decodeFile(PyObject *self, PyObject *args)
{
    char *pFileName;
    if (!PyArg_ParseTuple(args, "s", &pFileName)) {
        return NULL;
    }
     
    // Dynamsoft Barcode Reader: init
    __int64 llFormat = (OneD | QR_CODE | PDF417 | DATAMATRIX);
    int iMaxCount = 0x7FFFFFFF;
    ReaderOptions ro = {0};
    pBarcodeResultArray pResults = NULL;
     
    ro.llBarcodeFormat = llFormat;
    ro.iMaxBarcodesNumPerPage = iMaxCount;
 
    // Decode barcode image
    int ret = DBR_DecodeFile(pFileName, &ro, &pResults);
    printf("DecodeFile ret: %d\n", ret);
     
    {
        int count = pResults->iBarcodeCount;
        pBarcodeResult* ppBarcodes = pResults->ppBarcodes;
        pBarcodeResult tmp = NULL;
 
        PyObject* list = PyList_New(count);
        PyObject* result = NULL;
        int i = 0;
        for (; i < count; i++)
        {
            tmp = ppBarcodes[i];
            result = PyString_FromString(tmp->pBarcodeData);
            PyList_SetItem(list, i, Py_BuildValue("iN", (int)tmp->llFormat, result));
        }
        // release memory
        DBR_FreeBarcodeResults(&pResults);
        return list;
    }
     
    return Py_None;
}
 
static PyMethodDef Methods[] =
{
     {"initLicense", initLicense, METH_VARARGS, NULL},
     {"decodeFile", decodeFile, METH_VARARGS, NULL},
     {NULL, NULL, 0, NULL}
};
 
PyMODINIT_FUNC
initdbr(void)
{
     (void) Py_InitModule("dbr", Methods);

Create setup.py:

from distutils.core import setup, Extension
 
module_dbr = Extension('dbr', 
                        sources = ['dbr.c'], 
                        include_dirs=['/home/pi/Desktop/dbr/include'],
                        library_dirs=['/home/pi/Desktop/dbr/lib'],
                        libraries=['DynamsoftBarcodeReader'])
 
setup (name = 'DynamsoftBarcodeReader',
        version = '1.0',
        description = 'Python barcode extension',
        ext_modules = [module_dbr])

Build and install the Python module:

python setup.py build
sudo python setup.py install

Note: if you see the error message “fatal error: Python.h: No such file or directory“, please install python-dev:

sudo apt-get install python-dev

Installing OpenCV on Raspbian Jessie

To capture images from a webcam, we can use OpenCV. Read the excellent article that demonstrates how to install OpenCV on Raspbian Jessie.

Raspberry Pi Barcode Scanner in Python

Create cam_reader.py:

cv2.namedWindow("preview")
    vc = cv2.VideoCapture(0)
    cache = ""
    results = None
 
    if vc.isOpened(): # try to get the first frame
        initLicense("64E4EE3532B813C8EA8EA5F34E7B4528")
        rval, frame = vc.read()
    else:
        rval = False
 
    while rval:
        cv2.imshow("preview", frame)
        rval, frame = vc.read()
 
        key = cv2.waitKey(20)
        if key == ord('c'):
            cache = getImageName()
            cv2.imwrite(cache, frame)
            results = decodeFile(cache)
            print "Total count: " + str(len(results))
            for result in results:
                print "barcode format: " + formats[result[0]]
                print "barcode value: " + result[1] + "\n*************************"
        elif key == 27:
            break
 
    cv2.destroyWindow("preview")

Run the script:

python cam_reader.py

Capture and read barcode by pressing key ‘C’.

Raspberry Pi Barcode Scanner with Webcam and Python

Source Code

https://github.com/dynamsoftlabs/webcam-barcode-scanner-for-pi

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Subscribe Newsletter

Subscribe to our mailing list to get the monthly update.

Subscribename@email.com