对于条码的识别程序,网上有很多,不过很多都是只识别一个,并且此处的“识别”指的是找出图片中的条码,并没有对条码进行译码。本篇博客将先实现第一个功能,即,找出图中的多个条码。下篇博客会实现第二个功能,即,对找出的条码进行译码。

下面看代码:


from sys import exit
import numpy as np
import cv2# 加载图片并把它转换为灰度图片
image = cv2.imread('F:/work/barcode/bar_code/8.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray_Image", gray)
cv2.waitKey(0)
'''
# 索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量
gradX = cv2.Sobel(gray, ddepth = cv2.CV_32F, dx = 1, dy = 0, ksize = -1)
gradY = cv2.Sobel(gray, ddepth = cv2.CV_32F, dx = 0, dy = 1, ksize = -1)# x灰度减去y灰度
gradient = cv2.subtract(gradX, gradY)
# 转回uint8
gradient = cv2.convertScaleAbs(gradient)
absX = cv2.convertScaleAbs(gradX)   # 转回uint8
absY = cv2.convertScaleAbs(gradY)
gradient = cv2.addWeighted(absX,0.5,absY,0.5,0) # 组合
'''
gradient = cv2.Canny(gray , 50 ,400)
cv2.imshow("S/C_Image", gradient)
cv2.waitKey(0)(_, thresh) = cv2.threshold(gradient, 250, 255, cv2.THRESH_BINARY) # 二值化
cv2.imshow("threshold_Image", thresh)
cv2.waitKey(0)
# 构建kernel然后应用到 thresholded 图像上
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 5))#形态学处理,定义矩形结构
#closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)#闭运算,先膨胀后腐蚀
#closed = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)#开运算,先腐蚀后膨胀
#closed = cv2.erode(thresh, kernel, iterations = 1)#腐蚀图像,去除噪声点
closed = cv2.dilate(thresh, kernel, iterations = 1)#膨胀图像,连接断点
cv2.imshow("dilate_Image", closed)
cv2.waitKey(0)
# 找到条码轮廓
# 保留大的区域,有时会有没过滤掉的干扰
im, contours, hierarchy = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
c = sorted(contours, key = cv2.contourArea, reverse = True)[0]
#获取轮廓数量
x = len(contours)
s = []
for i in range(0,x):s.append(cv2.contourArea(contours[i]))
#打印面积
for j in s:print "s was : %f",j#筛选出面积大于等于8000的轮廓
for k in range(0,x):if s[k] >= 8000.0 :rect = cv2.minAreaRect(contours[k])#返回矩形的中心点坐标,长宽,旋转角度box = np.int0(cv2.boxPoints(rect))cv2.drawContours(image, [box], -1, (255, 0, 0), 2)#画一个方框把条形码区域圈起来else:continuecv2.imshow("Image", image)
cv2.waitKey(0)
exit(0)

解释几个关键的地方。首先是计算机怎么把条码找出来的,观察程序运行过程中弹出来的图像可以知道,计算机框出来的其实是白块,所以前面做的处理为的是让条码变成的白块更加明显,然后这个函数

cv2.findContours()

就可以找到条码的轮廓,由于找的是白块,因此对条码和二维码都适用。然后是如何找出多个条码,还是上面那个函数,其实,那个函数会把图像中所有的白块都找出来。因为条码要大一些,所以用面积这个筛选条件,把符合要求的轮廓都筛选出来,最后画出来。

另外,程序中有不少注释掉的代码,这是因为程序找条码的方法还是比较简单粗暴的,对不同的情况需要不同的处理。各位可以取消注释运行下试试,比如用索贝尔算法取代Canny算法、进行开运算/闭运算等。

放上一张结果图:

