Click here to Skip to main content
11,502,547 members (65,738 online)
Click here to Skip to main content

Reading Barcodes from an Image - II

, 21 Aug 2010 CPOL 227.5K 20.5K 201
Rate this:
Please Sign up or sign in to vote.
An example of how to process an image for barcode strings
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)

Share

About the Author

qlipoth
Software Developer (Senior) InGage Networks
United States United States
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.

Comments and Discussions

 
QuestionOMR Sheet inside that how to read marks Pin
Member 1017743627-Mar-14 3:11
memberMember 1017743627-Mar-14 3:11 
Questionit is even not working for code39 Pin
heemanshubhalla9-Feb-14 0:28
memberheemanshubhalla9-Feb-14 0:28 
Generalproblem Pin
AnkurGupta OM16-Jun-13 22:22
memberAnkurGupta OM16-Jun-13 22:22 
GeneralRe: problem Pin
qlipoth17-Jun-13 2:31
memberqlipoth17-Jun-13 2:31 
GeneralRe: problem Pin
AnkurGupta OM17-Jun-13 17:01
memberAnkurGupta OM17-Jun-13 17:01 
Generalproblem Pin
AnkurGupta OM16-Jun-13 22:20
memberAnkurGupta OM16-Jun-13 22:20 
GeneralMy vote of 5 Pin
csharpbd28-Nov-12 23:05
membercsharpbd28-Nov-12 23:05 
QuestionExcelent Pin
Sergey Lapp28-Sep-12 8:04
memberSergey Lapp28-Sep-12 8:04 
GeneralMy vote of 5 Pin
manoj kumar choubey26-Feb-12 19:59
membermanoj kumar choubey26-Feb-12 19:59 
GeneralMy vote of 5 Pin
sw_tech12322-Jun-11 23:26
membersw_tech12322-Jun-11 23:26 
GeneralBarcode reader for PDF Pin
MarkNaff17-Aug-10 13:55
memberMarkNaff17-Aug-10 13:55 
AnswerRe: Barcode reader for PDF Pin
qlipoth20-Aug-10 3:56
memberqlipoth20-Aug-10 3:56 
GeneralRe: Barcode reader for PDF Pin
MarkNaff20-Aug-10 4:06
memberMarkNaff20-Aug-10 4:06 
GeneralRe: Barcode reader for PDF Pin
qlipoth20-Aug-10 4:12
memberqlipoth20-Aug-10 4:12 
GeneralRe: Barcode reader for PDF Pin
MarkNaff20-Aug-10 4:15
memberMarkNaff20-Aug-10 4:15 
GeneralRe: Barcode reader for PDF Pin
Rene Pilon12-Mar-12 5:03
memberRene Pilon12-Mar-12 5:03 
GeneralHelp for Barcode 39 Extension Pin
naorem24-Jan-10 19:45
membernaorem24-Jan-10 19:45 
NewsPublished new CodeProject version: Reading Barcodes from an Image - III Pin
Berend Engelbrecht5-Oct-09 10:56
memberBerend Engelbrecht5-Oct-09 10:56 
NewsModifications to prevent "false positives" for Code39, improved speed, EAN and Code128 support Pin
Berend Engelbrecht2-Oct-09 5:19
memberBerend Engelbrecht2-Oct-09 5:19 
GeneralThanks Pin
mr_squall26-Aug-09 21:54
membermr_squall26-Aug-09 21:54 
QuestionAny ideas on how to get this code to work in Windows Mobile? Pin
s1dd29-May-09 8:01
members1dd29-May-09 8:01 
AnswerRe: Any ideas on how to get this code to work in Windows Mobile? Pin
s1dd29-May-09 8:14
members1dd29-May-09 8:14 
GeneralRe: Any ideas on how to get this code to work in Windows Mobile? Pin
Berend Engelbrecht3-Oct-09 5:24
memberBerend Engelbrecht3-Oct-09 5:24 
QuestionAnyone to give me how to read code 128 barcode from an image ? Pin
Member 45876798-Dec-08 8:12
memberMember 45876798-Dec-08 8:12 
GeneralCan´t read codebars generated using Word... and other tools Pin
neptas13-Feb-08 6:50
memberneptas13-Feb-08 6:50 
GeneralRe: Can´t read codebars generated using Word... and other tools Pin
Feurich26-Mar-08 1:12
memberFeurich26-Mar-08 1:12 
GeneralRe: Can´t read codebars generated using Word... and other tools Pin
Berend Engelbrecht3-Oct-09 4:58
memberBerend Engelbrecht3-Oct-09 4:58 
GeneralUpdating to read code 128 Pin
cameron molyneux22-Apr-07 17:53
membercameron molyneux22-Apr-07 17:53 
GeneralSome question. Pin
Pham Tuan21-Sep-06 21:23
memberPham Tuan21-Sep-06 21:23 
AnswerRe: Some question. Pin
qlipoth22-Sep-06 13:37
memberqlipoth22-Sep-06 13:37 
GeneralRe: Some question. Pin
Pham Tuan22-Sep-06 15:43
memberPham Tuan22-Sep-06 15:43 
GeneralRe: Some question. Pin
vbdotnetcoder200525-Sep-06 8:35
membervbdotnetcoder200525-Sep-06 8:35 
I've had this code in production for quite sometime now, what I have noticed is that if you scan just the portion of the image that the barcode should be in it increases your chances of reading the barcode. I have noticed some other barcode commerical barcode reading libraries that have an algorithmn to find the "region" in to which the barcode is located. I'm not sure how one would go about coding this but it would defiantly increase the percentage of successful barcode reads.


