在vs2008中使用zbar库zbar扫描相册二维码二维码怎么用

二维码解码器Zbar+VS2012开发环境配置
Zbar条码解码器是一个开源的二维码(包括条形码)解码器,可以识别来至于视频流,图像文件、手持扫码器和视频设备(如摄像头)等二维码识别,支持EAN-13/UPC-A, UPC-E, EAN-8, Code 128, Code 39, QR Code(二维码)等常用编码方式的条形码/二维码。
下边这个简单粗暴的图标就是Zbar:
Zbar的SDK支持包括C、C++、python在内的多种语言,也提供了IOS和Androdi的SDK可供使用,用起来也非常方便,只需要在编译环境里添加相应的路径就行了,再加上图像处理包,如ImageMagick++或Opencv的辅助读图,就可以编写准确高效的二维码识别程序了,下边就一步一步的介绍如何在vs2012中配置Zbar。
1. 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\ 添加之后系统就不会找不到需要的dll文件了。
添加完之后务必记得注销电脑后生效。
OK!完成这4个步骤的动作,整个Zbar和VS2012的配置工作就全部完成了。
5. 环境测试
最后通过一个例程,来测试一下配置是否OK,这个例子的实现是查找到输入图片中的二维码,并在控制台窗口和图片窗口中分别输出二维码的内容。
#include &zbar.h&
#include &cv.h&
#include &highgui.h&
//添加zbar名称空间
int main(void)
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
// 等待用户输入完整条形码/二维码路径+名称,把图片直接拖入窗口即可
char file[256];
Mat img = imread(file,0);
cvtColor(img,imgout,CV_GRAY2RGB);
int width = img.
int height = img.
uchar *raw = (uchar *)img.
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++)
cout&&&Decoded:&&<endl<get_type_name()&<endl<get_data()&<endl<get_location_size();
for(int i=0;iget_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: &&<r.angle<&运行之后,弹出控制台窗口,把带有二维码的图片拖入后回车,效果如下:&&换用二维码图片:&
</r.angle<</endl<</endl<</endl<
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'首先说明我的测试场景是&识别打印在纸上的二维码&,在扫描结果中寻找二维码并进行识别,而不是直接让摄像头对着二维码扫描。
zbar和zxing用的都是自己从github上clone的c++源码/接口编译出来的dll,都是默认参数
再说结论:测了大概几千张图片,两个库的准确率差不多(由于图片场景的多样性,确切的准确率数字也没有什么意义),但是zbar的速度要快很多,大概是zxing的4-5倍。其实两个库的准确率都不太如人意,稍微模糊一点就无法识别,甚至有一些不模糊的图像也识别不出。相比之下,微信的识别效果就逆天了,怎么折腾都能识别出来,让我很好奇。
后来自己尝试改进识别效果,先看了一下二维码的识别原理,太复杂了,无从下手。于是尝试对图像进行预处理改进,结果只是用了一个二值化加开运算就让识别效果得到了大幅提升,让我很奇怪这么简单的预处理为什么开发人员没有去做呢?然后又继续优化了一下,发现二值化的阈值对二维码的识别非常关键,badcase通常是因为阈值不合适导致的,于是牺牲了一下性能,在识别程序中多次尝试不同阈值,最终识别效果达到了比较令人满意的结果,准确率从90%左右上升到99.8%左右,绝大部分打印不清晰导致的badcase都得到了解决,代码如下:
#include &iostream&
#include &include\zbar.h&
#include "opencv/cv.h"
#include "opencv/highgui.h"
using namespace
using namespace
using namespace
//zbar接口
string ZbarDecoder(Mat img)
const void *raw = (&img)-&
// configure the reader
scanner.set_config(ZBAR_QRCODE, ZBAR_CFG_ENABLE, 1);
// wrap image data
Image image(img.cols, img.rows, "Y800", raw, img.cols * img.rows);
// scan the image for barcodes
int n = scanner.scan(image);
// extract results
result = image.symbol_begin()-&get_data();
image.set_data(NULL, 0);
//对二值图像进行识别,如果失败则开运算进行二次识别
string GetQRInBinImg(Mat binImg)
string result = ZbarDecoder(binImg);
if(result.empty())
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(binImg, openImg, MORPH_OPEN, element);
result = ZbarDecoder(openImg);
//main function
string GetQR(Mat img)
//在otsu二值结果的基础上,不断增加阈值,用于识别模糊图像
int thre = threshold(img, binImg, 0, 255, cv::THRESH_OTSU);
while(result.empty() && thre&255)
threshold(img, binImg, thre, 255, cv::THRESH_BINARY);
result = GetQRInBinImg(binImg);
thre += 20;//阈值步长设为20,步长越大,识别率越低,速度越快
阅读(...) 评论()首先说明我的测试场景是“识别打印在纸上的二维码”,在扫描结果中寻找二维码并进行识别,而不是直接让摄像头对着二维码扫描。
zbar和zxing用的都是自己从github上clone的c&#43;&#43;源码/接口编译出来的dll,都是默认参数
再说结论:测了大概几千张图片,两个库的准确率差不多(由于图片场景的多样性,确切的准确率数字也没有什么意义),但是zbar的速度要快很多,大概是zxing的4-5倍。其实两个库的准确率都不太如人意,稍微模糊一点就无法识别,甚至有一些不模糊的图像也识别不出。相比之下,微信的识别效果就逆天了,怎么折腾都能识别出来,让我很好奇。
后来自己尝试改进识别效果,先看了一下二维码的识别原理,太复杂了,无从下手。于是尝试对图像进行预处理改进,结果只是用了一个二&#20540;化加开运算就让识别效果得到了大幅提升,让我很奇怪这么简单的预处理为什么开发人员没有去做呢?然后又继续优化了一下,发现二&#20540;化的阈&#20540;对二维码的识别非常关键,badcase通常是因为阈&#20540;不合适导致的,于是牺牲了一下性能,在识别程序中多次尝试不同阈&#20540;,最终识别效果达到了比较令人满意的结果,准确率从90%左右上升到99.8%左右,绝大部分打印不清晰导致的badcase都得到了解决,代码如下:
#include &iostream&
#include &include\zbar.h&
#include &opencv/cv.h&
#include &opencv/highgui.h&
using namespace
using namespace
using namespace
//zbar接口
string ZbarDecoder(Mat img)
const void *raw = (&img)-&
// configure the reader
scanner.set_config(ZBAR_QRCODE, ZBAR_CFG_ENABLE, 1);
// wrap image data
Image image(img.cols, img.rows, &Y800&, raw, img.cols * img.rows);
// scan the image for barcodes
int n = scanner.scan(image);
// extract results
result = image.symbol_begin()-&get_data();
image.set_data(NULL, 0);
//对二&#20540;图像进行识别,如果失败则开运算进行二次识别
string GetQRInBinImg(Mat binImg)
string result = ZbarDecoder(binImg);
if(result.empty())
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(binImg, openImg, MORPH_OPEN, element);
result = ZbarDecoder(openImg);
//main function
string GetQR(Mat img)
//在otsu二&#20540;结果的基础上,不断增加阈&#20540;,用于识别模糊图像
int thre = threshold(img, binImg, 0, 255, cv::THRESH_OTSU);
while(result.empty() && thre&255)
threshold(img, binImg, thre, 255, cv::THRESH_BINARY);
result = GetQRInBinImg(binImg);
thre &#43;= 20;//阈&#20540;步长设为20,步长越大,识别率越低,速度越快
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1302次
排名:千里之外
转载:10篇
(4)(1)(5)(3)(2)(2)利用ZBar实现二维码扫描和生成 - iOS源码 - 其它 - 源码天空
> 其它 > 利用ZBar实现二维码扫描和生成
&热门iOS源码
利用ZBar实现二维码扫描和生成
资源等级:
上传会员:
资源类别:
文件大小:
原创作者:
发布时间:
运行平台:
下载次数:
&&&&在&ZBar&SDK(本站下载:/ios/ZBar-Barcode-Reader/4fa23f3f06f6e7ee)的基础上做的一个demo,能够将字符串转换成二维码,能够通过摄像头扫描二维码。代码里面有对如何使用&ZBarSDK&的详细说明。&&&&&&&编译测试,测试环境:Xcode&4.3,&iOS&5.0。
&&网友评论:(共有0条)
&&暂时还没有评论
&&→&发表我的评论:
*字数限制500个字符,超出部分将自动裁剪。二维码ZXing库或者ZBar怎样合到MFC项目中
[问题点数:45分,结帖人ZHANGJIXIN]
二维码ZXing库或者ZBar怎样合到MFC项目中
[问题点数:45分,结帖人ZHANGJIXIN]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 ios zbar生成二维码 的文章

 

随机推荐