1. OpenCV3.4.1和zbar文件夹放到指定的路径下,我把它们放在了”D:\二维码\环境“中。

zbar:链接:https://pan.baidu.com/s/11eCDVHVA_R7ktQaX_l6gww 密码:ubzj

OpenCV3.4.1:链接:https://pan.baidu.com/s/1OVbLeG6qJ9aNqdF4UnFFLg 密码:460q

2. 环境变量配置:

右键“此电脑”——属性——高级系统设置——环境变量。

在系统变量中找到“Path”,编辑。

新建两个环境变量

D:\二维码\环境\opencv3.4.1\build\x64\vc14\bin

D:\二维码\环境\ZBar\bin

3. 在VS2010中新建项目。选择C++——Win32——Win32控制台应用程序,在附加选项中选择空项目。

4. 生成的项目中,在解决方案资源管理器中,右键解决方案——属性。配置属性——配置,配置选活动(Debug),平台选活动(x64)。

5. 视图——其他窗口——属性管理器。

6. 配置属性:

双击项目名——配置属性——VC++目录,在包含目录中加入:

D:\二维码\环境\ZBar\include

D:\二维码\环境\opencv3.4.1\build\include\opencv2

D:\二维码\环境\opencv3.4.1\build\include\opencv

D:\二维码\环境\opencv3.4.1\build\include

在库目录中加入:

D:\二维码\环境\ZBar\lib

D:\二维码\环境\opencv3.4.1\build\x64\vc14\lib

链接器——输入,在附加依赖项中加入:

opencv_world341d.lib

libzbar-0.lib

libzbar64-0.lib

测试代码如下,直接选择二维码图片识别,二维码是一个QRCODE,如果一幅图片上有多个二维码,也可以识别出来。该程序在网盘中,图片识别二维码。

图片识别二维码工程:链接:https://pan.baidu.com/s/1Bd-JJDarvc2yvXYQuwKPeA 密码:dyzz

#include "opencv2/opencv.hpp"
#include "zbar.h"
#include "cv.h"
#include "highgui.h"
#include <iostream>

using namespace std;
using namespace zbar;
using namespace cv;

int main(int argc, char** argv)
{
    zbar::ImageScanner scanner;
    scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
    string fileName="E:\\QR_CODE.bmp";
    Mat image = imread(fileName);
    double start=clock();
    if (!image.data)
    {
        cout << "请确认图片" << endl;
        system("pause");
        return 0;
    }
    Mat imageGray;
    cvtColor(image, imageGray, CV_RGB2GRAY);
    int width = imageGray.cols;
    int height = imageGray.rows;
    uchar *raw = (uchar *)imageGray.data;
    Image imageZbar(width, height, "Y800", raw, width * height);
    scanner.scan(imageZbar); //扫描条码
    Image::SymbolIterator symbol = imageZbar.symbol_begin();
    if (imageZbar.symbol_begin() == imageZbar.symbol_end())
    {
        cout << "查询条码失败,请检查图片!" << endl;
    }
    for (; symbol != imageZbar.symbol_end(); ++symbol)
    {
        cout << "类型:" << endl << symbol->get_type_name() << endl << endl;
        cout << "条码:" << endl << symbol->get_data() << endl << endl;
        string s=symbol->get_data();
    }
    double end=clock();
    double ts=end-start;
    cout<<ts<<endl;

    imshow("Source Image", image);
    waitKey();
    imageZbar.set_data(NULL, 0);
    system("pause");

    return 0;
}

调用摄像头代码: 

摄像头识别二维码工程:链接:https://pan.baidu.com/s/1nyl6Hj6nI9fy4rNt3I-PDA 密码:6rur

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>

using namespace cv;

int main(int argc, char** argv)
{
    VideoCapture cap(0);//0-前置摄像头,1-后置
    Mat frame;

    while (1)
    {
        cap >> frame;
        imshow("调用摄像头", frame);
        waitKey(1);
    }
    return 0;
}

用frame代替上例中的image就可以用摄像头扫描二维码了。

03-29 16:23