zbar二维码识别

// ZBar_test.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include "stdafx.h"
#include "include\zbar.h"
#include "opencv2/opencv.hpp"
#include "opencv2/core.hpp"
#include "highgui.h"
#include <iostream>
using namespace std;
using namespace zbar;
using namespace cv;
string ZbarDecoder(Mat img)
{
    cv::namedWindow("Image", cv::WINDOW_AUTOSIZE);
    cv::imshow("Image", img);
    string result;
    ImageScanner scanner;
    const void *raw = (&img)->data;
    // 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
    Image::SymbolIterator symbol = image.symbol_begin();
    if (image.symbol_begin() == image.symbol_end())
    {
        cout << "Check Image Please" << endl;
    }
    for (; symbol != image.symbol_end(); ++symbol)
    {
        cout << "Code Type:" << endl << symbol->get_type_name() << endl << endl;
        cout << "Code Data:" << endl << symbol->get_data() << endl << endl;
    }
    image.set_data(NULL, 0);
    return result;
}
string GetQRInBinImg(Mat binImg)
{
    string result = ZbarDecoder(binImg);
    if (result.empty())
    {
        Mat openImg;
        Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
        morphologyEx(binImg, openImg, MORPH_OPEN, element);
        result = ZbarDecoder(openImg);
    }
    return result;
}
string GetQR(Mat img)
{
    Mat binImg;
    double thre = threshold(img, binImg, 0, 255, cv::THRESH_OTSU);
    string result;
    while (result.empty() && thre<255)
    {
        threshold(img, binImg, thre, 255, cv::THRESH_BINARY);
        result = GetQRInBinImg(binImg);
        thre += 20;
    }
    return result;
}
int main(int argc, char*argv[])
{
    Mat src = imread("barcode.png");
    cv::namedWindow("Source Image", cv::WINDOW_AUTOSIZE);

    if (!src.data)
    {
        cout << "image null" << endl;
        return 0;
    }
    cv::imshow("Source Image", src);
    cv::cvtColor(src, src, CV_RGB2GRAY);
    string re = GetQR(src);
    cout << re << endl;
    cv::waitKey();
    return 0;
}

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

究极调参工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值