diff options
Diffstat (limited to 'src/barcode/barcode.h')
-rw-r--r-- | src/barcode/barcode.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/barcode/barcode.h b/src/barcode/barcode.h new file mode 100644 index 0000000..b8d71bc --- /dev/null +++ b/src/barcode/barcode.h @@ -0,0 +1,135 @@ +/*************************************************************************** + copyright : (C) 2007 by Sebastian Held + email : [email protected] + ***************************************************************************/ + +/*************************************************************************** + * * + * ### based on BaToo: http://people.inf.ethz.ch/adelmanr/batoo/ ### * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of version 2 of the GNU General Public License as * + * published by the Free Software Foundation; * + * * + ***************************************************************************/ + +#ifndef BARCODE_H +#define BARCODE_H + +#include <qthread.h> +#include <qimage.h> +#include <qvaluevector.h> +#include <qobject.h> +#include <qmutex.h> +#include <math.h> + +#include "barcode_v4l.h" + +//#define BarcodeDecoder_DEBUG +//#define Decoder_EAN13_DEBUG +//#define Barcode_DEBUG + +namespace barcodeRecognition { + static int code_odd[][4] = { { 30, 20, 10, 10 }, + { 20, 20, 20, 10 }, + { 20, 10, 20, 20 }, + { 10, 40, 10, 10 }, + { 10, 10, 30, 20 }, + { 10, 20, 30, 10 }, + { 10, 10, 10, 40 }, + { 10, 30, 10, 20 }, + { 10, 20, 10, 30 }, + { 30, 10, 10, 20 } }; + + static int code_even[][4] = { { 10, 10, 20, 30 }, + { 10, 20, 20, 20 }, + { 20, 20, 10, 20 }, + { 10, 10, 40, 10 }, + { 20, 30, 10, 10 }, + { 10, 30, 20, 10 }, + { 40, 10, 10, 10 }, + { 20, 10, 30, 10 }, + { 30, 10, 20, 10 }, + { 20, 10, 10, 30 } }; + + static bool parity_pattern_list[][6] = { { false, false, false, false, false, false }, + { false, false, true, false, true, true }, + { false, false, true, true, false, true }, + { false, false, true, true, true, false }, + { false, true, false, false, true, true }, + { false, true, true, false, false, true }, + { false, true, true, true, false, false }, + { false, true, false, true, false, true }, + { false, true, false, true, true, false }, + { false, true, true, false, true, false } }; + + class Barcode_EAN13 { + public: + Barcode_EAN13(); + Barcode_EAN13( QValueVector<int> code ); + bool isNull() const { return m_null; } + bool isValid() const; + QValueVector<int> getNumbers() const; + void setCode( QValueVector<int> code ); + QString toString() const; + bool operator!= ( const Barcode_EAN13 &code ); + protected: + QValueVector<int> m_numbers; + bool m_null; + }; + + class MatchMakerResult { + public: + MatchMakerResult( bool even, int digit ); + bool isEven() const {return m_even;} + int getDigit() const {return m_digit;} + protected: + int m_digit; + bool m_even; + }; + + class Decoder_EAN13 { + public: + enum { BOTH_TABLES = 0, EVEN_TABLE = 1, ODD_TABLE = 2 }; + static Barcode_EAN13 recognize( QValueVector< QValueVector<int> > fields ); + static QValueVector<int> decode( QValueVector< QValueVector<int> > fields, int start_i, int end_i ); + static MatchMakerResult recognizeNumber( QValueVector< QValueVector<int> > fields, int code_table_to_use ); + static MatchMakerResult recognizeSystemCode( bool parity_pattern[6] ); + }; + + /** \brief this thread handles barcode recognition using webcams + * @author Sebastian Held <[email protected]> + */ + class barcodeRecognitionThread : public QObject, public QThread { + Q_OBJECT + public: + barcodeRecognitionThread(); + ~barcodeRecognitionThread(); + virtual void run(); + void stop(); + void recognizeBarcode( QImage img ); + bool isWebcamAvailable(); + signals: + void recognized( QString barcode ); + void gotImage( QImage &img ); + protected: + volatile bool m_stop; + QImage m_barcode_img; + QMutex m_stop_mutex, m_barcode_img_mutex; + barcode_v4l *m_barcode_v4l; + + Barcode_EAN13 recognize( QImage img ); + Barcode_EAN13 recognizeCode( QImage img, int x1, int x2, int y ); + void addNumberToPossibleNumbers( QValueVector<int> number, int possible_numbers[10][13][2], bool correct_code ); + void sortDigits( int possible_numbers[10][13][2] ); + Barcode_EAN13 extractBarcode( int possible_numbers[10][13][2] ); + QValueVector<int> transformPathToBW( QValueVector<QRgb> line); + QValueVector< QValueVector<int> > extractFieldInformation( QValueVector<int> string ); + Barcode_EAN13 detectValidBarcode ( int possible_numbers[10][13][2], int max_amount_of_considered_codes ); + bool isValid( int numbers[13] ); + bool isValid( QValueVector<int> numbers ); + void printArray( int array[10][13][2], int level ); + }; +} + +#endif |