ByteScout Barcode Reader SDK – C++ (Unmanaged) – Image Preprocessing Filters

  • Home
  • /
  • Articles
  • /
  • ByteScout Barcode Reader SDK – C++ (Unmanaged) – Image Preprocessing Filters

ByteScout Barcode Reader SDK – C++ (Unmanaged) – Image Preprocessing Filters

ImagePreprocessingFilters.cpp

#include "stdafx.h"

///
/// This example demonstrates the use of image filters to improve the decoding confidence or speed.
///

#import "c:\\Program Files\\Bytescout BarCode Reader SDK\\net2.00\\Bytescout.BarCodeReader.tlb" raw_interfaces_only

using namespace Bytescout_BarCodeReader;

void PrintFoundBarcodes(IReaderPtr pIReader);

int _tmain(int argc, _TCHAR* argv[])
{
	// Initialize COM.
	HRESULT hr = CoInitialize(NULL);

	// Create the interface pointer.
	IReaderPtr pIReader(__uuidof(Reader));

	// set the registration name and key
	_bstr_t registrationName(L"DEMO");
	pIReader->put_RegistrationName(registrationName);

	_bstr_t registrationKey(L"DEMO");
	pIReader->put_RegistrationKey(registrationKey);

	// Set barcode type to find
	_BarcodeTypeSelectorPtr pBarcodeTypesToFind;
	pIReader->get_BarcodeTypesToFind(&pBarcodeTypesToFind);
	pBarcodeTypesToFind->put_Code128(VARIANT_TRUE);

	
	// Get image filters collection
	_ImagePreprocessingFiltersCollection* pIImageFilters;
	pIReader->get_ImagePreprocessingFilters(&pIImageFilters);

	
	// WORKING WITH LOW CONTRAST BARCODE IMAGES

	pIImageFilters->AddContrast(40);

	// Add contrast adjustment for low-contrast image
	_bstr_t sampleFile1(L".\\low-contrast-barcode.png");	
	wprintf(L"Image \"%s\"\n", static_cast<wchar_t*>(sampleFile1));

	pIReader->ReadFromFile(sampleFile1);
	PrintFoundBarcodes(pIReader);

	pIImageFilters->Clear();


	// WORKING WITH NOISY BARCODE IMAGES

	// Add median filter to lower a noise
	pIImageFilters->AddMedian();

	_bstr_t sampleFile2(L".\\noisy-barcode.png");
	wprintf(L"Image \"%s\"\n", static_cast<wchar_t*>(sampleFile2));

	pIReader->ReadFromFile(sampleFile2);
	PrintFoundBarcodes(pIReader);

	pIImageFilters->Clear();


	// WORKING WITH DENSE AND ILLEGIBLE BARCODES

	// Add the scale filter to enlarge the barcode to make gaps between bars more distinguishable
	pIImageFilters->AddScale_2(2.0);

	_bstr_t sampleFile3(L".\\too-dense-barcode.png");
	wprintf(L"Image \"%s\"\n", static_cast<wchar_t*>(sampleFile3));

	pIReader->ReadFromFile(sampleFile3);
	PrintFoundBarcodes(pIReader);

	pIImageFilters->Clear();


	// REMOVE EMPTY MARGINS FROM IMAGE TO SPEED UP THE PROCESSING

	// Add the crop filter to cut off empty margins from the image.
	// This will not improve the recognition quality but may speed up the processing 
	// if you enabled multiple barcode types to search. 
	pIImageFilters->AddCropDark();

	_bstr_t sampleFile4(L".\\barcode-with-large-margins.png");
	wprintf(L"Image \"%s\"\n", static_cast<wchar_t*>(sampleFile4));

	pIReader->ReadFromFile(sampleFile4);
	PrintFoundBarcodes(pIReader);

	pIImageFilters->Clear();


	
	// Uninitialize COM.
	CoUninitialize();

	// Wait until user press any key
	system("pause");

	return 0;
}

void PrintFoundBarcodes(IReaderPtr pIReader)
{
	// Get found barcode count
	long count;
	pIReader->get_FoundCount(&count);

	// Get found barcode information
	for (int i = 0; i < count; i++)
	{
		SymbologyType type;
		pIReader->GetFoundBarcodeType(i, &type);
		wprintf(L"Barcode type: %d\n", type);

		float confidence;
		pIReader->GetFoundBarcodeConfidence(i, &confidence);
		wprintf(L"Barcode confidence: %f\n", confidence);

		BSTR bstrValue;
		pIReader->GetFoundBarcodeValue(i, &bstrValue);
		wprintf(L"Barcode value: %s\n", bstrValue);
		::SysFreeString(bstrValue);

		wprintf(L"\n");
	}

	if (count == 0)
	{
		wprintf(L"No barcodes found.\n");
	}
}


stdafx.cpp

// stdafx.cpp : source file that includes just the standard includes
// CPPExample.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file


  Click here to get your Free Trial version of the SDK

Tutorials:

prev
next