Nhận diện mã vạch xử lý ảnh

1. Tổng quan mã vạch và mã QR code
Mã Barcode:
mã hóa, biểu diễn dữ liệu bằng các vạch đen và vạch trắng có độ rộng khác nhau tùy theo từng bảng mã
Một số chuẩn phổ biến: UPC, Code 39, Code 128, EAN-8, EAN-13...

Nhận diện mã vạch xử lý ảnh

Ở trên là mã vạch theo chuẩn UPC-A với các đặc trưng sau:

  • Tuânthủ format: SLLLLLLMRRRRRRE (S: Start, M: Middle, E: End, L: Left, R: Right)
  • Xácđịnhđộrộng sở (x-dimension)=0.33mm
  • Xácđịnhcácthànhphầnkhácdựatrênđộrộngsở

Mã QR code (Quick Response Code): một dạng mã vạch hai chiều, có thể lưu trữ nhiều loại ký tự khác nhau (số, ký tự, ký tự trong bảng mã Kanji của tiếng Nhật...). Các bạn có thể xem đặc tả chi tiết của chuẩn mã QR code phổ biến nhất là chuẩn ISO18004. Mã QR code có nhiều ưu điểm vượt trội so với mã Barcode như khả năng lưu trữ được lượng dữ liệu lớn, khả năng tự sửa lỗi...

Dưới đây là một mã QR code mẫu và định dạng chuẩn cho một mã QR code

Nội dung:  LAP TRINH XU LY ANH TREN NEN NHUNG Contact: 0985905253 (Mr Thuan)

Nhận diện mã vạch xử lý ảnh

Format định dạng cho mã QR code với các phần thông tin quan trọng để dò tìm, nhận dạng, giải mã QR code. Ở đây có một số phần thông tin quan trọng:
  • Position Detection Patterns: giúp nhận diện vùng chứa mã QR code
  • Format Information & Version Information: nhận diện phiên bản và format chuẩn để giải mã
  • Timing Patterns: canh khung để tách các vùng dữ liệu và mã sửa lỗi
  • Alignment Patterns: giúp căn chỉnh, hiệu chỉnh mã QR code trong các trường hợp bị xoay, méo...
  • Data and Error Correction Codewords: chứa dữ liệu và các mã sửa lỗi

Nhận diện mã vạch xử lý ảnh



2. Giới thiệu thư viện Zbar
Để có thể giải mã Barcode và QR code chúng ta có thể sử dụng các thư viện mã nguồn mở, trong đó Zbar là một thư viện đa nền tảng, khá gọn nhẹ và cho kết quả nhận dạng tốt. Các bạn có thể tham khảo chi tiết tại http://zbar.sourceforge.net/
Thư viện được xây dựng trên mã nguồn C/C++ nên dễ dàng porting lên trên các nền tảng khác nhau bao gồm cả iOS, Android và Linux. Dưới đây là mô hình hệ thống của Zbar

Nhận diện mã vạch xử lý ảnh

Thư viện Zbar có thể nhận dữ liệu trực tiếp từ Camera hoặc từ file ảnh, sau đó sẽ được đưa qua bộ giải mã (decoder) để xử lý và nhận dạng.
3. Cài đặt thư viện Zbar
Đầu tiên, chúng ta cần download mã nguồn của thư viện Zbar tại địa chịhttp://sourceforge.net/projects/zbar/files/zbar/0.10/zbar-0.10.tar.bz2/download (phiên bản hiện tại là 0.10)
Tiếp theo, chúng ta sẽ giải nén file mã nguồn, chuyển đường dẫn tới thư mục chứa mã nguồn và tiến hành biên dịch thư viện này trên máy Desktop và trên KIT
Bước 1: Biên dịch trên máy Desktop

./configure --without-qt --without-gtk --without-python --without-imagemagick
make
sudo make install


Bước 2: Biên dịch trên KIT

./configure --without-qt --without-gtk --without-python --without-imagemagick CC=arm-linux-gcc --host=arm-linux --prefix=/opt/zbar.arm --with-x=no
make
sudo make install

