使用Python和OpenCV检测图像中的条形码

  • 1. 效果图
  • 2. 算法的步骤
  • 3. 源码
  • 参考

这篇博客将介绍使用计算机视觉和图像处理技术进行条形码检测的必要步骤,并演示使用Python编程语言和OpenCV库实现检测算法及其检测效果。

1. 效果图

原图

灰度图 VS 梯度渐变图
x梯度减y梯度,梯度渐变获取定位条形码大致区域;
高斯模糊图 VS 阈值化图
高斯模糊去掉高频噪音的干扰;
阈值化图使得图像的黑白区域更加明显。阈值的值的设置很重要。该方法应用的是大于225的直接为255白色,不大于255的为0,黑色
闭合核图 VS 腐蚀膨胀图
闭合核作用:使得条形码之间的细线差距更小;
腐蚀膨胀:去掉条形码周围的小斑点的干扰,要么消亡,要么生长成为条形码区域;
最终效果图:

2. 算法的步骤

该算法的步骤是:

  1. 计算x和y方向上的Scharr梯度幅度表示。
  2. 从x梯度中减去y梯度以显示条形码区域。
  3. 模糊和阈值图像。
  4. 将封闭内核应用于阈值图像。
  5. 执行一系列的膨胀和腐蚀。
  6. 找到图像中最大的轮廓,就是条形码。

该算法并不适用于所有条形码。注意,由于此方法对图像的渐变表示进行了假设,因此仅适用于水平条形码。

优化:
如果要实施更强大的条形码检测算法,则需要考虑图像的方向,或者更好的方法是应用机器学习技术(例如Haar级联或HOG +线性SVM)“扫描”图像以进行条形码区域扫描。

3. 源码

# USAGE
# python detect_barcode.py --image images/barcode_02.jpgimport argparseimport cv2
import imutils
# 导入必要的包
import numpy as np# 构建命令行参数及解析
# --image 包含条形码的输入图像路径
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,help="path to the image file")
args = vars(ap.parse_args())# 加载图像,转换为灰度图
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("origin", image)
cv2.waitKey(0)# 使用Scharr运算符(指定ksize = -1)构造水平和垂直方向上灰度图像的梯度幅度表示。
ddepth = cv2.cv.CV_32F if imutils.is_cv2() else cv2.CV_32F
gradX = cv2.Sobel(gray, ddepth=ddepth, dx=1, dy=0, ksize=-1)
gradY = cv2.Sobel(gray, ddepth=ddepth, dx=0, dy=1, ksize=-1)# 用Scharr运算符的x梯度中减去Scharr运算符的y梯度,剩下的图像区域具有较高的水平梯度和较低的垂直梯度。
gradient = cv2.subtract(gradX, gradY)
gradient = cv2.convertScaleAbs(gradient)
cv2.imshow("gray VS gradient", np.hstack([gray, gradient]))
cv2.waitKey(0)# 以上可得到条码图像的梯度表示
# 请注意,渐变操作是如何检测图像的条形码区域的。下一步将滤除图像中的噪点,并仅关注条形码区域。
# 高斯平滑以及阈值化图像
# 使用9 x 9内核将平均模糊应用于渐变图像,用以消除图像梯度表示的高频噪声。
blurred = cv2.blur(gradient, (9, 9))
# 对模糊图像进行阈值处理。渐变图像中任何不大于225的像素都将设为0(黑色)。否则,像素设置为255(白色)。
(_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)
cv2.imshow("blurred VS thresh", np.hstack([blurred, thresh]))
cv2.waitKey(0)# 条形码的竖线之间存在间隙。为了弥合这些差距,并使算法更容易检测条形码的“斑点”状区域,我们需要执行一些基本的形态学操作:
# 构造一个闭合核并将其应用于阈值图像
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)# 执行完成后,缝隙实际上更加封闭:
# 图像中出现了小的斑点,这些斑点不是实际条形码的一部分,但可能会干扰轮廓检测。
# 继续尝试删除这些小斑点:
# 执行4次腐蚀迭代,然后进行4次膨胀迭代。腐蚀将“侵蚀”图像中的白色像素,从而消除小斑点,而膨胀将“膨胀”剩余的白色像素并使白色区域重新生长。
eroded = cv2.erode(closed, None, iterations=4)
dilated = cv2.dilate(eroded, None, iterations=4)
cv2.imshow("closede VS eroded and dilated", np.hstack([closed, dilated]))
cv2.waitKey(0)# 只要在侵蚀过程中去除了小斑点,它们就不会在扩张过程中重新出现。
# 经过一系列侵蚀和膨胀后,可以看到小斑点已被成功去除,并且剩下条形码区域:# 在阈值化的图像中寻找轮廓,轮廓面积排序,只保留最大的一个
cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]# 确定最大轮廓的最小边界框
rect = cv2.minAreaRect(c)
box = cv2.cv.BoxPoints(rect) if imutils.is_cv2() else cv2.boxPoints(rect)
box = np.int0(box)# 在检测到的条形码上绘制边界框,并显示图像
cv2.drawContours(image, [box], -1, (0, 255, 0), 3)
cv2.imshow("Image", image)
cv2.waitKey(0)

