点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

在学习中发现快乐,在应用找到价值。这是我第五期分享图像技术应用的文章。

前四期欢迎阅读和分享:

  • 第一期《扫描全能王?原来图像技术可以这样子玩》

  • 第二期《来吧,见识科技的力量,无需手动找拍糊的图》

  • 第三期《这种方式打开会ctrl的流量明星cxk,简直就是魔鬼》

  • 第四期《酷炫骚操作,票圈装13神技,极坐标全景图》

概述

在日常生活中,经常会看到条形码的应用,比如超市买东西的生活,图书馆借书的时候。。。

那么这些东西是如何做到准确检测出条形码的位置呢?

这就是今天要介绍的内容了

这篇博文的目标是演示使用计算机视觉和图像处理技术实现条形码的检测。

通过本篇文章的学习,我们能学到的内容包括:

1、图像处理中常用的一些操作流程,包括滤波、阈值化处理、膨胀、腐蚀和轮廓查找等

2、更重要的一点,希望通过这个案例,能够帮助大家建立分析问题和处理问题的思路

需要注意的是,这个算法并不适用于所有的条形码,但是它应该能给你一个基本的直觉,告诉你应该应用什么类型的技术。

条形码的检测

对于下面这个例子,我们将检测下图中的条形码:

目标:找到条形码的位置,而去除掉干扰的因素

思路:

利用条形码的自身特点,一般都是矩形形状,而且条码的条带是黑色的,矩形区域是白色的

让我们继续写一些代码。打开一个新文件,将其命名为 detect_barcode.py,如何开始写代码:

# 导入必要的包/库
import numpy as np
import argparse
import imutils
import cv2# 构造参数解析并分析参数
ap = argparse.ArgumentParser()
ap.add_argument("-i","--image", required = True, help = "path to the image file")
args = vars(ap.parse_args())

我们首先要做的是导入我们需要的包。我们将使用numpy进行数字处理,argparse用于解析命令行参数,cv2进行opencv绑定。

然后我们将设置命令行参数。我们这里只需要一个开关,即 --image,它是我们图像的路径,其中包含我们想要检测的条形码。

现在,让我进行实际的图像处理吧 导入图片并转化为灰度图

image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 计算图片x和y方向的Scharr梯度大小
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)# 用x方向的梯度减去y方向的梯度
gradient = cv2.subtract(gradX,gradY)
gradient = cv2.convertScaleAbs(gradient)

首先我们先读入图片并将其转换为灰度图;

然后我们使用Scharr操作符(这里制定ksize=1)去构造图片在水平和垂直方向上的梯度幅值表示。

这里,我们用Scharr算子的x方向梯度减去y方向的梯度。通过这个相减操作,我们就只剩下了高水平梯度和低垂直梯度的图像区域。

我们上述原始图像的梯度表示如下图所示

请注意梯度操作是如何检测出图片的条形码区域的。接下来的步骤是如何过滤掉图片中的噪声,重点关注条形码区域。

# 对图片进行模糊和阈值化操作
blurred = cv2.blur(gradient,(9,9))
(_,thresh) = cv2.threshold(blurred, 255, 255, cv2.THRESH_BINARY)

我们做的第一件事是使用一个卷积核大小为9x9的均值滤波作用于梯度图片。对图片进行这个操作将有助于平滑图片中的高频噪声。

然后我将模糊化后的图片进行阈值化,在梯度图片中,所有的像素点的灰度值低于255的将设为0(黑色),其余设为255(白色)。

模糊和阈值化处理后的输出结果如下:

然而,正如你所看到的上图阈值化图片,在条形码的垂直方向上存在这间隙。为了缩小这些间隙,并使得我们的算法更加容易的检测出条形码的“斑点”状区域,我们需要执行一些基础的形态学操作:

# 构造一个闭合核并应用于阈值图片
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

我们通过使用函数cv2.getStructuringElement构造一个矩形核。这个核的宽度大于高度,因此允许我们缩小条形码垂直条带之间的间隙。

当然,现在图片中非条形码的区域存在着很多斑点,这将会干扰轮廓的检测。

现在,我们继续尝试移除这些小的斑点

# 执行一系列的腐蚀和膨胀操作
closed = cv2.erode(closed, None, iterations = 4)
closed = cv2.dilate(closed, None, iterations = 4)

