二维码解码器Zbar+VS2010开发环境配置
发现ImageMagick只是用来打开图片,转换成统一的灰度矩阵数据。所以这次我尝试用OpenCV来实现ImageMagick的功能。
2、安装完成后,到安装目录,将bin目录加入环境变量,在VS中VC++目录的include中加入头文件地址,lib地址,并加入lib名称(连接器-输入-附加依赖项),然后就可以使用了,具体使用查看下面的代码。
结果如下:首先我们的库文件在D:\Program Files\ZBar目录下
首先安装ZBar v0.10,然后其安装目录为D:\Program Files\ZBar。
所以,我们的库文件在D:\Program Files\ZBar目录下
在VC++目录->包含目录里添加1个目录: D:\ProgramFilesD\ZBar\include
选择VC++目录->库目录:
在库目录里添加1个目录: D:\ProgramFilesD\ZBar\lib
打开通用属性->链接器->输入:
在附加依赖项里添加1个依赖项:libzbar-0.lib
添加Zbar的动态库所在目录:D:\ProgramFilesD\ZBar\bin; 添加之后系统就不会找不到需要的dll文件了。
(此处代码参考别人的微博)
#include "zbar.h" #include#include using namespace std; using namespace zbar; //添加zbar名称空间 using namespace cv; int main(void) { ImageScanner scanner; scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1); // 等待用户输入完整条形码/二维码路径+名称,把图片直接拖入窗口即可 char file[256]; cin>>file; Mat img = imread(file,0); //Mat img=imread("www.baidu.com.png",0); Mat imgout; cvtColor(img,imgout,CV_GRAY2RGB); int width = img.cols; int height = img.rows; uchar *raw = (uchar *)img.data; Image image(width, height, "Y800", raw, width * height); int n = scanner.scan(image); for(Image::SymbolIterator symbol = image.symbol_begin();symbol != image.symbol_end();symbol++) { vector vp; cout<<"Decoded:"<get_type_name()< cout<<"Symbol:"< get_data()< int n = symbol->get_location_size(); for(int i=0;i { vp.push_back(Point(symbol->get_location_x(i),symbol->get_location_y(i))); } RotatedRect r = minAreaRect(vp); Point2f pts[4]; r.points(pts); Point textPoint(pts[1]); string codeNum=symbol->get_data(); for(int i=0;i<4;i++) { line(imgout,pts[i],pts[(i+1)%4],Scalar(255,0,0),3); //查找条码区域左上角坐标 textPoint.x>=pts[i].x?textPoint.x=pts[i].x:textPoint.x=textPoint.x; textPoint.y>=pts[i].y?textPoint.y=pts[i].y:textPoint.y=textPoint.y; //在图片上输出解码内容 putText(imgout,codeNum,textPoint,FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),1,8,false); } cout<<"Angle: "< } imshow("imgout.jpg",imgout); waitKey(); }
运行之后,弹出控制台窗口,把带有二维码的图片拖入后回车,效果如下: