下边这个简单粗暴的图标就是Zbar:
Zbar的SDK支持包括C、C++、Python在内的多种语言,也提供了iOS和Androdi的SDK可供使用,用起来也非常方便,只需要在编译环境里添加相应的路径就行了,再加上图像处理包,如ImageMagick++或OpenCV的辅助读图,就可以编写准确高效的二维码识别程序了,下边就一步一步的介绍如何在vs2012中配置Zbar。
1. Zbar安装包下载
点击下载:Zbar官网下载链接,提供了Linux、Windows等版本的下载,目前最新版本是zbar-0.10。
2. Zbar安装
双击zbar-0.10-setup.exe,开始安装Zbar,其实就是对安装包的解压缩,如下图:
勾选“Development Headers and Libraries”:
选择安装路径:
安装完成之后在对应目录下出现下列文件夹,代表安装成功了:
3. VS2012工程项目属性配置
3.1 添加属性表
新建Win32控制台应用程序,工程名命名为ZbarTest,过程图就省略~
在工程ZbarTest工程的视图目录的下拉菜单中打开属性管理器:
在属性管理器的Debug|Win32目录上单击选择“添加新项目属性表”,新建属性表,并命名为“Zbar_Debug_Setting.props“,如下图所示:
点击添加,完成对项目属性表的添加。
3.2 VC++目录配置
双击刚才添加的“Zbar_Debug_Setting.props“属性表,选择通用属性->VC++目录:
在VC++目录->包含目录里添加1个目录: D:\ProgramFilesD\ZBar\include
选择VC++目录->库目录:
在库目录里添加1个目录: D:\ProgramFilesD\ZBar\lib
3.3 输入目录配置
打开通用属性->链接器->输入:
在附加依赖项里添加1个依赖项: libzbar-0.lib
点击确定,完成对IDE环境的配置。
4. 环境变量配置:
打开环境变量列表,这里跟在另一篇文章里opencv+VS2010里的配置环境变量是一样的 ,如不知道环境变量如何配置,可以点击这里查看详细步骤。
添加Zbar的动态库所在目录:D:\ProgramFilesD\ZBar\bin; 添加之后系统就不会找不到需要的dll文件了。
添加完之后务必记得注销电脑后生效。
OK!完成这4个步骤的动作,整个Zbar和VS2012的配置工作就全部完成了。
5. 环境测试
最后通过一个例程,来测试一下配置是否OK,这个例子的实现是查找到输入图片中的二维码,并在控制台窗口和图片窗口中分别输出二维码的内容。
注意把二维码图片放入程序所在路径下,运行效果如下:
换用二维码图片:
如果编译过程中提示错误 “error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.”
可以尝试以下解决方案:
项目 =》属性 =》c/c++ =》预处理器=》点击预处理器定义,编辑,加入_CRT_SECURE_NO_WARNING
我也配置成功了!
//学习OpenCV3 中级
//L5 课程代码 反向投影综合例子
#
include
"stdafx.h"
#
include
<opencv2
/core
/utility.hpp
>
#
include
"opencv2/video/tracking.hpp"
#
include
"opencv2/imgproc.hpp"
#
include
"opencv2/videoio.hpp"
#
include
"opencv2/highgui.hpp"
#
include
"zbar.h"
#
include
<iostream
>
#
include
<ctype.h
>
using
namespace cv;
using
namespace std;
using
namespace zbar;
void main()
{
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE,
1);
Mat src
= imread(
"E:/sandbox/1.png",IMREAD_COLOR);
Mat imageGray;
cvtColor(src,imageGray,CV_RGB2GRAY);
int width
= imageGray.cols;
int height
= imageGray.rows;
uchar
*raw
= (uchar
*)imageGray.data;
Image imageZbar(width, height,
"Y800", raw, width
* height);
scanner.scan(imageZbar);
//扫描条码
Image
:
:SymbolIterator symbol
= imageZbar.symbol_begin();
if(imageZbar.symbol_begin()
==imageZbar.symbol_end())
{
cout
<<
"查询条码失败,请检查图片!"
<<endl;
}
for(;symbol
!= imageZbar.symbol_end();
++symbol)
{
cout
<<
"类型:"
<<endl
<<symbol
-
>get_type_name()
<<endl
<<endl;
cout
<<
"条码:"
<<endl
<<symbol
-
>get_data()
<<endl
<<endl;
}
imshow(
"Source Image",src);
waitKey();
imageZbar.set_data(NULL,
0);
}