1.前期准备
系统环境:Win10
ZBar版本:zbar-0.10
http://download.csdn.net/detail/chenjifeng1987/9598568
OPenCV版本:opencv-2.4.13
在OpenCV官网的下载页面: http://opencv.org/downloads.html
找到对应OpenCV for Windows版本下载。
Version 3.1.0只有64位的开发包,还没支持32位的编译环境,这里使用Version 2.4.13。
VS2012:官方旗舰版
http://download.microsoft.com/download/B/0/F/B0F589ED-F1B7-478C-849A-02C8395D0995/VS2012_ULT_chs.iso
激活序列号,请输入:YKCW6-BPFPF-BT8C9-7DCTH-QXGWC
2.程序安装
2.1.VS2012安装
打开安装程序一路走就OK,注意的是安装时间比较长,大概要两三个小时。就算安装路径改成了其他盘符,C盘还是会占用大约6个G的容量。
2.2.ZBar安装
双击zbar-0.10-setup.exe,开始安装Zbar,其实就是对安装包的解压缩,如下图:
勾选“Development Headers and Libraries”:
选择安装路径:请记住自己的安装路径,之后的配置需要进入安装路径。我这里的路径是“G:\Program Files (x86)\ZBar\”
安装完成之后在对应目录下出现下列文件夹,代表安装成功了:
2.3.安装OpenCV
下载完成之后双击“opencv-2.4.13.exe”,弹出安装(解压)对话框:
选择安装路径,这里使用的是“G:\Program Files (x86)”,点击“Extract”后开始解压;
值得注意的一点是不需要在安装目录里额外建“opencv”的文件夹,OpenCV安装包解压出来的根目录就是“opencv”。
3.本机环境变量和路径配置
3.1.打开系统环境变量
我使用的是WIN10的系统,可以直接在任务栏输入环境变量,找到编辑系统环境变量按钮。
打开后,点击环境变量
3.2.配置用户变量及其PATH
在【用户变量】里新建变量OpenCV,变量值:为OpenCv安装路径的build目录。
在【用户变量】里编辑变量path,变量值:..opencv\build\x86\vc11\bin;
【注意!】一定要在编辑界面新建,否则会覆盖电脑上原来配置好的用户变量。覆盖原来的用户变量会导致电脑的任务栏按钮失灵、开始菜单快捷方式点选时无反应等问题,更严重的情况会导致无法开机等问题。(我就遇到了这个坑T_T ... )
同理配置ZBar的用户变量和path:
在这里可能有人会有疑问:编译器是VS2012,变量值不应该是XX\vc12\bin吗?注意,在OpenCV配置中,vc11即对应VS2012,vc12对应的是VS2013。
另一点要关注的是上述变量值到底应该是x86还是x64?这里x86还是x64的选择跟你的电脑是32位还是64位无关,vs2012编译环境默认的使用win32编译器,所以选择x86。
3.3.配置系统变量
在【系统变量】里编辑(或添加)Path变量,变量值为安装路径下的\opencv\build\x86\vc11\bin,和ZBar安装路径下的bin目录..\ZBar\bin。
【注意】要使用英文输入下的分号和前面已有的路径分开,千万不能覆盖原来的变量!添加完之后需要重启或注销计算机,环境变量才会生效。道理同用户变量path。
3.VS2012工程项目属性配置
3.1添加属性表
新建Win32控制台应用程序,工程名命名为ZbarTest,过程图就省略~
在工程ZbarTest工程的视图目录的下拉菜单中打开属性管理器:
在属性管理器的Debug|Win32目录上单击选择“添加新项目属性表”,新建属性表,并命名为“Zbar_Debug_Setting.props“,如下图所示:
点击添加,完成对项目属性表的添加。
同理,添加OpenCV_DebutSetting,如下图。
3.2.Zbar属性表配置
1) VC++目录配置
双击刚才添加的“Zbar_Debug_Setting.props“属性表,选择通用属性->VC++目录:
在VC++目录->包含目录里添加1个目录: 安装路径ZBar\include
选择VC++目录->库目录,在库目录里添加1个目录: 安装路径\ZBar\lib
2)输入目录配置
打开通用属性->链接器->输入:
在附加依赖项里添加1个依赖项: libzbar-0.lib
3.3.OpenCV属性表配置
同理,双击刚才添加的“Zbar_Debug_Setting.props“属性表 配置OpenCV 属性表。
1)选择通用属性->VC++目录,在包含目录里添加3个目录:
D:\ProgramFilesD\opencv\build\include\opencv2
D:\ProgramFilesD\opencv\build\include\opencv
D:\ProgramFilesD\opencv\build\include
2)同样在VC++目录下,在库目录里添加1个目录:
...\opencv\build\x86\vc11\lib
3)选择通用属性->链接器->输入->附加依赖项,在附加依赖项里添加库文件:
opencv_ml2413d.lib
opencv_calib3d2413d.lib
opencv_contrib2413d.lib
opencv_core2413d.lib
opencv_features2d2413d.lib
opencv_flann2413d.lib
opencv_gpu2413d.lib
opencv_highgui2413d.lib
opencv_imgproc2413d.lib
opencv_legacy2413d.lib
opencv_objdetect2413d.lib
opencv_ts2413d.lib
opencv_video2413d.lib
opencv_nonfree2413d.lib
opencv_ocl2413d.lib
opencv_photo2413d.lib
opencv_stitching2413d.lib
opencv_superres2413d.lib
opencv_videostab2413d.lib
至此,VS2012环境下配置OpenCV2.4.13和ZBar的工作已经全部完成了,对于之后创建的OpenCV工程,只需要添加本工程的属性配置即可,不再需要一步一步重复配置。
【方法】:首先保存本工程的属性配置文件OpenCV_Debug_Setting.props到备用文件夹,该属性配置文件在本项目中的路径是:
...Visual Studio 2012\Projects\ZbarOpenCvTest\ZbarOpenCvTest
之后在新创建的工程中,在属性管理器中添加OpenCV_Debug_Setting.props属性表即可。
同理:之后在新创建的工程中,在属性管理器中添加ZBar_Debug_Setting.props属性表即可。
4.测试代码
4.1 OpenCV测试代码
#include <iostream>
#include<core/core.hpp>
#include<highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{ //读入图片,注意图片路径
Mat image=imread("F:\\Picture\\lena.png");
//图片读入成功与否判定
if(!image.data)
{
cout<<"you idiot!where did you hide lena!"<<endl;
//等待按键
system("pause");
return -1;
}
//创建一个名字为“Lena”的图像显示窗口,(不提前声明也可以)
namedWindow("Lena",1);
//显示图像
imshow("Lena",image);
//等待按键
waitKey();
return 0;
}
测试结果:会显示代码指定目录下的lena图片
4.2.Zbar测试代码
#include "zbar.h"
#include "cv.h"
#include "highgui.h"
#include <iostream>
using namespace std;
using namespace zbar; //添加zbar名称空间
using namespace cv;
int main(int argc,char*argv[])
{
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
Mat image = imread("code.jpg");
if(!image.data)
{
cout<<"请确认图片"<<endl;
system("pause");
return 0;
}
Mat imageGray;
cvtColor(image,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",image);
waitKey();
imageZbar.set_data(NULL,0);
return 0;
}
测试结果:
注意,图片应存放在生成的.exe目录下。