基于QT c++的二维码、条形码识别和二维码生成

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;
}


在Windows系统下,我们可以使用Qt C++编程语言来生成条形码二维码。首先,我们需要下载并安装Qt开发环境。 生成条形码可以使用Zint库,它是一个开源的条形码生成库。我们需要先下载和安装Zint库,并将其添加到我们的Qt项目中。 接下来,我们可以在Qt的项目中使用以下代码来生成条形码: ```cpp #include <iostream> #include <QImage> #include <QPainter> #include <QFile> #include <QTextStream> extern "C" { #include "zint.h" } int main() { int error_number; struct zint_symbol *my_symbol; int input_mode = UNICODE_MODE; // 创建一个Zint符号 my_symbol = ZBarcode_Create(); // 设置要生成条形码类型 my_symbol->symbology = BARCODE_CODE128; // 设置输入数据(条形码内容) QByteArray data = "Hello World"; ZBarcode_Encode_and_Buffer(my_symbol, (unsigned char*)data.data(), 0, 0); // 创建一个QImage对象 QImage img(QSize(my_symbol->bitmap_width, my_symbol->bitmap_height), QImage::Format_RGBA8888); // 使用QPainter绘制条形码 QPainter painter; painter.begin(&img); painter.setCompositionMode(QPainter::CompositionMode_Source); painter.fillRect(img.rect(), Qt::white); painter.setCompositionMode(QPainter::CompositionMode_DestinationOver); painter.drawImage(0, 0, QImage(my_symbol->bitmap, my_symbol->bitmap_width, my_symbol->bitmap_height, QImage::Format_Mono)); // 保存生成条形码图片 img.save("barcode.png"); // 释放Zint符号 ZBarcode_Delete(my_symbol); return 0; } ``` 这样,我们就可以在Qt的项目中生成条形码,并将其保存为barcode.png文件。 而生成二维码可以使用QZXing库,它是一个支持二维码生成和解码的Qt库。我们需要先下载并安装QZXing库,并将其添加到我们的Qt项目中。 接下来,我们可以在Qt的项目中使用以下代码来生成二维码: ```cpp #include <iostream> #include <QImage> #include <QPainter> #include <QFile> #include <QTextStream> #include <QZXing> int main() { // 创建一个QZXing对象 QZXing zxing; // 设置要生成二维码内容 QString data = "Hello World"; // 使用QZXing生成二维码 QImage img = zxing.encode(data); // 保存生成二维码图片 img.save("qrcode.png"); return 0; } ``` 这样,我们就可以在Qt的项目中生成二维码,并将其保存为qrcode.png文件。 通过以上方法,我们可以在Windows下使用Qt C++生成条形码二维码
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值