GeneralReg:Generating BarCode.. Pin
Kumar Murugesan26-Jul-06 4:48
memberKumar Murugesan26-Jul-06 4:48 
GeneralRe: Reg:Generating BarCode.. Pin
qlipoth1-Aug-06 4:57
memberqlipoth1-Aug-06 4:57 
GeneralRe: Reg:Generating BarCode.. Pin
kirankumarannigeri14-Nov-07 22:36
memberkirankumarannigeri14-Nov-07 22:36 
GeneralImplementation Tips Pin
vbdotnetcoder20052-Feb-06 5:47
membervbdotnetcoder20052-Feb-06 5:47 
GeneralRe: Implementation Tips Pin
Suntai5-May-06 2:32
memberSuntai5-May-06 2:32 
GeneralRe: Implementation Tips Pin
vbdotnetcoder200510-May-06 10:24
membervbdotnetcoder200510-May-06 10:24 
GeneralGreat topic Pin
MichaelWells6-Jul-05 1:28
memberMichaelWells6-Jul-05 1:28 
GeneralRe: Great topic Pin
vbdotnetcoder200516-Jan-06 8:41
membervbdotnetcoder200516-Jan-06 8:41 
GeneralRe: Great topic Pin
Ollipolli20-Jan-06 2:31
memberOllipolli20-Jan-06 2:31 
GeneralRe: Great topic Pin
vbdotnetcoder200520-Jan-06 11:51
membervbdotnetcoder200520-Jan-06 11:51 
GeneralRe: Great topic Pin
qlipoth5-Feb-06 16:03
memberqlipoth5-Feb-06 16:03 
GeneralRe: Great topic Pin
qlipoth5-Feb-06 16:08
memberqlipoth5-Feb-06 16:08 
GeneralRe: Great topic Pin
Rudy P11-Feb-06 0:59
memberRudy P11-Feb-06 0:59 
GeneralRe: Great topic Pin
qlipoth14-Feb-06 4:26
memberqlipoth14-Feb-06 4:26 
GeneralRe: Great topic Pin
StephanGreiwe20-Oct-06 23:45
memberStephanGreiwe20-Oct-06 23:45 
GeneralRe: Great topic Pin
Section8NZ22-May-07 20:20
memberSection8NZ22-May-07 20:20 
GeneralRe: Great topic Pin
BruceN8-Jul-07 17:18
memberBruceN8-Jul-07 17:18 
GeneralRe: Great topic Pin
Section8NZ8-Jul-07 22:12
memberSection8NZ8-Jul-07 22:12 

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

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