OpenCV 下载地址:https://opencv.org/releases/
Zbar 下载地址:http://zbar.sourceforge.net/download.html
我用的是win10 + VS2010 + OpenCV2.4.10 + Zbar 0.10
OpenCV 和 Zbar 的配置方法
我也列一下配置方法
OpenCV配置方法
1.在"项目"——>"属性"——>"配置属性"——>"VC++目录"——>"包含目录"
"你的安装路径"opencvuildinclude
"你的安装路径"opencvuildincludeopencv
"你的安装路径"opencvuildincludeopencv2
2.在"项目"——>"属性"——>"配置属性"——>"VC++目录"——>"库目录"中添加
"你的安装路径"opencvuildx86vc10lib
这里x86表示程序是32位,64位选x64;vc10表示VS2010,使用其他版本VS请一一对应
3.在"项目"——>"属性"——>"配置属性"——>"链接器"——>"输入"——>"附加依赖项"中添加
opencvuildx86vc10lib 文件夹中的一堆.lib文件,这里带d的是debug模式用的,不带d的是release模式用的,2410表示OpenCV的版本
opencv_calib3d2410d.lib
opencv_contrib2410d.lib
opencv_core2410d.lib
opencv_features2d2410d.lib
opencv_flann2410d.lib
opencv_gpu2410d.lib
opencv_highgui2410d.lib
opencv_imgproc2410d.lib
opencv_legacy2410d.lib
opencv_ml2410d.lib
opencv_nonfree2410d.lib
opencv_objdetect2410d.lib
opencv_ocl2410d.lib
opencv_photo2410d.lib
opencv_stitching2410d.lib
opencv_superres2410d.lib
opencv_ts2410d.lib
opencv_video2410d.lib
opencv_videostab2410d.lib
opencv_calib3d2410.lib
opencv_contrib2410.lib
opencv_core2410.lib
opencv_features2d2410.lib
opencv_flann2410.lib
opencv_gpu2410.lib
opencv_highgui2410.lib
opencv_imgproc2410.lib
opencv_legacy2410.lib
opencv_ml2410.lib
opencv_nonfree2410.lib
opencv_objdetect2410.lib
opencv_ocl2410.lib
opencv_photo2410.lib
opencv_stitching2410.lib
opencv_superres2410.lib
opencv_ts2410.lib
opencv_video2410.lib
opencv_videostab2410.lib
Zbar配置方法
1.在"项目"——>"属性"——>"配置属性"——>"VC++目录"——>"包含目录"
"你的安装路径"Barinclude
2.在"项目"——>"属性"——>"配置属性"——>"VC++目录"——>"库目录"中添加
"你的安装路径"Barlib
3.在"项目"——>"属性"——>"配置属性"——>"链接器"——>"输入"——>"附加依赖项"中添加
libzbar-0.lib
验证OpenCV 和 Zbar 是否能正常工作的win32代码
大概意思是用opencv加载个图片转换成灰度图片,然后通过zbar识别,可以识别一张图片中有多个二维码的情况
当然zbar同时支持识别条形码和二维码
安装zbar后在安装目录ZBarexamplesscan_image.cpp,这个文件也提供了调用zbar识别多个二维码的例子
1 #include<core/core.hpp> 2 #include<highgui/highgui.hpp> 3 #include "zbar.h" 4 #include "cv.h" 5 #include "highgui.h" 6 #include <iostream> 7 8 using namespace std; 9 using namespace zbar; //添加zbar名称空间 10 using namespace cv; 11 12 int main(int argc, char*argv[]) 13 { 14 //定义扫描器 15 ImageScanner scanner; 16 scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1); 17 18 //加载图片 19 Mat image = imread("qrcode.jpg");//请更改图片,可以使用据对路径或相对路径 20 if (!image.data) 21 { 22 cout << "请确认图片" << endl; 23 system("pause"); 24 return 0; 25 } 26 27 //图片转换 28 Mat imageGray; 29 cvtColor(image, imageGray, CV_RGB2GRAY); 30 int width = imageGray.cols; 31 int height = imageGray.rows; 32 uchar *raw = (uchar *)imageGray.data; 33 34 Image imageZbar(width, height, "Y800", raw, width * height); 35 scanner.scan(imageZbar); //扫描条码 36 Image::SymbolIterator symbol = imageZbar.symbol_begin(); 37 //扫描结果打印 38 if (imageZbar.symbol_begin() == imageZbar.symbol_end()) 39 { 40 cout << "查询条码失败,请检查图片!" << endl; 41 } 42 for (; symbol != imageZbar.symbol_end(); ++symbol) 43 { 44 cout << "类型:" << endl << symbol->get_type_name() << endl << endl; 45 cout << "条码:" << endl << symbol->get_data() << endl << endl; 46 } 47 48 //显示二维码 49 imshow("Source Image", image); 50 waitKey(); 51 imageZbar.set_data(NULL, 0);//清除缓存 52 return 0; 53 }
提高识别二维码效率的代码
参考
使用zbar+opencv+cpp 进行二维码解析以及提高识别率
1 namespace QRCode 2 { 3 string GetQRInBinImg(Mat binImg); 4 string ZbarDecoder(Mat img); 5 6 //对二值图像进行识别,如果失败则开运算进行二次识别 7 string GetQR(Mat img) 8 { 9 Mat binImg; 10 Mat adaptiveImg; 11 double thre = threshold(img, binImg, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY_INV);//threshold 第一个参数即原图像必须为灰度图 12 string result; 13 result = GetQRInBinImg(binImg); 14 if (result.empty())//如果阈值otsuthreshold失败,则采用高斯自适应阈值化,可以识别出一定的控制阈值也识别不出来的二维码 15 { 16 adaptiveThreshold(img, adaptiveImg, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 33, 0);//threshold第一个参数即原图像必须为灰度图,最佳33 17 result = GetQRInBinImg(adaptiveImg); 18 } 19 20 thre = thre / 2;//ostu和自适应阈值都失败,将从ostu阈值的一般开始控制阈值不断增长 21 while (result.empty() && thre < 255) 22 { 23 threshold(img, binImg, thre, 255, THRESH_BINARY); 24 result = GetQRInBinImg(binImg); 25 thre += 20;//阈值步长设为5,步长越大,识别率越低,速度越快,对于当前测试图片的情况为5识别出来的最多 26 } 27 return result; 28 } 29 30 //主体函数 31 string GetQRInBinImg(Mat binImg) 32 { 33 string result = ZbarDecoder(binImg); 34 if (result.empty()) 35 { 36 Mat openImg; 37 Mat element = getStructuringElement(MORPH_RECT, Size(3, 3)); 38 morphologyEx(binImg, openImg, MORPH_OPEN, element); 39 result = ZbarDecoder(openImg); 40 } 41 return result; 42 } 43 44 //zbar接口 45 string ZbarDecoder(Mat img) 46 { 47 string result; 48 ImageScanner scanner; 49 const void *raw = (&img)->data; 50 scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1); 51 Image image(img.cols, img.rows, "Y800", raw, img.cols * img.rows); 52 scanner.scan(image); 53 Image::SymbolIterator symbol = image.symbol_begin(); 54 result = image.symbol_begin()->get_data(); 55 image.set_data(NULL, 0); 56 return result; 57 } 58 }