zbar下条形码和二维码的识别与解码Ⅰ|2021SC@SDUSC

news/2024/11/25 16:29:12/

2021SC@SDUSC

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

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

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

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

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

本次先着重研究前两步:

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

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

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

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

源码如下:

void MyClass::Dis_code(Mat image){Mat imageGray;  // 所转化成的灰度图像 //定义一个扫描仪  ImageScanner scanner;scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);cvtColor(image, imageGray, CV_RGB2GRAY);imshow("灰度图", imageGray);// 获取所摄取图像的长和宽  int width = imageGray.cols;int height = imageGray.rows;// 在Zbar中进行扫描时候,需要将OpenCV中的Mat类型转换为(uchar *)类型,raw中存放的是图像的地址;对应的图像需要转成Zbar中对应的图像zbar::Image  uchar *raw = (uchar *)imageGray.data;Image imageZbar(width, height, "Y800", raw, width * height);// 扫描相应的图像imageZbar(imageZbar是zbar::Image类型,存储着读入的图像)  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;}waitKey(); // 等待按下esc键,若需要延时1s则改用waitKey(1000);  // 将图像中的数据置为0  imageZbar.set_data(NULL, 0);system("pause");}

结果如下:

条形码识别:

 

 

 

 

二维码识别:

 

 

3. 对非标准条形码,进行定位,然后用Zbar解码显示

在条形码的识别上,根据条形码的特性,我们只关心x轴上的形态。通过x轴的宽度进行确定条码的大小,y轴根据实际提取进行区分

处理的目标:

A.消去非码的其他物体图形

B.划定条码的范围

C.提取图片的ROI区域(即条码区域)

 总体分为:

灰度处理-》高斯平滑-》Sobel x—y梯度差-》均值滤波-》二值化-》闭运算-》腐蚀膨胀-》获取ROI

void MyClass::Run(){Mat image;image = getGray(srcimage);//获取灰度图image = getGass(image);//高斯平滑滤波image = getSobel(image);//Sobel x—y梯度差image = getBlur(image);//均值滤波除高频噪声image = getThold(image);//二值化image = getBys(image);//闭运算image = getErode(image);//腐蚀image = getDilate(image);//膨胀image = getRect(image, srcimage);//获取ROIimshow("最后的图", image);Dis_code(image);waitKey();}

灰度处理:

Mat MyClass::getGray(Mat image, bool show){//show默认false 待定参数法Mat cimage;cvtColor(image, cimage, CV_RGBA2GRAY);if (show)imshow("灰度图", cimage);return cimage;}

 处理结果:

 

 

 

 


http://www.ppmy.cn/news/263906.html

相关文章

JAVA基础,区别于C++

JAVA 基础 1. 数据类型 字节型 byte 1 字节 -128~127 短整型 short 2 字节 -32768~32767 整型 int 4 字节 -2147483648~2147483647 长整型 long 8 字节 -9223372036854775808L~92…

【霍尔榜】BJ金属3D打印常见问题解析

3D打印行业&#xff0c;BJ&#xff08;Binder Jetting&#xff09;技术现在比较热&#xff0c;最开始时BJ技术不叫粘结剂喷射,也一直没有应用到金属打印技术上面来。我们熟知的金属打印技术还主要是在激光SLM技术上&#xff0c;以前在实际应用当中&#xff0c;BJ打印的金属大家…

3D打印的应用范围

3D打印的应用范围涵盖汽车、航空航天、日常消费品、医疗、教育、建筑设计、玩具等各个领域&#xff0c;具有广阔的市场前景&#xff0c;下面我们就一起来了解一下什么是3D打印技术以及它的具体应用范围。 3D 打印技术&#xff0c;也被称为增材制造(Additive Manufacturing&…

【图像处理】条形码与二维码的定位与识别

代码实现简单环境下的条形码与二维码的定位与识别&#xff1a; 原图&#xff1a; #include<iostream> #include<opencv2\opencv.hpp> #include<zbar.h>using namespace std; using namespace cv; using namespace zbar;//寻找最大的轮廓 static vector<c…

ZPL条码及参数说明

^B1&#xff08;Code 11)也就是USD-8码。在Code 11条码中&#xff0c;每个字符由三个条的两个空组成&#xff0c;字符集为10个数字和破折号。   打印比例调整&#xff1a;2.0到3.0   ^FD(Field Data:数据字段)限制&#xff1a;100字符。实际总数据由^BY的比例与标签的宽度&…

条形码 - 技术优势与分类介绍

博主福利&#xff1a;100G电子设计学习资源包&#xff01; http://mp.weixin.qq.com/mp/homepage?__bizMzU3OTczMzk5Mg&hid7&snad5d5d0f15df84f4a92ebf72f88d4ee8&scene18#wechat_redirect -------------------------------------------------------------------…

Zemax-偏振、膜层和散射

光线追迹程序通常将光线视为纯粹的几何实体&#xff0c;其只拥有位置、方向和相位等资讯。例如&#xff0c;光线在表面上完全可以通过光线交切点座标说明&#xff0c;然后用方向余弦定义在局域坐标轴上的光线角度&#xff0c;并且用相位确定沿着光线累积的光程长或光程差。 在两…

条码方向定位

参考了一篇论文的思想&#xff0c;主要思路就是通过分块求取各窗口内的梯度方向&#xff0c;利用密度阈值过滤。缺点是要手动定义窗口大小和密度值。 具体代码如下&#xff1a; //窗口内计算边缘密度特征 struct EdgeDensity {int num; //边缘点数float orient; //边缘梯度方…