参考

  • https://www.pyimagesearch.com/2014/11/24/detecting-barcodes-images-python-opencv/

使用Python和OpenCV检测图像中的条形码相关推荐

  1. 用python和opencv检测图像中的条形码

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在学习中发现快乐,在应用找到价值.这是我第五期分享图像技术应用的文 ...

  2. python检测屏幕亮点_使用Python和OpenCV检测图像中的多个亮点

    点击上方"蓝色小字"关注我呀 本文来自光头哥哥的博客[Detecting multiple bright spots in an image with Python and Ope ...

  3. 使用Python和OpenCV检测图像中的物体并将物体裁剪下来

    原文:http://blog.csdn.net/liqiancao/article/details/55670749 硕士阶段的毕设是关于昆虫图像分类的,代码写到一半,上周五导师又给我新的昆虫图片数据 ...

  4. 使用Python,Opencv检测图像,视频中的猫

    使用Python,Opencv检测图像,视频中的猫

  5. 使用Python,OpenCV查找图像中的最亮点

    Python,OpenCV找出图像中的最亮点 1. 原理 2. 优化 3. 效果图 4. 源码 参考 这篇博客将向您展示如何使用Python和OpenCV查找图像中的最亮点,以及应用单行预处理代码-- ...

  6. 使用Python,OpenCV从图像中删除轮廓

    使用Python,OpenCV从图像中删除轮廓 1. 效果图 2. 步骤 3. 源码 4. 参考 1. 使用Python.OpenCV计算轮廓的中心并标记 2. 使用Python.OpenCV检测轮廓 ...

  7. 使用Python,OpenCV寻找图像中的轮廓

    使用Python和OpenCV查找图像中的形状 1. 效果图 2. 步骤 3. 源码 参考 这篇博客将讨论使用Python和OpenCV查找图像中的形状,具体是 cv2.inRange在图像中查找形状 ...

  8. 热视觉2:使用Python和OpenCV从图像中测量温度

    热视觉2:使用Python和OpenCV从图像中测量温度 这篇博客将介绍学习热/中远红外视觉的基础知识,gray8 和 gray16 图像(即最常见的热成像格式)之间的差异,学习如何使用Python和 ...

  9. opencv 识别长方形_使用OpenCV检测图像中的矩形

    本文实例为大家分享了OpenCV检测图像中矩形的具体代码,供大家参考,具体内容如下 前言 1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现. 2.我这里使用的OpenCV版本是3 ...

最新文章

  1. 影像组学视频学习笔记(21)-影像组学常用软件推荐、Li‘s have a solution and plan.
  2. ASP.NET MVC Framework 系列
  3. How to install MinGW-w64 and MSYS2?
  4. 【CCF】201903-2 二十四点
  5. iOS导航控制器和Segues
  6. __index元方法
  7. 通达信公式系统 入门 LTS
  8. 今天终于找到了一款windows下的Zcash钱包(ZEC钱包),推荐给大家
  9. PPT常见的几种排版技巧,你都掌握了吗?
  10. Verdi HW/SW co-debug 简单使用
  11. kuberntes集群不能解析service ip故障排查记录
  12. MATLAB提取txt文本文档中特定关键字后的数字信息
  13. JAVA开发运维(关于渗透测试与漏洞修复)
  14. 基于java的文章管理系统
  15. 详解TCP之listen
  16. KO88冲销工单结算
  17. am572x时钟配置
  18. 迈拓恢复出厂设置图解_电脑系统怎么重置呢?教你恢复出厂设置
  19. 【youcans 的 OpenCV 例程200篇】194.寻找图像轮廓(cv.findContours)
  20. GNSS数据下载网站

热门文章

  1. 2021年大数据基础(四):​​​​​​​​​​​​​​​​​​​​​大数据业务分析基本步骤
  2. 【CV】吴恩达机器学习课程笔记 | 第1-2章
  3. 快速android app开发,快速學會開發 Android App
  4. Failed to open zip file. Gradle‘s dependency cache may be corrupt (xx)
  5. java jdk 环境变量配置(window 10 系统)
  6. MySQL57安装与设置
  7. python 生成验证码
  8. PyTorch 笔记(12)— Tensor 持久化、向量化、torch.set_num_threads、torch.set_printoptions
  9. Linux安全基础:shell及一些基础命令
  10. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )