Projet

Général

Profil

AbulEduQRCodeReaderV1

La classe AbulEduQRCodeReaderV1 permet de trouver et de décoder des QR-Code ou des Code Bar présent dans une image (qui peut proveir d'une webcam)

Installation

L'installation de la classe AbulEduQRCodeReaderV1 se fait dans le dossier lib de votre logiciel, par exemple

git submodule add http://redmine.abuledu.org/ryxeo/leterrier-developpeurs/abuleduqrcodereaderv1.git src/lib/abuleduqrcodereaderv1

Mainteneur de la lib:

git clone ssh://gitolite3@redmine.abuledu.org/repositories-redmine/ryxeo/leterrier-developpeurs/abuleduqrcodereaderv1.git

Cette classe nécessite l'utilisation de opencv2 et de la lib zbar

Modification du fichier.pro

Pensez à modifier votre fichier .pro pour ajouter cette nouvelle lib

#AbulEduQRCodeReaderV1
include(lib/AbulEduQRCodeReaderV1/AbulEduQRCodeReaderV1.pri)

Utilisation

La classe AbulEduQRCodeReaderV1 est prévue pour tourner dans un QThread séparé (mais ce n'est pas nécessaire) permettant ainsi à l'interface de ne se figer.

Une implémentation possible est celle-ci (Lancé dans un QThread)

void MainWindow::on_btnReadQRCodes_clicked()
{
    if(!m_QRCodesReader)
    {
        m_QRCodesReader = new AbulEduQrCodeReaderV1();
        m_QRCodesReader->abeQrCodeReaderInit();
        // Une frame est prete
        connect(m_cameraController, SIGNAL(signalFullCvMatImageReady(cv::Mat)),
                this,               SLOT(slotCameraCvMatReceived(cv::Mat)));
        // Passe une frame au scanner
        connect(this,               SIGNAL(signalCvMatForQrdecoder(cv::Mat, bool)),
                m_QRCodesReader,    SLOT(slotAbeQrCodeReaderSetCvMatImage(cv::Mat, bool)));

        // Le scanner a trouvé quelque chose les renseignements sont dans un codeBar
        connect(m_QRCodesReader,    SIGNAL(signalAbeQrCodeReaderNewDecodedDataList(codeBar)),
                this,               SLOT(slotQrCodeDataReceived(codeBar)));
        // Le scanner a une image avec les codeBar encadrés en couleur
        connect(m_QRCodesReader,    SIGNAL(signalAbeQrCodeReaderDecodedCvMatImageReady(cv::Mat)),
                this,               SLOT(slotQrCodeCvMatReceived(cv::Mat)));

        m_scannerThread = new QThread(this);
        m_QRCodesReader->moveToThread(m_scannerThread);
        m_scannerThread->start();
        /* Et hop ! */
    }

La première fonction à utiliser est abeQrCodeReaderInit() qui, comme son nom l'indique initialise le scanner de codes-bar.

Afin de pouvoir communiquer facilement avec QRCodeReaderV1, nous utiliserons le mécanisme signal/slot de Qt qui est Thread-safe.

Ensuite, nous pourrons passer une image (frame) au scanner. Ceci se fera par l'intermédiaire d'un signal et du slot correspondant dans le QRCodeReader

 // Passe une frame au scanner
        connect(this,               SIGNAL(signalCvMatForQrdecoder(cv::Mat, bool)),
                m_QRCodesReader,    SLOT(slotAbeQrCodeReaderSetCvMatImage(cv::Mat, bool)));

(!) L'image n'a pas besoin d'être de grande résolution 1024x768 ou 800x600 devrait suffir. De même si on utilise une webcam, un nombre d'images par seconde de 10 convient largement). Tout ceci pour réduire la charge du processeur.

Le scanner renvoie les renseignements dans une structure "codeBar" qui contient :

struct codeBar{
    QString type; // QRCode, ean13, isbn...
    QString data; // Les données encodées
    QVector<QPair<int, int> > points; // La zone de l'image où le QRcode a été trouvé (4 points)
};

Il est aussi possible de récupérer l'image passée au scanner avec les zones décodées entourées d'un rectangle bleu.

 // Le scanner a une image avec les codeBar encadrés en couleur
        connect(m_QRCodesReader,    SIGNAL(signalAbeQrCodeReaderDecodedCvMatImageReady(cv::Mat)),
                this,               SLOT(slotQrCodeCvMatReceived(cv::Mat)));

Démo

Le fichier ci-dessous vous permettra de tester les fonctions de base utilisées dans AbulEduCameraV1 et dans AbulEduQRCodeReaderV1.
Il vaut mieux avoir une webCam connectée. ;)

20150510_QRCodes.tar.gz (39,5 ko) Jean-Louis Frucot, 10/05/2015 15:58

Redmine Appliance - Powered by TurnKey Linux