计算机视觉,我们前期文章分享了很多关于类似这方面的文章,包括人脸识别三部曲,目标检测,目标追踪等,本期文章,我们介绍一下如何使用opencv来进行条形码的检测,毕竟超市里面的物品都是有价格条形码,如何进行opencv条形码的检测,便成了无人超市需要重点关注并需要解决的问题
opencv条形码的检测
首先我们导入需要进行检测的图片,并把RGB颜色空间的图片转换成灰度照片
代码截图
然后,我们使用cv.sobel算子进行图片的X Y 轴的边缘检测,并使用cv2.subtract(gradX, gradY)计算图片的梯度,以Sobel算子计算x,y方向上的梯度,之后在x方向上减去y方向上的梯度,通过这个减法,我们留下具有高水平梯度和低垂直梯度的图像区域,然后cv2.convertScaleAbs返回图片的unit8格式,参考图片如下。
高水平梯度和低垂直梯度的图像区域
函数参数:
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形式,否则将无法显示图像,而只是一副灰色的窗口。
在图像的读取中,会存在一些噪噪声点,如一些白噪声,因此我们需要进行去噪操作
阈值处理(cv2.threshold) 后图片
阈值类型
通过以上操作,我们已经检测到了条形码的大致位置,然后使用内核函数获取图片外形的形态学,并分别执行4次形态学腐蚀与膨胀,获取更精确的图片形状位置
第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得
getStructuringElement函数的返回值: 对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。
cv2.morphologyEx后图片
形态学图片转换完成后,进行图片的腐蚀与膨胀,这里主要是获取更精确的外形。
腐蚀与膨胀属于形态学操作,所谓的形态学,就是改变物体的形状,形象理解一些:腐蚀=变瘦 膨胀=变胖,主要是采用 cv2.erode() 和 cv2.dilate(),需要注意一点的是,腐蚀和膨胀主要针对二值化图像的白色部分
腐蚀与膨胀后图片
我们通过以上的步骤,已经成功锁定图片条形码的位置,然后使用cv2.findContours函数找到图片的外形,并画出图片的外形。
然后对找到的所有轮廓点进行重新排序
排序完成后的list传递给cv2.minAreaRect(Points)函数
其中points是点集,数据类型为ndarray,array((x1,y1),(x2,y2),….,(xn,yn))
而minAreaRect就是求出在上述点集下的最小面积矩形
rect[0]返回矩形的中心点,(x,y),实际上为y行x列的像素点
有了box的外形4个图形点,便可以使用cv2.drawContours函数把4个点连接起来,形成一个矩形轮廓,最后显示图片
微信号:sansui663(长安复制)
本文由知识库于2022-01-13发表在龙哥云资源网,如有疑问,请联系我们。本文链接:https://www.longgeyun.com/knowledge/21439.html
上一篇统计分析软件应用(minitab软件使用教程)
下一篇淘宝店铺收藏在哪里(淘宝店铺注册步骤)
高校最常见的食物中毒有哪些
急性肠胃炎与食物中毒怎么分辨
莫代尔面料和纯棉面料哪个好内裤 哪个儿童可以穿
为什么说开速腾的都不是一般人 速腾开出去有面子吗
活珠子和毛蛋的区别在哪里 哪个好吃
家里放石头的八大禁忌有哪些 家中石头最佳摆放位置
怎么判断自己帅还是丑男 男生怎样越长越帅
单身女生红绳戴左手还是右手 女生红绳戴哪里合适
Pr2020零基础快速入门
文字转语音App最新版3.0
APP下载页源码-带后台