我们现在要做的是进行4次腐蚀操作,然后再进行4次膨胀操作。腐蚀操作将会“腐蚀”掉图片中的白色像素点,因此将会清除这些小的斑点,而膨胀操作将会“扩张”剩余的白色像素,并使白色区域变长。

如果在腐蚀过程中去除了小的斑点,则在膨胀的过程中不会再次出现。

在一系列的腐蚀和膨胀操作之后,这些小斑点已经被成功的移除了,只剩下条形码的区域。

最后寻找一下图片中条形码的区域的轮廓。

# 找到阈值化后图片中的轮廓,然后进行根据区域进行排序,仅保留最大区域
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)

幸运的是,opencv中提供了相应的接口,可以很容易地找到图像中的最大轮廓,如果我们正确地完成了图像处理步骤,它应该会对应于条形码区域。

然后,我们确定最大轮廓的最小的边界框,并最后显示检测到的条形码。

正如我们下图所示,我们已经成功的检测到条形码

详细代码链接:https://github.com/DWCTOD/AI_study/tree/master/%E5%90%88%E6%A0%BC%E7%9A%84CV%E5%B7%A5%E7%A8%8B%E5%B8%88/%E5%AE%9E%E6%88%98%E7%AF%87/opencv/%EF%BC%88%E4%BA%94%EF%BC%89%E7%94%A8python%E5%92%8Copencv%E6%A3%80%E6%B5%8B%E5%9B%BE%E5%83%8F%E4%B8%AD%E7%9A%84%E6%9D%A1%E5%BD%A2%E7%A0%81

使用方法:python3 detect_barcode.py --image images/barcode_01.jpg

另外还提供了其他的测试图片

英文原文链接:https://www.pyimagesearch.com/2014/11/24/detecting-barcodes-images-python-opencv/

总结

值得去思考的点

1、为啥要转变成灰度图

2、如何去除干扰因素,特别是条形码下面的材料说明的区域是采用什么办法去除的,小的斑点是如何去除的

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

用python和opencv检测图像中的条形码相关推荐

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

    使用Python和OpenCV检测图像中的条形码 1. 效果图 2. 算法的步骤 3. 源码 参考 这篇博客将介绍使用计算机视觉和图像处理技术进行条形码检测的必要步骤,并演示使用Python编程语言和 ...

  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. python使用matplotlib可视化间断条形图、使用broken_barh函数可视化间断条形图、可视化定性数据的相同指标在时间维度上的差异
  2. iOS web与JS交互
  3. Mybatis的动态创建删除表
  4. Mysql数据库(1.表的约束,以及数据表相关操作和字段名的相关操作)
  5. java原型链_深入总结Javascript原型及原型链
  6. 使用brew cask安装minikube的各种错误和解决方法
  7. 收银系统服务器有什么好处,生鲜超市收银系统软件怎么选?收银系统能带来什么好处?...
  8. Request中getContextPath、getServletPath、getRequestURI、request.getRealPath的区别
  9. 松下计划摆脱对特斯拉依赖 与其他汽车制造商合作
  10. RabbitMQ中basicConsume、basicCancel、basicPublish方法
  11. android获取有线、wifi、3G(4G)的IP
  12. Java_8函数式编程pdf
  13. Gitweb源码解析
  14. 世界各国和地区名称代码(GB/T 2659-2000)
  15. 五色电阻在线计算机,色环电阻(5色环在线电阻计算器)
  16. PLC控制系统设计与调试的一般步骤
  17. 计算机再带word打不开,电脑上 word打不开怎么办(精选).doc
  18. 一个老程序员的忠告:千万不要一辈子靠技术生存
  19. 给学计算机的男友买什么礼物,毕业季,男朋友初入职场送礼好物推荐!
  20. 黑客必会之——Windows入侵痕迹清理--你学会了吗?

热门文章

  1. 图解Python算法
  2. 人工智障?243个机器人被裁
  3. 有人问你如何掌握隐含狄利克雷分布(LDA),把这篇文章甩给他
  4. 创业公司技术总监,去上市公司面试,结果凉了!
  5. 深入Hotspot源码,搞清楚JVM的本质
  6. 教你如何通过分析GC日志来进行JVM调优
  7. 科普|什么是负载均衡(Load balancing)
  8. 深入理解Spring的ImportSelector接口
  9. 阿里员工的Java问题排查工具单
  10. 如何设计并实现一个秒杀系统?(含完整代码)