1、前言
前面两篇介绍在ubuntu18下安装zbar 和qrencode库的安装,本篇把二维码生成和识别做个记录。
2、实验环境
实验代码在ubuntu18-x64、qt5.9.6环境;
qt中添加zbar和qrencode库,步骤如下:
先 新建一个Qt Console Application 工程,参考如下步骤添加库即可。
2.1>> 右键工程文件,弹出菜单;
2.2>> 在菜单中,选择 “Add Library…”;
2.3>> 选择 “External library” 单选框;
2.4>> 选择 zbar库文件路径, “/usr/local/zbar/lib/libzbar.so"
2.5>> 取消勾选框 “Mac” 和 “Windows”;
2.6>> next–> finish .
在qt的工程文件中, *.pro文件是qt的工程管理文件,例:camera_qml.pro 新增库的内容如下:
#二维码 扫描和生成库文件
unix:!macx: LIBS += -L$$PWD/../../../../../../usr/local/zbar/lib/ -lzbar
INCLUDEPATH += $$PWD/../../../../../../usr/local/zbar/include
DEPENDPATH += $$PWD/../../../../../../usr/local/zbar/include
unix:!macx: LIBS += -L$$PWD/../../../../../../usr/local/qrencode/lib/ -lqrencode
INCLUDEPATH += $$PWD/../../../../../../usr/local/qrencode/include
DEPENDPATH += $$PWD/../../../../../../usr/local/qrencode/include
二维码识别库中需要用到openCV的库,该库的安装后面补上。
先上代码,记录此两个库的应用。
///> third libs
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
/**
* @brief qr code header
*/
#include "zbar.h"
#include "qrencode.h"
/**
* @brief QRcode::createQRcode;二维码生成
* @param s :create code of content
* @param f_name :save to path,out file is png format
* @param width :QR code width
* @param height :QR code height
* @return :0 success,< 0 failure
*/
int ex_QRcode::createQRcode(QString s, const char *f_name,int width, int height )
{
if(s.isEmpty()){
return -1;
}
if(f_name == NULL){
return -2;
}
QRcode *qrcode; //二维码数据
char *msg;
QByteArray a = s.toLatin1();
msg = a.data();
qrcode = QRcode_encodeString(msg, 0, QR_ECLEVEL_L, QR_MODE_8, 1); ///QR_ECLEVEL_Q 容错等级
int32_t qrcode_width = qrcode->width > 0 ? qrcode->width : 1;
double scale_x = (double)width / (double)qrcode_width; //二维码图片的缩放比例
double scale_y = (double)height / (double)qrcode_width;
QImage img = QImage(width, height, QImage::Format_ARGB32);
QPainter painter(&img);
QColor background(Qt::white);
painter.setBrush(background);
painter.setPen(Qt::NoPen);
painter.drawRect(0, 0, width, height);
QColor foreground(Qt::black);
painter.setBrush(foreground);
for( int32_t y = 0; y < qrcode_width; y++) {
for(int32_t x = 0; x < qrcode_width; x++) {
unsigned char b = qrcode->data[y * qrcode_width + x];
if(b & 0x01) {
QRectF r(x * scale_x, y * scale_y, scale_x, scale_y);
painter.drawRects(&r, 1);
}
}
}
img.save(f_name);/// f-name 生成后的二维码存储路径
//QPixmap pix_img = QPixmap::fromImage(img,Qt::AutoColor);
//pixImg.save(f_name);
return 0;
}
/**
* @brief QRcode::scannerQRcode,下面是二维码扫描代码
* @param input img : const char *img,image file path
* @param output : std::string & decode,& content
* @return 0 success, < 0 failure
*/
int ex_QRcode::scannerQRcode(const char *img, std::string & decode,std::string &content)
{
cv::Mat imgGray;
//cv::Mat image = cvLoadImage(img,CV_IMWRITE_PAM_FORMAT_NULL);
cv::Mat image = cv::imread(img);
//imgGray.create(image.size(), CV_8UC1);
cv::cvtColor(image,imgGray,CV_BGR2GRAY);
//cv::imwrite(tmp,imgGray);
///调整图片尺寸
cv::resize(imgGray,image,cv::Size(imgGray.cols*0.5,imgGray.rows*0.5));
//cv::imwrite(tmp1,image);
///openCV的二值化处理函数,注意此函数的第五个参数2,二值化处理方法
cv::threshold(image,imgGray,178,255,2);
//cv::imwrite(tmp2,imgGray);
//cv::imshow("window",imgGray);
unsigned char *pdata = (unsigned char *)imgGray.data;
int width = imgGray.cols;
int height = imgGray.rows;
// create a scanner
zbar::ImageScanner scanner;
// configure the reader
scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1);
zbar::Image imageZbar(width, height, "Y800", pdata, width * height);
int n = scanner.scan(imageZbar);
if(n>0)
{
for (zbar::Image::SymbolIterator symbol = imageZbar.symbol_begin();
symbol != imageZbar.symbol_end();++symbol) {
decode = symbol->get_type_name();
qDebug() << "decoded " << decode.c_str() << '\n';
content=symbol->get_data();
qDebug() << "symbol " << content.c_str() << '\n';
}
return 0;
}else{
qDebug() << "QR code don't known...";
return -1;
}
}
/**
* 测试主函数
*/
#include <QImage>
int main(int argc, char *argv[])
{
const char * source ="/home/robot/qtWorkspace/FaceEngine/image/wifi.jpeg";
const char * f_jpg = "/home/robot/qtWorkspace/FaceEngine/image/signal.jpeg";
const char * path = "/home/robot/qtWorkspace/FaceEngine/image/test.jpeg";
ex_QRcode qr_code; ///自定义的二维码类
qr_code.createQRcode(source, path, 320,320);
std::string decode,result;
int ret = qr_code.scannerQRcode(path,decode,result);
if (ret == 0){
qDebug("error..");
}
return 0;
}