Python实现识别多个条码/二维码(一)相关推荐

  1. Python实现识别多个条码/二维码(二)

    这篇博客实现的是"Python实现识别多个条码/二维码(一)"未完成的解码任务.由于系统坏了,软件重装等一系列原因,所以拖到现在..不好意思哈. 在上一篇中我们已经能把两个条形码找 ...

  2. 分离扫描文档方法(2) —— Dynamic Web TWAIN:如何使用条码/二维码作为扫描文档的分隔器

    在之前的文章中,我们提到了一种扫描文档的分离方法即<分离扫描文档方法(1) -- Dynamic Web TWAIN:如何使用空白页作为扫描文档的分隔器>.本文将再介绍一种扫描文档的分离方 ...

  3. 基于MATLAB的条码二维码识别系统

    基于MATLAB的条码二维码识别系统 课题介绍 本设计研究的是基于数字图像处理的EAN-13条形码识别算法,通过工具平台MATLAB实现.其中图像处理部分是条码识别重要的前期工作,利用MATLAB强大 ...

  4. Python MyQR 生成不一样的二维码

    Python MyQR 生成不一样的二维码 MyQR 最近,闲暇时学习了一点Python的东西,还是比较有趣,想和大家分享一下.顺便说一句,Python 真的很好玩 [手动滑稽] MyQR 二维码又称 ...

  5. Python生成带圆角图片的二维码

    示例代码1 #!/usr/bin/python # -*- coding: UTF-8 -*- # author: Carl time:2020/5/15import qrcode from PIL ...

  6. 解决自动分析仪条码二维码读取的方案

    随着物联网技术的发展,越来越多的企业开始采用条码二维码读取技术来提高企业的生产效率和管理水平.条码二维码读取技术可以帮助企业自动识别和跟踪物品,从而提高企业的生产效率和管理水平.用于检查体液或组织部位 ...

  7. python小工具myqr生成动态二维码

    python小工具myqr生成动态二维码 (一)安装 (二)使用 (一)安装 命令: pip install myqr 安装完成后,就可以在命令行中输入 myqr 查看下使用帮助: myqr --he ...

  8. Zxing图片识别 从相册选二维码图片解析总结

    Zxing图片识别 从相册选取二维码图片进行解析总结 在Zxing扫描识别和图片识别的解析对象是相同的 本文分三个步骤: 1 获取相册的照片 2 解析二维码图片 3 返回结果 1) 获取相册照片 go ...

  9. iOS QRcode识别及相册图片二维码读取识别

    对二维码的处理及系统原生API扫描. Zbar扫描和Zing扫描 比较 iOS原生API 系统扫描的效率是最高,反正包括各种你见过的没见过的码,但是有一点我不是很清楚 iOS7 扫描二维码可以,但从相 ...

最新文章

  1. 40 张图带你搞懂 TCP 和 UDP
  2. 相同的字符串哈希值一样吗_关于哈希,来看这里!
  3. 邮件服务器收件人数量限制,邮件服务器DBMail
  4. JVM内存管理------GC算法精解(复制算法与标记/整理算法)
  5. 使用Spock测试您的代码
  6. MATLAB混合编程视频教程下载 SIMULINK系统仿真视频
  7. 谈谈写程序与学英语 --宋劲杉
  8. 思凡软件(思凡全功能拓扑检查工具)
  9. The Art of Deception
  10. strcmp函数的实现
  11. android 13 热点启动流程
  12. 怎么用c语言编辑出天依蓝,我天依蓝
  13. 小米8se怎么解屏幕锁_小米8 SE解锁system系统分区教程_小米8SE如何一键解锁系统分区...
  14. 我的AI转型之路与AI之我见(非985211的奋斗路程与视角)
  15. .NET6 使用 AutoFac (落地)
  16. 如何拿到阿里、华为、美团等6个大厂的顶级offer?
  17. 计算机与网络 文献,计算机与网络专著参考文献 计算机与网络参考文献怎么写...
  18. 大数据在政府中的应用案例
  19. Exception in thread “main“ java.lang.ClassCastException: test.SuperClass cannot be cast to test.SubC
  20. vue v-for动态循环select,并取其中的值,和值的分类

热门文章

  1. 计算字符串中子串出现的次数
  2. 斐波那契数列由数字1 1 2 3 5 8 13 21 34等等组成,其中每一个数字(从第三个起) 都是由前两个数字的和。
  3. BERT实战(1):使用DistilBERT作为词嵌入进行文本情感分类,与其它词向量(FastText,Word2vec,Glove)进行对比
  4. 厦门大学校园导游系统(图论)
  5. 遗传算法求解TSP旅行商问题
  6. 卷积码树状图怎么画_第八讲卷积码详解.ppt
  7. OLAP和数据立方体
  8. 解决办法之Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC
  9. 计算机课会点名吗,网课突然被点名的尴尬,你也懂的吧
  10. Intellij IDEA的安装及使用介绍