使用zbar解码一维码

之前都是直接用zxing来解码一维码的,但是今天遇到了一个看起来很清晰的一维码,但是zxing死活解码不了的情况。
后来尝试了一下zbar,发现可以解码。可能对于一维码,zbar的解码能力要比zxing要强?后面找时间综合对比一下。

假如想使用原始版本,可以按照这里的教程【zbar:Qt调用zbar做条码识别】来操作。
这个zbar的原始作者已经在2012年停止维护了,但是有个项目继承了,在此处【mchehab/zbar】,貌似持续做了不少更新。
我们选用mchehab/zbar,但是不是直接下载它的源码来编译,因为会很麻烦。
我们选择用vcpkg来安装

vcpkg install mchehab-zbar:x64-windows

要编译挺久的。我的电脑编译了一个小时,不过时间主要是花在编译其依赖的第三方库。
在这里插入图片描述
编译好后,在pro文件中引入头文件和库文件,就可以顺利使用了

INCLUDEPATH += D:\Qt\vcpkg\vcpkg\packages\mchehab-zbar_x64-windows\include
LIBS += -LD:\Qt\vcpkg\vcpkg\packages\mchehab-zbar_x64-windows\lib \
-lzbar
LIBS += -LD:\Qt\vcpkg\vcpkg\packages\mchehab-zbar_x64-windows\bin \
-LD:\Qt\vcpkg\vcpkg\packages\libiconv_x64-windows\tools\libiconv\bin
QImage img;
    // img.load("2.bmp");
    // img.load("123.png");
        img.load("6.jpg");
    img = img.convertToFormat(QImage::Format_Grayscale8);   // 灰度化

    qDebug() << img;

    Image imagezbar(img.width(), img.height(), "Y800", img.bits(), img.width() * img.height());
    ImageScanner scanner;
    scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
    int codeCount = scanner.scan(imagezbar);
    qDebug() << "识别到的条码数量:" << codeCount;

    Image::SymbolIterator sym = imagezbar.symbol_begin();
    if (imagezbar.symbol_begin() == imagezbar.symbol_end())
    {
        qDebug() << "识别失败";
    }
    else
    {
        for (; sym != imagezbar.symbol_end(); ++sym)
        {
            qDebug() << "条码内容:" << QString::fromStdString(sym->get_data());

            QPolygonF poly;

            Symbol::PointIterator pi = sym->point_begin();
            while (pi != sym->point_end()){

                poly << QPointF((*pi).x, (*pi).y);

                ++pi;
            }

            QPainter painter(&img);
            painter.drawPolyline(poly);

            // sym->get_location_size()
            // QRectF rect(sym->get_location_x());

            qDebug() << sym->xml().data();

        }
    }

    img.save("theImg.png");

但是有个问题,不知道为啥,识别不出二维码。明明其参数中说可以识别的。二维码解码的话,还是用微信二维码好了。


参考:
【zbar:Qt调用zbar做条码识别】
【mchehab/zbar】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值