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

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

时间:2023-12-21 23:57:00浏览次数:32  
标签:条形码 img moments Python barcode cv2 OpenCV 图像 轮廓

  根据上一篇博客可知,单纯的通过求取最大面积而进行定位的局限性,因此我们接下来将通过cv2.moments()和cv2.HuMoments()这两个方法来在更复杂的环境中去找到我们的目标区域。

 

cv2.moments():

参数:

  • array:表示输入图像的单通道数组。通常是灰度图像,可以是8位或浮点型。
  • binaryImage:一个可选参数,如果设置为 True,则将 array 视为二进制图像。默认为 False。

返回值:

  • moments:一个包含图像矩特征信息的字典对象。这些矩包括图像的原始矩、中心矩以及一些其他相关的信息。您可以使用这些矩特征来描述图像的几何形状和分布情况。

cv2.HuMoments():

参数:

  • moments:一个字典对象,包含通过 cv2.moments() 函数计算得到的图像矩特征。

返回值:

  • huMoments:一个包含7个不变矩特征值的一维数组。这些特征值对图像的形状、轮廓和几何特征进行了描述。通常用于图像识别和匹配。

 

  简易的介绍一下moments(矩)这个东西,它是用来描述一个形状的特性,比如说正方形,我们能分辨出来是因为知道其四个边是相等的,这便是在我们的认知中所知的正方形的轮廓特性,

而在计算机中呈现的就是一组数据,通过和这组数据进行比对,我们就可以较为准确的去寻找我们的目标区域。

  但是相较于上一篇博客的直接在输入图像中查找,使用矩我们需要事先获取目标的完整轮廓,并保存其矩特性数据。

 

图像准备,一张没有完整的只有barcode的图像

 

 

Code:

 1 import cv2
 2 import numpy
 3 
 4 img = cv2.imread('../images/barcode.jpg')
 5 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 6 kernel_x = numpy.array(
 7     [
 8         [-1, 0, 1],
 9         [-2, 0, 2],
10         [-1, 0, 1]
11     ]
12 )
13 sobel_x = cv2.filter2D(gray, -1, kernel_x)
14 _, thresh = cv2.threshold(sobel_x, 127, 255, cv2.THRESH_BINARY)
15 kernel_ed = numpy.ones((3, 3), dtype=numpy.uint8)
16 img_d = cv2.dilate(thresh, kernel_ed, iterations=6)
17 contours, hir = cv2.findContours(img_d, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
18 print(cv2.HuMoments(cv2.moments(contours[0])))
19 cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
20 cv2.imshow('', img)
21 cv2.waitKey()
22 cv2.destroyAllWindows()

Result:

 

 

我就直接和上一篇博客的barcode的轮廓矩特性进行对比:

    只有barcode图       包含其他图形的barcode图

 

 通过对比数据我们可以发现,在第1不变矩中,数据是最接近的,这个时候就可以利用这个特性数据来进行轮廓特征比对寻找目标区域。

当然因为OpenCV提供了一个方法为我们减免了比较的操作cv2.matchShapes()方法。

 

cv2.matchShapes()

参数:

  • contour1:第一个轮廓,通常是一个包含点集的 NumPy 数组。
  • contour2:第二个轮廓,也是一个包含点集的 NumPy 数组。
  • method:表示相似性度量方法的整数值。可以是 1、2 或 3,分别代表不同的计算方法。

返回值:

  • match:一个表示两个轮廓之间相似性的浮点数值。该值越小表示两个轮廓形状越相似。

 

至此,当我们所得到的图像源包含了其他复杂的图形时,我们则可以使用矩特性来进一步提高我们的检测能力,但是还有其他更为复杂的场景,所以还需要优化我们的解决思路。

 

标签:条形码,img,moments,Python,barcode,cv2,OpenCV,图像,轮廓
From: https://www.cnblogs.com/vangoghpeng/p/17920289.html

相关文章

  • gnuradio笔记[1]-内嵌python代码块
    摘要在GNURadio中简单使用内嵌python代码块实现输出内容到文件.超链接解决无法编辑代码块内代码原理简介GNURadio简介[https://wiki.gnuradio.org/index.php?title=What_Is_GNU_Radio]GNURadioisafree&open-sourcesoftwaredevelopmenttoolkitthatprovidessig......
  • Python Selenium WebDriver 使用教程
    ​ 1、安装Selenium使用SeleniumWebDriver需要先安装需要安装Selenium库,安装使用的pip在命令如下,pipinstallselenium2、安装浏览器驱动程序SeleniumWebDriver需要特定浏览器的驱动程序,使用的浏览器来下载相应的驱动程序,以便后续在代码中引用。下载地址:ChromeWebDri......
  • Python之PyAutoGUI的使用
    PyAutoGUI是Python的一个库,使用示例如下。一、移动到某个坐标点进行点击importpyautoguiprint(pyautogui.position())pyautogui.moveTo(56,18,duration=1)pyautogui.click()二、依照图片相似度移动到某个图片的位置进行点击importpyautoguipos=pyautogui.locateO......
  • python初试三
    在之前的程序中,我们直接生成一个字符串,作为http回复,返回给客户端。这一过程中使用了django.http.HttpResponse()。在这样的一种回复生成过程中,我们实际上将数据和视图的格式混合了到上面的字符串中。看似方便,却为我们的管理带来困难。想像一个成熟的网站,其显示格式会有许多重复的......
  • 【Python】【OpenCV】定位条形码(一)
    先上代码:1defbarcode(image):2gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)3blur=cv2.GaussianBlur(gray,(5,5),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)4cv2.imshow('GaussianBlur',blur)5kernel_x=numpy.array([......
  • 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)\)。也就是说,在代码实现的过程中,虽然我们实现的一个函数可能带有很多个变量,但是可以用偏函数的形式把其中一些不需要拆分和变化的变量转变为固有变量。比较典型的......