Sau khi biên dịch, copy các file trong thư mục /opt/zbar.arm/include xuống thư mục /usr/include và /opt/zbar.arm/lib xuống thư mục /usr/lib ở trên KIT.

4. Lập trình đọc mã Barcode và QR code sử dụng thư viện Zbar
Dưới đây là mã nguồn tham khảo để sử dụng thư viện zbar giải mã mã vạch, QR code từ một ảnh đầu vào. Các bạn có thể phát triển lên thành nhận dạng realtime với đầu vào là Video từ USB Camera bằng cách kết hợp thêm thư viện OpenCV để giao tiếp và lấy các frame từ USB Camera.
Bước 1: Cấu hình để có thể sử dụng thư viện Zbar
Thêm các dòng sau vào file .pro của project. Việc cấu hình này cho phép chúng ta dễ dàng chuyển đổi chương trình giữa nền tảng X86 trên Desktop và nền tảng ARM trên KIT bằng cách thay đổi thông số CONFIG

CONFIG+=build_arm

#Khi can bien dich cho X86 LINUX DESKTOP
build_x86{
    INCLUDEPATH += /usr/local/include/opencv
    LIBS += /usr/local/lib/*.so
}
#Khi can bien dich de chay tren KIT
build_arm{
    INCLUDEPATH += /opt/opencv.arm/include/opencv
    INCLUDEPATH += /opt/zbar.arm/include
    LIBS += /opt/opencv.arm/lib/*.so
    LIBS += /opt/opencv.arm/lib/*.so.4
    LIBS += /opt/zbar.arm/lib/*.so
}

Bổ sung include các thư viện cần thiết

#include<zbar.h>
usingnamespace zbar;

Bước 2: Lập trình sử dụng các hàm của thư viện Zbar
Các bạn có thể tham khảo đoạn code dưới đây, đoạn code này viết trên QT cho phép mở cửa sổ File Dialog để người dùng chọn file, khi người dùng bấm nút Scan và tiến hành nhận dạng mã Barcode, QR code trên ảnh vừa nhận

    //Timdenfilecangiaima

    QString strFilePath = QFileDialog::getOpenFileName(this, tr("Open a image"), QDir::currentPath(),
    tr("Image Files (*.jpg *.jpeg)"));
    if(strFilePath.size()){
        //Nhan anh dau vao, luu vao ma tran du lieu
        CvMat *cv_matrix = cvLoadImageM((const char*)strFilePath.toAscii().data(),CV_LOAD_IMAGE_GRAYSCALE);
        //Chuyen doi sang dinh dang IplImage de hien thi
        IplImage stub, *image;
        image = cvGetImage(cv_matrix, &stub);
        ui->widget->putImage(image);
        //Su dung thu vien Zbar de giai ma
        uchar* raw = (uchar *)cv_matrix->data.ptr;
        int width = cv_matrix->width;
        int height = cv_matrix->height;
        ImageScanner *scanner=new ImageScanner();
        scanner->set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
        Image *zimg=new Image(width,height,"Y800",raw,width*height);
        int n=scanner->scan(*zimg);
        if(n>0){
            for(Image::SymbolIterator symbol = zimg->symbol_begin(); symbol != zimg->symbol_end(); ++symbol) {
                //Hien thi ket qua len man hinh Console
                std::cout << "decoded " << symbol->get_type_name() << " symbol \"" << symbol->get_data() << '"' << std::endl;
                //Hien thi ket qua len Textbox
                ui->txtResult->setPlainText(QString::fromStdString(symbol->get_data()));
            }
        }else{
            ui->txtResult->setPlainText("Cannot Detect this code");
        }
        //Giai phong tai nguyen
        zimg->set_data(NULL, 0);
    }

5. Video demo nhận dạng mã Barcode và QR code trên KIT Micro2440 (màn hình 7 inch)

Demo Barcode, QRcode Reader

CHÚC CÁC BẠN THÀNH CÔNG !