爱美容
当前位置: 首页 美容百科

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

时间:2023-05-31 作者: 小编 阅读量: 1 栏目名: 美容百科

一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值:对于锚点的位置,有默认值Point,表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。

计算机视觉,我们前期文章分享了很多关于类似这方面的文章,包括人脸识别三部曲,目标检测,目标追踪等,本期文章,我们介绍一下如何使用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条形码的检测

    推荐阅读
  • 和smart大小差不多的燃油车(这两款高颜值小车为女人打起来了)

    前有梅赛德斯-奔驰与吉利联姻的最新产物smart精灵#1,圆润可爱的风格以及鲜艳的配色,十分适合女性消费者。后有最近上市的欧拉芭蕾猫,不仅有着极富个性的复古造型,而且诸多针对女生的配套化智能功能也是做足了功课。由上表可见,芭蕾猫入门版车型的配置相比smart精灵#1入门版更占优势,当然,售价方面也会更贵些。从实际体验来看,两款车型的乘坐空间表现其实没有太大的差距,毕竟smart精灵#1的空间的体验者是男性且身高更高。

  • 奥迪quattro超神瞬间(原来太阳神的诞生)

    Gumpert这个品牌说起来既陌生又熟悉,陌生的是单拎出来无人耳闻,熟悉的是奥迪quattro之父正是Gumpert先生。而Gumpert自立门户的原因也很简单,Gumpert先生认为发售新车都像是一个“谎言”,小改款就告诉大家这是一台新车,却无法掩盖骨子里是一台旧车的事实,愤怒之下便自己出来单干,于是才有第一辆超级跑车Apollo。可以说是Apollo生来就是为后面的大哥奠定基础,功不可没。

  • 无敌是多么寂寞毫无破绽的伪装(无敌是多么寂寞)

    北京时间昨天凌晨,英超第22轮焦点大战,面对孙兴慜、凯恩、阿里和埃里克森组成的热刺攻击线,红魔门神高接抵挡,奉献本赛英超最高的单场11次扑救,力保曼联从温布利大球场全取三分。比战绩飙升更令红魔球迷们激动的,是期待已久的曼联精神的回归。全场比赛德赫亚共做出11次成功扑救,刷新了本赛季英超纪录。

  • 最近几天频繁胃疼(气得胃疼真是病)

    郑先生在深圳和广州四处求医,多次做胃镜和腹部超声检查,仅提示浅表性胃炎和胆囊炎,服用药物效果不明显。近日,郑先生终于在深圳大学总医院诊断出胃病的根源,“罪魁祸首”竟是情绪。十多年来,郑先生一直被胃部不适折磨,且导致情绪焦躁,夜间易醒,白天浑身疲倦,心神不定。宋鲁平说,长期受疼痛折磨,再加上情绪焦虑和易怒,郑先生已经处于轻度焦虑状态,睡眠浅,精神不稳定,躁动。而怒气伤肝,肝影响胃部。

  • 天山雪菊的功效作用及禁忌(天山雪菊的功效作用及禁忌是什么)

    是国内心血管专家一致评定的治疗冠心病的特殊药食两用植物。因此具有杀菌、抑菌、消炎、预防感冒和慢性肠炎的功效。对用眼过度造成的视觉疲劳与饮酒造成的肝脏伤害等症状,有一定的缓解作用。雪菊含有对人体有益的18种氨基酸和15种微量元素,对高血压、高血脂、高血糖、冠心病有着特殊的疗效,并具有杀菌、消炎、预防感冒和慢性肠炎的功效,对于失眠也有相当好的调理作用,可作茶饮。

  • 霍元甲主题曲(霍元甲主题曲完整歌词)

    以下内容大家不妨参考一二希望能帮到您!霍元甲主题曲《万里长城永不倒》歌曲,由卢国沾作词,黎小田作曲,叶振棠演唱。是20世纪八十年代热播电视剧《大侠霍元甲》的主题曲。

  • 斗破苍穹第四季第17集美杜莎(斗破苍穹第三季第5集)

    斗破苍穹第三季第5集的故事目前已经更新,在本集的故事中,看起来吞噬异火失败的美杜莎女王,却成为了一条白蛇的样子,还被萧炎拿在手心,成为萧炎的宠物。不过十分遗憾的是,虽然费尽千辛万苦,但是美杜莎女王仍然是失败了。此时,天地降下暴雷,萧炎和药老都被波及,药老也为了萧炎受了不少的伤害。不过萧炎药老他们却发现了一条小白蛇出现,这就是美杜莎女王的本体。

  • 吃车厘子有哪些注意事项(吃车厘子的禁忌有哪些)

    吃车厘子有哪些注意事项?跟着小编一起来看一看吧!车厘子是一种温性的水果,食用过多容易增加体内阳气,出现口干舌燥、长痘等上火情况,一般建议一天食用10颗左右。糖尿病患者不建议食用。车厘子中含有大量的糖分,糖尿病人食用过多的话,会导致体内血糖含量升高,对病情有所加重,影响身体健康。车厘子中的钾元素比较丰富,高钾患者食用过多的话,容易对高钾患者的病情产生影响。

  • 花菜怎么炒才好吃(花菜如何炒才好吃)

    食材:花菜300g、西红柿250g、大蒜适量、青椒50g、盐适量,下面我们就来说一说关于花菜怎么炒才好吃?将花菜掰成一朵朵,与番茄一切冲洗干净。锅里倒水,将花菜焯一下,捞出沥水。将大蒜切片,番茄切丁,青椒切段。下入番茄翻炒,炒得越软烂越好,直至炒出番茄汁。放蒜片,倒水没过番茄。放入焯好的花菜,加盐、胡椒粉。盖上锅盖中小火慢煮。等到汤汁收了一半多的时候,放入青椒、味精,装盘,一份超级好吃又营养的番茄花菜就做好了。

  • 用电热毯影响怀孕(致过敏影响生育)

    小孩如果习惯了电热毯的热度,会使孩子对寒冷的抵抗力下降,免疫力降低,影响生长发育,不推荐使用。电热毯是机械升温,会破坏人体的平衡机制。或许可能成为心脑血管血管意外的导火线。综上所述,不建议长期使用电热毯,一般使用电热毯2小时,睡觉后应关闭,不可长时间开启使用。