How to Build C/C++ Barcode and QR Code Reader App on Raspberry Pi
Dynamsoft C++ Barcode SDK supports ARM32 and ARM64. This article goes through the steps to create C/C++ barcode and QR code reader application on Raspberry Pi. To get better performance, it is recommended to use Raspberry Pi 4. The project build can work on both ARM32 and ARM64 Raspberry Pi OS.
About Dynamsoft Barcode Reader SDK
-
Download Dynamsoft C++ Barcode SDK v9.x
-
Apply for a 30-day free trial license to activate the SDK.
Requirements
- CMake
sudo apt update sudo apt install -y cmake
Building Barcode and QR Code Reader on Raspberry Pi
-
Create a new C/C++ project with a
CMakeLists.txt
file. -
Configure the
CMakeLists.txt
file.cmake_minimum_required (VERSION 2.6) project (BarcodeReader) SET(CMAKE_CXX_FLAGS "-std=c++11 -O3 -Wl,-rpath=$ORIGIN") SET(CMAKE_INSTALL_RPATH "$ORIGIN") SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) if(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l OR ARM32_BUILD) MESSAGE( STATUS "Link directory: ${PROJECT_SOURCE_DIR}/platforms/arm32/" ) link_directories("${PROJECT_SOURCE_DIR}/platforms/arm32/") elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) MESSAGE( STATUS "Link directory: ${PROJECT_SOURCE_DIR}/platforms/aarch64/" ) link_directories("${PROJECT_SOURCE_DIR}/platforms/aarch64/") endif() include_directories("${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/include/") add_executable(${PROJECT_NAME} BarcodeReader.cxx) target_link_libraries (${PROJECT_NAME} "DynamsoftBarcodeReader" pthread) if(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l OR ARM32_BUILD) install (DIRECTORY "${PROJECT_SOURCE_DIR}/platforms/arm32/" DESTINATION ${PROJECT_SOURCE_DIR}/dist) elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) install (DIRECTORY "${PROJECT_SOURCE_DIR}/platforms/aarch64/" DESTINATION ${PROJECT_SOURCE_DIR}/dist) endif()
We use
rpath
to make the library search path to be the same as the executable. After runningcmake --install .
, the library files and executable files will be copied to thedist
directory for distribution. -
In
BarcodeReader.cxx
, include theDynamsoftBarcodeReader.h
file.#include "DynamsoftBarcodeReader.h"
-
Set the license key for global access. You do not need to set the license key for each instance of the barcode reader.
if (license) { char errorMsgBuffer[512]; // Click https://www.dynamsoft.com/customer/license/trialLicense/?product=dbr to get a trial license. DBR_InitLicense("DLS2eyJoYW5kc2hha2VDb2RlIjoiMjAwMDAxLTE2NDk4Mjk3OTI2MzUiLCJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSIsInNlc3Npb25QYXNzd29yZCI6IndTcGR6Vm05WDJrcEQ5YUoifQ==", errorMsgBuffer, 512); printf("DBR_InitLicense: %s\n", errorMsgBuffer); }
-
Initialize the barcode reader object:
void *reader = DBR_CreateInstance();
-
Configure the parameters of the barcode reader.
char sError[512]; PublicRuntimeSettings *runtimeSettings = new PublicRuntimeSettings(); DBR_GetRuntimeSettings(reader, runtimeSettings); runtimeSettings->maxAlgorithmThreadCount = 1; runtimeSettings->barcodeFormatIds = BF_ALL; DBR_UpdateRuntimeSettings(reader, runtimeSettings, sError, 512); delete runtimeSettings;
- Call a decoding method based on your input source.
- DecodeFile(): Decode barcodes from a specified image file.
- DecodeFileInMemory(): Decode barcodes from an image file in memory.
- DecodeBuffer(): Decode barcodes from raw buffer.
-
Get the decoding results.
TextResultArray *paryResult = NULL; DBR_GetAllTextResults(reader, &paryResult); if (paryResult->resultsCount == 0) { printf("No barcode found.\n"); DBR_FreeTextResults(&paryResult); return -1; } printf("Thread id: %d. Total barcode(s) found: %d. Time cost: %d ms\n\n", thread_id, paryResult->resultsCount, timecost); for (int index = 0; index < paryResult->resultsCount; index++) { printf("Barcode %d:\n", index + 1); printf(" Type: %s\n", paryResult->results[index]->barcodeFormatString); printf(" Text: %s\n", paryResult->results[index]->barcodeText); } DBR_FreeTextResults(&paryResult); DBR_DestroyInstance(reader);
-
Build the project and run the barcode and QR code reader in terminal.
cmake --build . --config Release ./BarcodeReader ../images/AllSupportedBarcodeTypes.png