本文提供win64平台ZBar库的编译方法,解决中文解码乱码问题。
不想花时间折腾的同学直接去下载附加资源ZBar64,是编译好的库,解压即用,有问题请留言。
一、源码修改
本例使用visual studio 2019编译。
感谢作者提供了优秀的开源项目https://github.com/dani4/ZBarWin64。
Zbar源码是不支持中文解码的,要实现中文解码需要修改源码重新编译。提醒:备份是个好习惯。要修改的文件是zbar/qrcode/qrdectxt.c。
61行,将3种解码方式修改如下。
latin1_cd = iconv_open("GBK", "UTF-8");
sjis_cd = iconv_open("GB2312", "UTF-8");
utf8_cd = iconv_open("UTF-8", "UTF-8");
具体解码类型可以根据自己需求更改。之后打开sln文件生成dll和lib即可。使用该库的时候只引入libzbar64-0.dll和libzbar64-0.lib还不够,还需要把依赖库libiconv引入,其位置在ZBarWin64\zbar\libiconv,32位和64位根据自己需求选择。
二、opencv 例程
zbar的使用非常简单。下例展示了由opencv读取一张图片并使用zbar解码。
#include <opencv2/opencv.hpp>
#include <zbar.h>
int main() {
cv::Mat img = cv::imread("qrcode.jpg"); // 读取图像
std::cout << "输入图像尺寸=" << img.size << std::endl;
std::cout << "输入通道数=" << img.channels() << std::endl;
cv::namedWindow("img", 0);
cv::imshow("img", img);
cv::waitKey(0);
cv::Mat img_gray;
cv::cvtColor(img, img_gray, cv::COLOR_BGR2GRAY);彩色图像须转为灰度
uchar* raw = (uchar*)img_gray.data;
int w = img_gray.cols;
int h = img_gray.rows;
zbar::ImageScanner scanner;
scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1);
zbar::Image img_zbar(w, h, "Y800", raw, w * h);
scanner.scan(img_zbar);
zbar::Image::SymbolIterator symb = img_zbar.symbol_begin();
if (img_zbar.symbol_begin() == img_zbar.symbol_end()) {
std::cout << "No code" << std::endl;
}
for (; symb != img_zbar.symbol_end(); ++symb) {
std::cout << "类型:" << symb->get_type_name() << std::endl;
std::cout << "内容:" << symb->get_data() << std::endl;
}
img_zbar.set_data(nullptr,0);
}
实测zbar可以检测到同一张图像中的多个不同类型的码(包括一维和二维),解码速度也很快。
参考: