之前都是直接用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");
但是有个问题,不知道为啥,识别不出二维码。明明其参数中说可以识别的。二维码解码的话,还是用微信二维码好了。