Zabr是一种开源的一维码和二维码检测工具,该工具检测时适应性很强,如下图的示例图片在不进行任何图像处理情况下都可以便正确读取条形码或者二维码的信息,适合于工业环境下光照不稳定情况下识别条形码和二维码。
该库是基于C语言开发,可以方便的进行平台间的移植。
识别条形码和二维码的主要步骤如下:
1.算法初始化:构造扫描器对象用set_config()进行初始化。
2.载入图片,转化为灰度图。
3.图像初始化。
4.对图像进行扫描。
5.显示条码读取结果。
Image::SymbolIterator symbol = imageZbar.symbol_begin();
symbol->get_type_name()
symbol->get_data()
经过试验Zbar具有很强的鲁棒性,可以同时识别多个条形码或二维码,部分检测结果如图所示。
检测代码
#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include "video/tracking.hpp"
#include<iostream>
#include <iostream>
#include <zbar.h>
#define STR(s) #s
using namespace zbar;
using namespace cv;
using namespace std;
int main(int argc, char*argv[])
{
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
Mat image = imread("../data/2code.jpg");
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;
}
imshow("Source Image", image);
waitKey();
imageZbar.set_data(NULL, 0);
return 0;
}