今天看到一篇关于条形码检测的文章,还是存在一些问题的,昨天我陪朋友去取快递的时候,看到了关于条形码检测在现实场景中的应用,于是,便想着实现一波,并且对程序中的一些问题做了一些修改。

首先要确定调用的包/库的版本,这是在我电脑上程序的运行环境(在今后的文章中,我会特别注意版本问题,这个非常重要):

  • python3.6 + win 10
  • numpy 1.16.2
  • imutils 0.5.2
  • opencv 4.1.0

图片来源于百度

一、导入需要用到的包/库

import numpy as np
import imutils
import cv2

二、转化为灰度图

一般对图像的处理操作都是在灰度图的基础上进行的。

image = cv2.imread('D:\image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

三、使用Scharr算子进行边缘检测

条形码一般具有以下特点:矩形形状,条带是黑色,背景为白色,而且黑白相间。这就导致条形码区域光暗变化明显,这对于Scharr算子非常合适,因为Scharr算子对于图像梯度的变化更加敏感,更有利于获取条形码的特征。

想要了解更多的边缘检测算法,可以查看我的这篇博客:https://blog.csdn.net/qq_40962368/article/details/81416954

ddepth = cv2.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)
gradient = cv2.subtract(gradX,gradY)
gradient = cv2.convertScaleAbs(gradient)

四、去除噪声

(1)模糊与阈值化处理

通过均值滤波对图像进行模糊处理,通过阈值化处理将图像转化为二值图像。以此来去除图像中的绝大部分噪声。cv2.threshold函数的第二个参数是为阈值化处理所设置的阈值,为了尽可能的去除噪声,所以,尽量将此值设置的大一些,但不能过大,以免影响条形码特征本身。

关于更多的OpenCV中阈值分割的方法,可以查看我的这篇博客:https://blog.csdn.net/qq_40962368/article/details/80917250

blurred = cv2.blur(gradient,(9, 9))
(_, thresh) = cv2.threshold(blurred, 231, 255, cv2.THRESH_BINARY)

(2)形态学处理

通过形态学处理,去除图像细小的噪声斑点。使用cv2.getStructuringElement函数定义结构元素,经过一个开运算,再经过四次腐蚀与四次膨胀,更好的去除噪声。

关于形态学的操作一些方法,可以查看我的这篇博客:https://blog.csdn.net/qq_40962368/article/details/81276820

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)

五、确定检测轮廓,画出检测框

OpenCV中提供了识别图像区域的函数,非常好用,找相应的区域,根据区域大小进行排序,保留最大的区域,该区域就是我们要找的条形码区域。计算该轮廓的旋转边界框,确定位置信息,画出检测框。

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.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)
cv2.destroyAllWindows()

总结:从检测结果来看,在特定的应用场景下,检测效果还是挺好的,但不适合应用于所有的应用场景,但我们可以从条形码的检测过程可以看出解决这类问题的一般想法,为以后解决类似的问题提供一种比较可靠的思路。

参考网址:https://www.pyimagesearch.com/2014/11/24detecting-barcodes-images-python-opencv/

python+OpenCV检测条形码相关推荐

  1. python opencv 检测特定颜色

    python opencv 检测特定颜色 import cv2 import numpy as npcap = cv2.VideoCapture(0)# set blue thresh 设置HSV中蓝 ...

  2. python opencv检测人脸

    python opencv检测人脸 文章目录: 一.opencv检测一张图片 二.opencv摄像头实时检测人脸 一.opencv检测一张图片 opencv检测人脸分成三部分: 1.图片转换成灰色(降 ...

  3. Python+OpenCV检测灯光亮点

    本篇博文分享一篇寻找图像中灯光亮点(图像中最亮点)的教程,例如,检测图像中五个灯光的亮点并标记,项目效果如下所示: 第1步:导入并打开原图像,实现代码如下所示: # import the necess ...

  4. python opencv检测高光点及findContours计算连通域重心

    在对二值化图像的连通域进行分析时,重心,对称轴等参数是重要特征.现对连通域重心计算的python代码实现,归纳总结如下,欢迎大家批评指正.重心是距离对重量的加权平均.用数学语言描述即为: 离散化后为: ...

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

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

  6. 使用Python,OpenCV在视频中进行实时条形码检测

    使用Python,OpenCV在视频中进行实时条形码检测 1. 步骤 2. 适用场景及优化 3. 总结 4. 源码 参考 上一篇博客介绍了如何检测和查找图像中的条形码.这篇博客将进行一些优化以检测实时 ...

  7. 使用Python和OpenCV检测图片上的条形码

    这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问题,浏览代码之后,我提供了一些对原始算法的更新和改进. 首先需 ...

  8. python opencv 条形码及二维码检测识别

    目录 条形码检测识别 二维码检测识别 基于python opencv pyzbar 实现. 条形码检测识别 原图: 最后截取图: 直接上代码: import cv2 import numpy as n ...

  9. python图片识别是否p过_用 Python 和 OpenCV 检测图片上的条形码

    用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问题, ...

最新文章

  1. MongoDB学习笔记(入门)
  2. C++基本知识点集锦(2022秋招)
  3. button/input链接方式全攻略 [转]
  4. Nginx配置与使用
  5. python中使用什么表示代码块、不需要使用大括号_Python3学习笔记02-基础语法
  6. aix6.1 nfs
  7. thymeleaf如何迭代遍历,如何判断
  8. 2020蓝桥杯省赛---java---B---2(寻找 2020)+测试txt
  9. 技术三板斧:关于技术规划、管理、架构的思考
  10. 判断两个学生类对象是否一致使用equals方法重写时判断条件使用“==”、“String自带的equals”不同所带来的问题
  11. 嵌入式linux内核开启键盘,- 基于嵌入式Linux内核的特殊矩阵键盘设计完整驱动控制模块方案...
  12. 装机防骗武器——鲁大师
  13. GDAL读取S-57海图数据中文属性值乱码问题解决(续)
  14. CTP: 接收心跳超时Bug
  15. 操作系统实验二、进程通信实验——f(x,y) = f(x) + f(y)
  16. linux和cisco有关系吗,如何在Linux环境下安装Cisco RTMT
  17. abb机器人伺服电机报闸是什么_abb伺服电机究竟怎么样呢?
  18. MATLAB plotyy总结
  19. 使用Matlab将多个图形Figure文件合并
  20. 微信小程序-组件的生命周期

热门文章

  1. linux nginx 图片服务器,搭建Nginx图片服务器(Linux)
  2. java 监控 配置 文件怎么打开_java实现文件变化监控的方法(推荐)
  3. Spring Boot中使用Actuator的/info端点输出Git版本信息
  4. 以史为鉴 | 为什么要将「知识图谱」追溯到1956年?
  5. Android官方开发文档Training系列课程中文版:管理音频播放之管理音频焦点
  6. Android官方开发文档Training系列课程中文版:管理Activity的生命周期之Activity的重建
  7. java 双因素认证(2FA)TOTP demo
  8. Python学习笔记——GIF倒放处理
  9. mui.init方法配置
  10. NodeJs系列二:你好,世界