VC++ OpenCV 和 Zbar的配置方法 识别图片二维码的代码

OpenCV 下载地址:https://opencv.org/releases/

Zbar 下载地址:http://zbar.sourceforge.net/download.html

我用的是win10 + VS2010 + OpenCV2.4.10 + Zbar 0.10

 OpenCV 和 Zbar 的配置方法

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 进行二维码解析以及提高识别率

vc++ opencv+zbar 提高二维码识别率

 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 }
原文地址:https://www.cnblogs.com/ckrgd/p/14007625.html