首页 > 编程语言 >【Python】【OpenCV】定位条形码(一)

【Python】【OpenCV】定位条形码(一)

时间:2023-12-21 21:55:34浏览次数:38  
标签:原图 kernel Python max cv2 OpenCV blur 条形码 numpy

先上代码:

 1 def barcode(image):
 2     gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 3     blur = cv2.GaussianBlur(gray, (5, 5), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
 4     cv2.imshow('GaussianBlur', blur)
 5     kernel_x = numpy.array([
 6         [-1, 0, 1],
 7         [-2, 0, 2],
 8         [-1, 0, 1]
 9     ])
10     kernel_y = numpy.array([
11         [-1, -2, -1],
12         [0, 0, 0],
13         [1, 2, 1]
14     ])
15     x = cv2.filter2D(blur, -1, kernel_x)
16     y = cv2.filter2D(blur, -1, kernel_y)
17     cv2.imshow('Sobel', x)
18     _, threshold = cv2.threshold(x, 127, 255, cv2.THRESH_BINARY)
19     kernel = numpy.ones((3, 3), numpy.uint8)
20     r_e = cv2.erode(threshold, kernel, iterations=1)
21     r_d = cv2.dilate(r_e, kernel, iterations=10)
22     contours, hir = cv2.findContours(r_d, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
23     max_contour = numpy.array(max(contours, key=cv2.contourArea))
24     x, y, w, h = cv2.boundingRect(max_contour)
25     cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

 

定位思路:

1、转灰度图

2、通过高斯模糊去除图像噪点,如果不使用高斯模糊去噪的话,条形码的线段会有些弯曲,看场景是否需要

3、使用sobel进行边缘检测,请注意分辨sobel水平变换和垂直变换的差别

4、进行二值化,相比于上一步的sobel,可以发现消除一些独立的噪点,但是还是保留了一些,可以更改参数再进行调整

5、进行形态学运算(膨胀腐蚀)对应代码中的iterations的次数是尝试过后的最佳成效,可以自己调整次数看看不同效果

 6、寻找轮廓,通过对原图处理后,我们得到的上述最终的效果图可以发现,最大的白色区域就是我们需要的条形码区域,所以我们通过cv2.contourArea()和max()配合来寻找最大面积,最后在原图上绘制出我们的目标区域

 

值得注意的是,上述思路有比较大的局限性,首先是针对原图的显示问题,如果不是水平拍摄,是垂直拍摄时,我们需要更改sobel使用垂直变换卷积核,或者对原图进行旋转。

其次是,我们定位最终的barcode区域使用到了max来查找最大面积,所以这就意味着,原图中,barcode整体轮廓必须是最大的。

 

标签:原图,kernel,Python,max,cv2,OpenCV,blur,条形码,numpy
From: https://www.cnblogs.com/vangoghpeng/p/17914588.html

相关文章

  • Python 中迭代器与生成器:深度解析与实用指南
    Python作为一门强大而灵活的编程语言,提供了许多高效的工具来处理数据集合。在这些工具中,迭代器(Iterators)和生成器(Generators)是两个重要的概念,它们在数据遍历和惰性计算方面发挥着重要作用。本文将深入探讨Python迭代器和生成器的概念、用法以及它们之间的区别。1.什么是迭代器?迭代......
  • python之动态生成列表和重复数据处理
    动态生成列表:range(起始,终点,步长)方法:print(list(range(1,6)))结果:[1,2,3,4,5]print(list(range(1,22,2)))结果:[1,3,5,7,9,11,13,15,17,19,21]列表解析法生成列表:语法包含三部分:表达式用于计算列表中元素的值、循环语句用于获得循环元素、条件判断语句形式1:列......
  • python钉钉机器人运维脚本监控实例
    面是关于“Python钉钉机器人运维脚本监控实例”的完整攻略:目录介绍使用步骤配置机器人运行脚本示例说明监控服务器CPU使用率监控服务器磁盘空间总结介绍钉钉机器人是钉钉提供的一种形式化的通信渠道,可以通过代码来调用钉钉机器人的API,实现以机器人的形式向钉钉群组......
  • opencv图像处理机器学习真实项目教程(python实现)3图像处理基础
    3图像处理基础在本章中,我们将介绍图像处理中的各种操作,首先是基于平移的操作,如旋转和调整大小。读者将学习如何使用OpenCV旋转和调整图像大小,以及如何控制生成图像的大小和方向。本章接着介绍了图像的算术运算,如加法、减法和除法。本章继续以图像运算为主题,介绍图像的位运算,如......
  • Python代码中的偏函数
    技术背景在数学中我们都学过偏导数\(\frac{\partialf(x,y)}{\partialx}\),而这里我们提到的偏函数,指的是\(f(y)(x)\)。也就是说,在代码实现的过程中,虽然我们实现的一个函数可能带有很多个变量,但是可以用偏函数的形式把其中一些不需要拆分和变化的变量转变为固有变量。比较典型的......
  • 解决Python中main运行报错的方法
    在Python开发中,main函数是程序的入口,是程序执行的起点。然而,有时候我们在运行main函数时可能会遇到各种报错。本文将介绍一些常见的Pythonmain运行报错,并提供相应的解决办法。1.ModuleNotFoundError:这个错误表示Python无法找到指定的模块。解决方法如下:-确保模块已经正确安装。可......
  • 为什么在Python类中经常会使用init函数
     在Python中,类是一种用于创建对象的蓝图或模板。当我们定义一个类时,经常会在类中定义一个名为`__init__`的函数,也称为构造函数或初始化方法。本文将解释为什么在Python类中经常会使用`__init__`函数,并介绍它的作用和用法。 1.初始化对象: `__init__`函数在创建类的对象时自动调......
  • day 03-2 Python基础-字符串格式化
    2.字符串格式化字符串格式化,使用跟便捷的形式实现字符串的拼接。%format(推荐)f2.1%2.1.1基本格式化操作#%s是占位符,也成为字符串占位符#后面空格加%text="我叫%s,今年18岁"%"linzai"#:%前面加上一个空格print(text)name="linzai"text="我叫%s,今年18岁"......
  • Python 把包含\\u4f20\\u5a92 unicode内容的字典字符串变成字典
    importjson#把包含\\u4f20\\u5a92unicode内容的字典字符串变成字典deftext_to_dict(text):dict1=json.loads(text)str_dict=str(dict1).replace('\\xa0','').replace('\'','"')dict_json=json.loads(s......
  • Python 入门之 计算符号
    Python入门之计算符号缩写符号基本符号加法(+):a+b减法(-):a-b乘法(*):a*b除法(/):a/b取模(%):a%b附点除法(//):a//b指数(**):a**b欢迎关注公-众-号【TaonyDaily】、留言、评论,一起学习。Don’treinventthewheel,librarycodeisthere......