Click here to Skip to main content
Click here to Skip to main content

Reading Barcodes from an Image - II

By , 21 Aug 2010
 
Sample Image

Introduction

I recently ran across Benjamin Liedblad's article on reading barcode strings from images. The code was good, but not very useful in the real world. I thought my additions had a place here.

Berend Engelbrecht has vastly improved this project. His new version can be found at BarcodeImaging3.aspx.

Background

Liedblad's barcode reader has two significant flaws:

  • It only reads right-side up barcodes (as he mentioned in his "todo").
  • It assumes that there is nothing other than the barcode in the image.

Frequently, we need to read a barcode from a page full of other text. This is what I set about to do.

Using the Code

First of all, you should check out the original article to see how the barcode reading works. Much of the code is left unchanged.

Changes:

  • Since the barcode we are looking for may not be at the beginning of the text line that we scan, we can't just scan by blocks of 9 'characters'. Instead, we walk along the scanned pattern one 'bar' at a time, testing it and the 8 bars after it to see if they form a character. If we find a real character, then we skip over the character pattern and begin again.
  • Since there are text and other distractions on many pages, we need to cut the page up into sections and look for barcodes in each section. I've found that 50 is a good number of sections. While this seems like a lot, it's enough to ensure that we get the barcode we're looking for. Your mileage may vary. To this end, I added a startheight and endheight to ReadCode39(). Then we just need to calculate where each section begins and ends. This is accomplished easily in a for loop:
    for (int i=0; i < numscans; i++)
    {
        read = ReadCode39(bmp,i * (bmp.Height / numscans), 
               (i * (bmp.Height / numscans))+ (bmp.Height / numscans));
        [...]
    }
  • We need to check all four page orientations, which is handled easily with .NET's Bitmap control:
    for (int i=0; i < 4; i++)
    {
        bmp.RotateFlip(System.Drawing.RotateFlipType.Rotate90FlipNone);
        VScanPageCode39(ref CodesRead, bmp,numscans);
    }

    You can, of course not use this if you know that all of your pages are the right way up.

  • Finally, since we scan so many times and receive so many barcodes (including the backwards version of what we are looking for), we need to store all of the barcodes that we found. For this, I decided to use an ArrayList. The code currently returns all of the barcodes, but since most people supply some sort of pattern to their code (usually beginning and ending with astericks "*"), it's easy enough to pick out the right one.

Running the Demo

When you run the demo and load "SamplePage.jpg", first perform "Scan Barcode". This is essentially identical to Liedblad's original code. You will get "*JR7". Not very helpful. Then perform "Scan Page". Now you have a list of barcodes, one of which is the one you want (*surprise*)... and one is its mirror image (P4 9V*VK P). As you can see, it's pretty easy to pick out what you need.

History

  • 5-15-05: Original
  • 8-20-10: Article updated

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

qlipoth
Software Developer (Senior) InGage Networks
United States United States
Member
James is currently a Software developer after a detour from that profession into IT because he 'didn't want to sit in a cubicle and wanted to deal with people.' He has since learned that people are stupid, and enjoys his cubicle greatly.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 5membercsharpbd28 Nov '12 - 23:05 
Nice!!!
QuestionExcelentmemberSergey Lapp28 Sep '12 - 8:04 
)
GeneralMy vote of 5membermanoj kumar choubey26 Feb '12 - 19:59 
Nice
GeneralMy vote of 5membersw_tech12322 Jun '11 - 23:26 
Very Nice for who is beginner.
GeneralBarcode reader for PDFmemberMarkNaff17 Aug '10 - 13:55 
Can this be modified to work with PDF files OR has anyone seen a similar project that does this?
 
I would prefer if it were in my primary vb.net language but will take whatever...
 
Thanks All
AnswerRe: Barcode reader for PDFmemberqlipoth20 Aug '10 - 3:56 
There are various libraries that will convert PDF's to images, and there is probably a way to do it directly, but I don't know of it.
GeneralRe: Barcode reader for PDFmemberMarkNaff20 Aug '10 - 4:06 
Thanks for the response. That was one of my thoughts too.
 
We need to keep the PDFs So, I'm concerned with the amount of processing time (Convert to image, process image, delete image) and or memory space (Convert all then delete after processing) available. We have thousands of documents and more coming in all the time.
 
If you find anything more on "doing it directly" let me know. I'm still looking. I think I've found an inexpensive off the shelf product that might do what I need (SimpleIndex), but, I still would like to know how to do it.
 
Thanks again.
GeneralRe: Barcode reader for PDFmemberqlipoth20 Aug '10 - 4:12 
I'm unlikely to find anything. I'm no longer working for a company that has anything to do with barcodes.
 
On that topic, If you decide to do this kind of work yourself, you should really use Berend's code and not mine. He made a lot of significant improvements on my code. His version is here
GeneralRe: Barcode reader for PDFmemberMarkNaff20 Aug '10 - 4:15 
Thanks Agian!!
GeneralRe: Barcode reader for PDFmemberRene Pilon12 Mar '12 - 5:03 
You'll have to extract the image stream objects from each page in the PDF.
 
Another way - use Ghostscript to convert the PDF to multiple JPGs and process those.

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130523.1 | Last Updated 21 Aug 2010
Article Copyright 2005 by qlipoth
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid