• 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 }
  • 相关阅读:
    ORA-01113: file xxxx needs media recovery
    Linux rm删除大批量文件
    SQL Server删除distribution数据库
    SQL Server 2008 R2 Service Pack 3 已经发布
    YourSQLDba开源项目发布到codeplex网站了
    ORACLE回收站机制介绍
    ORACLE临时表空间总结
    数据库服务器改名导致Reporting Service不可用的案例
    ORACLE 11g 数据库体系结构图
    ORACLE 10g 数据库体系结构图
  • 原文地址:https://www.cnblogs.com/ckrgd/p/14007625.html
Copyright © 2020-2023  润新知