【Python】【OpenCV】定位条形码(二)moments和HuMoments
根据上一篇博客可知,单纯的通过求取最大面积而进行定位的局限性,因此我们接下来将通过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:一个表示两个轮廓之间相似性的浮点数值。该值越小表示两个轮廓形状越相似。
至此,当我们所得到的图像源包含了其他复杂的图形时,我们则可以使用矩特性来进一步提高我们的检测能力,但是还有其他更为复杂的场景,所以还需要优化我们的解决思路。
使用cv2.matchShapes()方法找寻目标区域Code:(在上一篇博客的代码基础上修改)

红框是添加和修改区域,绿框是注释掉了一些代码,值得注意的是,matchShapes方法中的第四个参数会要求传入值,但是通过查找OpenCV官方文档显示该参数没有对应方法,所以查找了其他相关信息后,填入0
或者0.0都是可以的,至于修改膨胀次数是因为需要减少多余轮廓的干扰,否则可能有些小轮廓出现返回值是0.0的情况。。
结果图:

通过拍摄不同角度的图片,得到的效果都是比较让人满意的


通过上述图片可以看到,针对不同程度的深度,都可以较为精准的绘制出目标区域,不过这个方法还是有两个问题点:
1、barcode线段需要尽量垂直于水平方向,否则就需要去修改sobel的卷积核。
2、需要有准备工作,要提前准备好待识别目标区域的Hu矩数据。
上述问题将再下一篇博客中进行改进。
【Python】【OpenCV】定位条形码(二)moments和HuMoments的更多相关文章
- Python+OpenCV图像处理(二)——打印图片属性、设置图片存储路径、电脑摄像头的调取和显示
一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的Python科学计算库 ...
- python笔记 利用python 自动生成条形码 二维码
1. ean13标准条形码 from pystrich.ean13 import EAN13Encoder encode = EAN13Encoder(') encode.save('d:/barco ...
- Python+opencv打开修图的正确方式get
先逼逼两句: 图像是 Web 应用中除文字外最普遍的媒体格式. 流行的 Web 静态图片有 JPEG.PNG.ICO.BMP 等.动态图片主要是 GIF 格式.为了节省图片传输流量,大型互联网公司还会 ...
- Python zxing 库解析(条形码二维码识别)
各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 http://www.oschina.net/project/tag/238/ Zbar 首先试了一下Zbar,pyt ...
- Opencv+Zbar二维码识别(标准条形码/二维码识别)
使用Opencv+Zbar组合可以很容易的识别图片中的二维码,特别是标准的二维码,这里标准指的是二维码成像清晰,图片中二维码的空间占比在40%~100%之间,这样标准的图片,Zbar识别起来很容易,不 ...
- python appium笔记(二):元素定位
#这里的示例是用android来说明的,xpath应该是通用的,resource-id不太清楚,没配过IOS的环境 #环境配置和一些参数的意思不清楚可以看我上一篇python appium笔记(一) ...
- python+opencv实现车牌定位
写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验三,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验三. 由于时间紧张,代码没有进行任何优化, ...
- python opencv识别蓝牌车牌号 之 取出车牌号 (1/3)
概述 车牌识别是计算机视频图像识别技术在车辆牌照识别中的一种应用,通常来讲如果结合opencv进行车牌识别主要分为四个大步骤,分别为: 图像采集 车牌定位 分割车牌字符 字符识别 当然,如果结合了机器 ...
- .NET + OpenCV & Python + OpenCV 配置
最近需要做一个图像识别的GUI应用,权衡了Opencv+ 1)QT,2)Python GUI,3).NET后选择了.NET... 本文给出C#+Opencv和Python+Opencv的相应参考,节省 ...
- RPi 2B python opencv camera demo example
/************************************************************************************** * RPi 2B pyt ...
随机推荐
- KRPANO资源分析工具模板链接下载
KRPano资源分析工具1.4.0加入了模板链接下载,可以批量下载有规律的链接. 模板链接基本规则 数字递增链接 pic[1-100]:会生成pic1,pic2,-pic100的链接 pic[a-z] ...
- Mac上使用Royal TSX快速连接到OCI主机
问题: 每次使用Royal TSX连接到OCI主机都要交互式输入opc这个用户名,次数多了也蛮烦. 那如何既指定用户名,又想要通过ssh私钥登陆机器呢? 这个需求确实很初级,但也着实困扰过我,因为开始 ...
- Visual Studio 2022 Preview 3和2019 16.11发布
Visual Studio 2022 Preview 3 主要特点 个人和团队生产力 附加到进程改进 新项目设计器 黑暗主题提升 开发现代应用 远程测试 新的JavaScript和TypeScript ...
- 【译】为什么命名“它”为依赖属性(DependencyProperty)
当我们创建新的类和成员时,我们花费了大量的时间和精力是它们尽可能的好用,好理解,好发现.通常我们会遵循.Net框架设计指南,尤其是会不断地研究这个新类与其他类,未来计划等内容之间的关系. 当命名依赖属 ...
- 再学Blazor——概述
简介 Blazor 是一种 .NET 前端 Web 框架,同时支持服务器端呈现和客户端交互性. 使用 C# 语言创建丰富的交互式 UI 共享前后端应用逻辑 可以生成混合桌面和移动应用 受益于 .NET ...
- Chromium 通过IDL方式添加扩展API
基于chromium103版本 1. 自定义扩展API接口 chromium默认扩展api接口中有chrome.runtime.*,和chrome.send.*等,现在我们就仿照chrome.runt ...
- 探索CPU的黑盒子:解密指令执行的秘密
引言 在我们之前的章节中,我们着重讲解了CPU内部的处理过程,以及与之密切相关的数据总线知识.在这个基础上,我们今天将继续深入探讨CPU执行指令的相关知识,这对于我们理解计算机的工作原理至关重要. C ...
- GameFramework摘录 - 2.访问器模式(Version、Logger)
访问器模式 Version.Logger等基础模块,功能相对固定但拥有几套不同的行为(如开发版本和正式版本不同),采用访问器模式,便于调整功能或复用 public static class Versi ...
- 利用Zip.js压缩并上传文件,后端使用.Net(Winform)接收转存
没时间解释了,快上车... 前端js: upload=function () { if(window.FormData) { var fileslist=$("input[type='fil ...
- 【NOI 2023 春测】 游寄
3.2 发出发通知单:9:40 3.3 旷操,把背包扔到 \(\texttt{JF}\) 底下,和 Kaguya 一起去吃早饭. 在桥下面被老班抓到了() 我用椅子给 apj 搭了一张床. Apj 给 ...