基于opencv3.0和zbar下条形码和二维码的识别与解码

其中对条码与二维码的识别分为以下4个步骤

1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比。

2. 利用opencv和Zbar(或者Zxing)对标准的QR二维码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比。

3. 对非标准条形码,进行定位,然后用Zbar(或者Zxing)解码显示。

4. 对非标准的QR二维码图片,进行定位,然后用Zbar(或者Zxing)解码显示。

1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比。 2. 利用opencv和Zbar(或者Zxing)对标准的QR二维码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比。

这两部对于zbar可以一并操作。

操作步骤主要分为两部分:A.原图进行灰度转化,B.送入Zbar扫描仪进行扫描(调用ImageScanner)

源码如下:

1 /****************************************************** 2 函数名称: Dis_Barcode 3 函数功能: 识别条形码和二维码 4 传入参数: 5 返 回 值: 6 建立时间: 2018-05-19 7 修改时间: 8 建 立 人: 9 修 改 人: 10 其它说明:这里是借鉴其他人的代码: 11 原文链接:https://www.cnblogs.com/dengxiaojun/p/5278679.html 12 以下代码是经过改动的 13 ******************************************************/ 14 void MyClass::Dis_code(Mat image){ 15 Mat imageGray; // 所转化成的灰度图像 16 //定义一个扫描仪 17 ImageScanner scanner; 18 scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1); 19 20 cvtColor(image, imageGray, CV_RGB2GRAY); 21 imshow("灰度图", imageGray); 22 // 获取所摄取图像的长和宽 23 int width = imageGray.cols; 24 int height = imageGray.rows; 25 // 在Zbar中进行扫描时候,需要将OpenCV中的Mat类型转换为(uchar *)类型,raw中存放的是图像的地址;对应的图像需要转成Zbar中对应的图像zbar::Image 26 uchar *raw = (uchar *)imageGray.data; 27 Image imageZbar(width, height, "Y800", raw, width * height); 28 // 扫描相应的图像imageZbar(imageZbar是zbar::Image类型,存储着读入的图像) 29 scanner.scan(imageZbar); //扫描条码 30 Image::SymbolIterator symbol = imageZbar.symbol_begin(); 31 if (imageZbar.symbol_begin() == imageZbar.symbol_end()) 32 { 33 cout << "查询条码失败,请检查图片!" << endl; 34 } 35 for (; symbol != imageZbar.symbol_end(); ++symbol) 36 { 37 cout << "类型:" << endl << symbol->get_type_name() << endl << endl; 38 cout << "条码:" << endl << symbol->get_data() << endl << endl; 39 } 40 41 waitKey(); // 等待按下esc键,若需要延时1s则改用waitKey(1000); 42 43 // 将图像中的数据置为0 44 imageZbar.set_data(NULL, 0); 45 system("pause"); 46 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzwxsx.html