ZBar是一个开源的二维码(包括条形码)解码器,可以识别来源于视频流、图像文件、手持扫码器和视频设备(如摄像头)等二维码识别,支持EAN-13/UPC-A, UPC-E, EAN-8, Code 128, Code 39, QR Code(二维码)等常用编码方式的条形码/二维码。
1、Windows 10 64位
2、Visual Studio 2015 Professional
3、OpenCV 3.4.3
4、ZBar 0.10
1、在ZBar官网http://zbar.sourceforge.net/download.html下载Windows Installer版本安装。
2、官网下载安装的仅包含32位lib文件,无法后续配置64位,因此需要多一步操作。
方法一:
在该网站https://github.com/dani4/ZBarWin64下载压缩包,并解压,
(1)将 ZBarWin64-master\lib 文件夹下的 libzbar64-0.lib 文件复制到ZBar安装路径下的 lib 文件夹中,
(2)将 ZBarWin64-master\lib 文件夹下的 libzbar64-0.dll 文件复制到ZBar安装路径下的 bin 文件夹中,
(3)将 ZBarWin64-master\zbar\libiconv\dll_x64 文件夹下的 libiconv.dll 文件复制到ZBar安装路径下的 bin 文件夹中。
方法二:
直接下载修改好的压缩包文件。
链接:https://pan.baidu.com/s/1EAgiYF5S65QpWAnFWS5CrQ 提取码:jesa
1、将ZBar安装目录下的bin文件夹添加至环境变量中。
2、在VS2015中新建一个空项目,在属性管理器中作如下配置:
(1)包含目录:
(2)库目录:
(3)链接器->输入->附加依赖项:
在空项目源文件的cpp文件中添加以下测试代码,可以调用摄像头对二维码进行定位与解码。
#include
#include
#include
int main(int argc, char*argv[])
{
zbar::ImageScanner scanner;
scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1);
cv::VideoCapture capture;
capture.open(0); //打开摄像头
cv::Mat image;
cv::Mat imageGray;
std::vector obj_location;
bool flag = true;
if (!capture.isOpened())
{
std::cout << "cannot open cam!" << std::endl;
}
else
{
while (flag)
{
capture >> image;
cv::cvtColor(image, imageGray, CV_RGB2GRAY);
int width = imageGray.cols;
int height = imageGray.rows;
uchar *raw = (uchar *)imageGray.data;
zbar::Image imageZbar(width, height, "Y800", raw, width * height);
scanner.scan(imageZbar); //扫描条码
zbar::Image::SymbolIterator symbol = imageZbar.symbol_begin();
if (imageZbar.symbol_begin() != imageZbar.symbol_end()) //如果扫描到二维码
{
flag = false;
//解析二维码
for (int i = 0; i < symbol->get_location_size(); i++)
{
obj_location.push_back(cv::Point(symbol->get_location_x(i), symbol->get_location_y(i)));
}
for (int i = 0; i < obj_location.size(); i++)
{
cv::line(image, obj_location[i], obj_location[(i + 1) % obj_location.size()], cv::Scalar(255, 0, 0), 3);//定位条码
}
for (; symbol != imageZbar.symbol_end(); ++symbol)
{
std::cout << "Code Type: " << std::endl << symbol->get_type_name() << std::endl; //获取条码类型
std::cout << "Decode Result: " << std::endl << symbol->get_data() << std::endl; //解码
}
imageZbar.set_data(NULL, 0);
}
cv::imshow("Result", image);
cv::waitKey(50);
}
cv::waitKey();
}
return 0;
}
识别条码类型:二维码,CSDN大数据微信公众号。
ZBar目前不支持解码中文,可能需要修改源码进行编译。
参考文章:
https://blog.csdn.net/dcrmg/article/details/52108258
https://www.cnblogs.com/gloria-zhang/p/9011776.html
https://www.cnblogs.com/jsxyhelu/p/7371341.html
http://www.pianshen.com/article/1196260020/
https://blog.csdn.net/MengchiCMC/article/details/77871714
https://blog.csdn.net/weixin_41820730/article/details/79695250
https://blog.csdn.net/skillcollege/article/details/38855023
https://www.cnblogs.com/cjqbaba/p/9073908.html
Juliet 于 2019.9