referring now to fig4 a and 4b , an automated tape library is disclosed in which the innovative decoding process is implemented . fig4 a shows an overhead view of a tape library according to an innovative embodiment of the invention . a robot arm 402 carrying a line scan camera 404 is surrounded by a number of storage racks 406 containing tape cartridges 408 and is mounted so that it can turn through 360 degrees of arc to access the tapes . fig4 b shows a view of the tape library taken along the dotted line a — a ′. robot arm 402 is jointed so that it can be raised or lowered to read barcodes on the front of each tape cartridge , and contains mechanisms with which to retrieve the cartridges . the robot arm 402 is programmed to move slowly down the storage rack , while camera 404 scans the expected location of the barcodes . as these locations are read , the pixel data is fed to a processor ( not shown ), where it is deciphered to find the correct tape . once the tape is located , the robot arm will retrieve the tape to a user location , such as a tape drive ( not shown ). in the presently preferred embodiment , a single scan line across the barcode is processed from the line scan camera at a time . this means that the sample of the barcode is a single pixel high . a software filter marks the boundaries between black and white , dividing the scan line into bars and spaces , and determine the widths of each bar and space . the software filter will then present a window containing only five bars and the intervening four spaces to the decoding program . the decoding process is shown in fig5 . this algorithm starts with a window containing the first five bars ( step 505 ) and sets the value c , which contains the width of a character , to zero . the process then determines the width w of the widest bar within the window ( step 510 ). a threshold t is set equal to 75 % of the width w ( step 515 ). threshold t can then be used to differentiate between wide and narrow bars . the process then counts the wide and narrow bars in the window ( step 520 ) to determine if it meets the standard for the code scheme ( step 525 ). if not , the first black bar will be ignored as a presumed error . the window is moved one bar in a forward direction ( step 540 ), so that it again contains five bars , and the algorithm returns to find the width of the current widest bar in the window ( step 515 ). if the code scheme is met , the algorithm checks to see if this is the start character ( step 530 ); if so , the width of a character c is calculated ( step 545 ) and the character is stored ( step 550 ). if the character is not the start character , the width of the current character is checked against a previously determined width c to determine if the character is the proper width ( step 535 ). a proper width character is stored as the next character in the label ( step 550 ), but an improper width is treated as if the character had not met the standard for the expected code scheme , so that the first bar is thrown out , the window is moved one bar ( step 540 ) and the algorithm returns to find the widest bar in the current window ( step 515 ). once a character is stored , the saved label number is checked to see if it meets the label - coding scheme ( step 555 ). for code 39 applications , this would be a character string enclosed by the start / stop characters . if so , the label is identified ( step 565 ), if not , the algorithm moves the window down a character , i . e ., five bars ( step 560 ) and resumes looking at the barcode , returning again to determine the widest bar in the current window ( step 515 ). fig6 shows the barcode of fig3 as it is receive from the low - resolution camera of fig4 with each scan line ( 1 - 15 ) shown separately . we will now walk through the algorithm with regard to the scanned lines in the same manner that the computer would do . in this example , the program is designed to work with labels that use only the basic code 39 set , without the “$”, “/”, “+” or “%” characters , so the algorithm checks for two wide and three narrow bars . it would be understood by one of ordinary skill in the art that by checking for other combinations of three wide elements of nine total elements , the algorithm can easily be broadened to accommodate the expanded code 39 codeset . starting with scan line 1 of the barcode , the first five bars are accepted , the character width c is set to zero , and the storage area for the label is cleared ( step 505 ). the width of the widest bar is determined ( step 510 ); in this instance the far right bar is the widest . the threshold is set ( step 515 ) and the number of wide and narrow bars is determined ( step 520 ). this window has four narrow and one wide bar , so it is determined ( step 525 ) that this window does not meet the coding scheme . the window is incremented one bar to the right ( step 540 ). since this is not the end of the scan line ( step 570 ), the algorithm again determines the widest bar ( step 510 ). the widest bar remains the same , although it is in a different position in the window now . after the threshold is set ( step 515 ), it is again determined that the window contains four narrow bars and only one wide bar ( step 520 ). since this does not meet the coding scheme ( step 525 ), the window is incremented ( step 540 ), end of scan line is check ( step 570 ) and the new window is examined . in this third window , the third and fifth bar are the widest , so their width is determined ( step 510 ), the threshold set ( step 515 ) it is determined that the window contains three narrow and two wide bars ( step 520 ). since this fits the coding scheme ( step 525 ), this window is checked to determine if this is the start character ( step 530 ), in this case an asterisk , coded as 00110 for bars , 1000 for spaces . the window does not contain the start character , so the width of the character is checked ( step 535 ) against the value of c . no start character has been found , so the width c of a character is still set to zero . the width of the character in the window does not match c , so the window is incremented one bar ( step 540 ) and the process continues . the reader can determine , by repeating the algorithm along the scan line , that no window on this line will both match the coding criteria and be identified as the start character . therefore the algorithm will encounter the end of scan line condition ( step 570 ) prior to decoding a label . when the end of scan line is recognized ( step 570 ), the algorithm begins anew . the results for the second scan line are the same as for the first scan line , with no valid start character found . the third scan line contains only five bars and will be seen as a single window that meets the coding pattern , but which does not contain the start character . in scan line four of the barcode , the first window is decoded as 00110 for the bars , 1000 for the spaces . this window meets the coding scheme ( step 525 ) and it contains the start character ( step 530 ). the value c of the width of a character is calculated ( step 545 ) as the width of this character and the start character is stored as the first character in the label . the label is not complete ( step 555 ), so the window is incremented by five bars to the next character ( step 560 ). the end of the scan line has not been reached , so the window is decoded ( steps 510 - 520 ) as 01010 for bars , 0001 for spaces . this fits the coding scheme ( step 525 ) and is not the start character ( step 530 ). when compared , the width of the character is the same as c ( step 535 ), so this character , which decodes as “ s ”, is stored as the second character in the label . the label is not complete ( step 555 ), so the window is incremented to the next character ; the end of the scan line has not been reached ( step 570 ), so the window is decoded ( steps 510 - 520 ) as 00110 for the bars , 0001 for the spaces . this meets the coding scheme ( step 525 ), is not the start character ( step 530 ) and has the correct width ( step 535 ), so the decoded character , a “ t ” is stored in the label ( step 550 ). the label is not complete ( step 555 ), so the window is incremented to the next character ( step 560 ), but the end of scan line is found ( step 570 ), so the process moves to the next scan line ( step 575 ), sets c to zero and clears the label ( step 505 ). in the fifth scan line , the first three characters are decoded as they were in scan line four . the algorithm is able to move through the line , decoding successive characters as “* stk015l1 ”; however the end of the scan line is encountered before an second “*” is found to delimit the end of the label . before beginning the sixth scan line , the label is cleared and c is reset to zero . on this sixth scan line , the algorithm finally able to properly decode the label all the way to the end as * stk015l1 *. once it is recognized that the label is complete ( step 555 ), the algorithm declares the label identified . it is clear from this walk through the algorithm that this process can discard any number of poorly read scan lines , as long as one scan line has not been distorted beyond recognition . in tests using this decoding algorithm , the ability to machine read barcodes with accuracy was greatly improved . without a reliable decoding system , the use of low - resolution line scan cameras in barcode applications has been problematic , necessitating the use of more expensive camera systems . with the advent of a reliable decoding algorithm , it is possible to use less expensive cameras to achieve the same results . it is important to note that while the present invention has been described in the context of a method for decoding barcodes , those of ordinary skill in the art will appreciate that the processes of the present invention are capable of being distributed in the form of a computer readable medium of instructions and a variety of forms and that the present invention applies equally regardless of the particular type of signal bearing media actually used to carry out the distribution . examples of computer readable media include recordable - type media , such as a floppy disk , a hard disk drive , a ram , cd - roms , dvd - roms , and transmission - type media , such as digital and analog communications links , wired or wireless communications links using transmission forms , such as , for example , radio frequency and light wave transmissions . the computer readable media may take the form of coded formats that are decoded for actual use in a particular data processing system . the description of the present invention has been presented for purposes of illustration and description , and is not intended to be exhaustive or limited to the invention in the form disclosed . many modifications and variations will be apparent to those of ordinary skill in the art . the embodiments were chosen and described in order to best explain the principles of the invention , the practical application , and to enable others of ordinary skill in the art to understand the invention for various embodiments with various modifications as are suited to the particular use contemplated .