当前位置:首页 > 生活百科

opencv二维码识别算法(基于opencv的图像数字识别)

栏目:生活百科日期:2025-01-21浏览:0

计算机视觉,我们前期文章分享了很多关于类似这方面的文章,包括人脸识别三部曲,目标检测,目标追踪等,本期文章,我们介绍一下如何使用opencv来进行条形码的检测,毕竟超市里面的物品都是有价格条形码,如何进行opencv条形码的检测,便成了无人超市需要重点关注并需要解决的问题

opencv条形码的检测

opencv条形码的检测

import numpy as npimport cv2image = cv2.imread("11.jpg")gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

首先我们导入需要进行检测的图片,并把RGB颜色空间的图片转换成灰度照片

代码截图

ddepth =  cv2.CV_32FgradX = cv2.Sobel(gray, ddepth=ddepth, dx=1, dy=0, ksize=-1)gradY = cv2.Sobel(gray, ddepth=ddepth, dx=0, dy=1, ksize=-1)gradient = cv2.subtract(gradX, gradY)gradient = cv2.convertScaleAbs(gradient)blurred = cv2.blur(gradient, (9, 9))(_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)

然后,我们使用cv.sobel算子进行图片的X Y 轴的边缘检测,并使用cv2.subtract(gradX, gradY)计算图片的梯度,以Sobel算子计算x,y方向上的梯度,之后在x方向上减去y方向上的梯度,通过这个减法,我们留下具有高水平梯度和低垂直梯度的图像区域,然后cv2.convertScaleAbs返回图片的unit8格式,参考图片如下。

高水平梯度和低垂直梯度的图像区域

函数原型:dst=cv2.Sobel(src,ddepth,dx,dy&[,dst&[,ksize&[,scale&[,delta&[,borderType]]]]])

函数参数

  1. src &– 需要处理的图像

  2. ddepth &– 图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度

  3. dx &– 对x轴方向求导的阶数,一般为0、1、2,其中0表示这个方向上没有求导

  4. dy &– 对y轴方向求导的阶数,一般为0、1、2,其中0表示这个方向上没有求导

  5. dst &– 目标图像

  6. ksize &– Sobel算子的大小,必须为1、3、5、7

  7. scale &– 缩放导数的比例常数,默认情况下没有伸缩系数

  8. delta &– 可选增量, 将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中

  9. borderType &– 图像边界的模式。这个参数默认值为cv2.BORDER_DEFAUL

在经过处理后,需要用convertScaleAbs()函数将其转回原来的uint8形式,否则将无法显示图像,而只是一副灰色的窗口。

函数原型:dst=cv2.convertScaleAbs(src&[,dst&[,alpha&[,beta]]]) 其中可选参数alpha是伸缩系数,beta是加到结果上的一个值,结果返回uint8类型的图片#absX=cv2.convertScaleAbs(x)#转回uint8#absY=cv2.convertScaleAbs(y)

代码截图

在图像的读取中,会存在一些噪噪声点,如一些白噪声,因此我们需要进行去噪操作

opencv4种去噪操作

1. cv2.blur(均值滤波) 2.cv2.boxfilter(方框滤波)3. cv2.Guassiannblur(进行高斯滤波)4. cv2.medianBlur(进行中值滤波)
1.cv2.blur(img, (3, 3)) 进行均值滤波参数说明:img表示输入的图片, (3, 3) 表示进行均值滤波的方框大小
2. cv2.boxfilter(img, -1, (3, 3), normalize=True) 表示进行方框滤波,参数说明当normalize=True时,与均值滤波结果相同, normalize=False,表示对加和后的结果不进行平均操作,大于255的使用255表示
3. cv2.Guassianblur(img, (3, 3), 1) 表示进行高斯滤波,参数说明: 1表示σ, x表示与当前值得距离,计算出的G(x)表示权重值
4. cv2.medianBlur(img, 3) #中值滤波,相当于将9个值进行排序,取中值作为当前值参数说明:img表示当前的图片,3表示当前的方框尺寸

阈值处理(cv2.threshold) 后图片

opencv: 阈值处理(cv2.threshold)

cv2.threshold (src, thresh, maxval, type)src:源图片,必须是单通道thresh:阈值,取值范围0~255maxval:填充色,取值范围0~255type:阈值类型,具体见下表

阈值类型

图片形态学

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)closed = cv2.erode(closed, None, iterations = 4)closed = cv2.dilate(closed, None, iterations = 4)

代码截图

通过以上操作,我们已经检测到了条形码的大致位置,然后使用内核函数获取图片外形的形态学,并分别执行4次形态学腐蚀与膨胀,获取更精确的图片形状位置

kernel = cv2.getStructuringElement这个函数的第一个参数表示内核的形状,有三种形状可以选择矩形:MORPH_RECT;交叉形:MORPH_CROSS;椭圆形:MORPH_ELLIPSE;

第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得

getStructuringElement函数的返回值: 对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。

cv2.morphologyEx(src, op, kernel) 进行各类形态学的变化参数说明:src传入的图片op进行变化的方式kernel表示方框的大小2.op = cv2.MORPH_OPEN 进行开运算,指的是先进行腐蚀操作,再进行膨胀操作3. op = cv2.MORPH_CLOSE 进行闭运算, 指的是先进行膨胀操作,再进行腐蚀操作开运算:表示的是先进行腐蚀,再进行膨胀操作闭运算:表示先进行膨胀操作,再进行腐蚀操作

cv2.morphologyEx后图片

形态学图片转换完成后,进行图片的腐蚀与膨胀,这里主要是获取更精确的外形。

