ByteScout Barcode Reader SDK - C++ (Unmanaged) - Image Preprocessing Filters - ByteScout
Announcement
Our ByteScout SDK products are sunsetting as we focus on expanding new solutions.
Learn More Open modal
Close modal
Announcement Important Update
ByteScout SDK Sunsetting Notice
Our ByteScout SDK products are sunsetting as we focus on our new & improved solutions. Thank you for being part of our journey, and we look forward to supporting you in this next chapter!

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