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. ;)