腐蚀与膨胀属于形态学操作,所谓的形态学,就是改变物体的形状,形象理解一些:腐蚀=变瘦 膨胀=变胖,主要是采用 cv2.erode()cv2.dilate(),需要注意一点的是,腐蚀和膨胀主要针对二值化图像的白色部分

腐蚀与膨胀后图片

图片外轮廓的绘制

cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts = cnts&[0]c = sorted(cnts, key = cv2.contourArea, reverse = True)&[0]rect = cv2.minAreaRect(c)box = cv2.boxPoints(rect)box = np.int0(box)cv2.drawContours(image, &[box], -1, (0, 255, 0), 3)cv2.imshow("Image", image)cv2.waitKey(0)

代码截图

我们通过以上的步骤,已经成功锁定图片条形码的位置,然后使用cv2.findContours函数找到图片的外形,并画出图片的外形。

(_, cnts, _) = cv2.findContours(    参数一: 二值化图像    closed.copy(),    参数二:轮廓类型    # cv2.RETR_EXTERNAL,             #表示只检测外轮廓    # cv2.RETR_CCOMP,                #建立两个等级的轮廓,上一层是边界    # cv2.RETR_LIST,                 #检测的轮廓不建立等级关系    # cv2.RETR_TREE,                 #建立一个等级树结构的轮廓    # cv2.CHAIN_APPROX_NONE,         #存储所有的轮廓点,相邻的两个点的像素位置差不超过1    参数三:处理近似方法    # cv2.CHAIN_APPROX_SIMPLE,         #例如一个矩形轮廓只需4个点来保存轮廓信息    # cv2.CHAIN_APPROX_TC89_L1,    # cv2.CHAIN_APPROX_TC89_KCOS    )

然后对找到的所有轮廓点进行重新排序

sorted(iterable, key=None, reverse=False)  参数说明:iterable -- 可迭代对象。key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。返回值返回重新排序的列表。

排序完成后的list传递给cv2.minAreaRect(Points)函数

其中points是点集,数据类型为ndarray,array((x1,y1),(x2,y2),&….,(xn,yn))

而minAreaRect就是求出在上述点集下的最小面积矩形

rect[0]返回矩形的中心,(x,y),实际上为y行x列的像素点

利用cv2.boxPoints(rect)可以返回矩形四个点的值,其中cv2.boxPoints(rect)&[0]为point&[0],cv2.boxPoints(rect)&[1]为point&[1].rect&[1]返回矩形的长和宽rect&[2]返回矩形的旋转角度

有了box的外形4个图形点,便可以使用cv2.drawContours函数把4个点连接起来,形成一个矩形轮廓,最后显示图片

opencv条形码的检测

“opencv二维码识别算法(基于opencv的图像数字识别)” 的相关文章

aso评论优化(详解aso测定)

在这个行业的人都知道换评这件事情,但是现在渠道的评论也便宜了,机刷也可以安排了,为什么还是有那么多的小伙伴每天都手动换评呢,既浪费时间又有人力成本?评论能影响A...

一万元创业项目有哪些,适合农村一万元创业项目推荐

想创业,却苦于没有资金支持。其实,最佳的创业项目莫过于那些成本低且利润高的项目。一万元开店项目有哪些?下面,为大家介绍几个小本创业项目。一万元开店项目推荐1、解...

2020年黑大选课系统开放时间(新手必备黑大选课攻略大全

维州疫情仍在持续发展,今日数据再次打破记录,单日新增317例,而其中289例无法追溯来源。受疫情影响,各大高校都不得不再次放弃传统的面对面授课,转为线上授课。让...

什么是搜索引擎整合营销,营销推广方式与渠道介绍

搜索引擎整合营销,即为了扩展搜索引擎为企业所带来的商业价值,综合利用各类搜索引擎媒体资源,策划有效的网络营销方案,包括网站运营策略分析,并进行实施,同时,对营销...

nginx配置server无法访问(3分钟全面了解nginx配置内容)

Nginx是现在最火的服务器web和反向代理服务器,反向代理是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器...

少将是什么级别的干部(浅谈少将和省长的权利对比)

我们在很多的抗战影视作品会看到非常多的抗战英雄,小编小的时候看过一部叫做《亮剑》的电视作品,剧中的主角李云龙也是带给大家非常深的印象,他性格上也是一个非常古怪的...

三星平板怎么样(三星平板电脑所有型号)

三星或很快面向全球市场推出GalaxyTabS8系列平板电脑(以及GalaxyS22系列旗舰智能机),且有望带来TabS8/S8+/S8Ultra三款型号。尽管...

ghost恢复系统教程(讲述ghost全盘镜像还原步骤)

Windows系统并不具备恢复丢失数据的功能。若想从硬盘中恢复丢失的数据,只能求助于第三方的数据恢复软件。硬盘分区是使用磁盘管理工具在一个硬盘上创建几个逻辑部分...

win10快捷键关闭软件(win10关闭热键模式)

知道怎样区分新手和老鸟么?那就要看他会多少Win10快捷键了。新手疲于奔命,老鸟上班摸鱼!靠的就是自身“过硬”的快捷键技术。好了,我知道看这篇文章的新手比较多,...

小草龟怎么养,3分钟就能学会的实用草龟饲养方法

草龟其实就是中华草龟,是我国常见龟类。常栖于江河,湖沼或池塘中。喜食蠕虫、螺类、虾及小鱼等动物,也吃植物茎叶及粮食等。往往成熟的公龟身体会变成黑色,业内人称为墨...