OpenCv+Zbar在工业环境下读取条形码和二维码

科技   工业农业   2024-11-26 10:12   北京  

 

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;

}


机器视觉课堂
OpenCV、Halcon等机器视觉专业学习交流平台,服务于工业自动化、先进机器人技术、人工智能等相关专业技术人才。定期发布最新机器视觉相关新闻、应用案例、技术资料、展会信息等信息。
 最新文章