计算机竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录

  • 0 简介
  • 1 二维码检测
  • 2 算法实现流程
  • 3 特征提取
  • 4 特征分类
  • 5 后处理
  • 6 代码实现
  • 5 最后

0 简介

🔥 优质竞赛项目系列,今天要分享的是

基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1 二维码检测

物体检测就是对数字图像中一类特定的物体的位置进行自动检测。基本的检测框架有两种:

一种是以滑动窗口为单位对图像进行扫描,对扫描所得的每个子图像提取特征,并用学习到的分类器来分类该特征并且判断该子图像是否为所检测的特定物体。对象检测的一个问题是,对象在图片中的位置和尺度是未知的。算法被要求能够检测各种不同位置、不同大小的对象,这样的特性被称为位置无关性和尺度无关性。为了达到这样的特性,常见的方法是使用多尺度框架,即:通过缩放原始图像,产生一组大小不同的图像序列,然后在序列的每幅图像中都使用固定尺寸
W×H
的滑动窗口,检测算法将判断每次滑动窗口所截取的图像子窗口是否存在目标对象。滑动窗口解决了位置无关性;而图像序列中存在至少一幅图像,其包含的目标对象的尺度符合滑动窗口的尺度,这样一个图像金字塔序列解决了尺度无关性。

另一种则是在整幅图像上首先提取兴趣点,然后仅对提取出来的兴趣点分类。

因此学长把物体检测方法分为基于滑动窗口的物体检测和基于兴趣点的物体检测两类。

无论是哪种做法,整个过程都可以分为特征提取和特征分类这两个主要阶段。也就是说,物体检测的主要问题是使用什么样的特征和使用什么样的分类器。

物体检测的难点在于如何用有限的训练集来学习到鲁棒的、可以适用到各种情况下的分类器。这里所说的各种情况包括有:图像中物体的大小不同;光照条件的差异所引起的图像明暗的不同;物体在图像中可能存在的旋转和透视情况;同类物体间自身存在的差异。

这里学长以定位二维码 / 条形码为例,简述基于机器学习实现物体检测的大致算法流程。

2 算法实现流程

算法流程图如下图所示:

在这里插入图片描述

我们先把输入图像分成 25×25
的图像子块。把图像子块作为特征提取和特征分类这两个模块的基本处理对象,即对图像子块进行纹理特征提取,特征分类时判定当前处理的图像子块是否属于二维条形码的一部分

在这里插入图片描述

在特征提取模块中,我们使用纹理特征提取算法从原始输入图像中提取出多分辨率直方

在特征分类时,我们希望保留所有属于二维条形码的图像子块,同时去除所有属于背景的图像子块。在该模块中,我们使用了自适应 Spatialboost 算法。

下图为经过这步处理后的理想输出结果,图中被标记的小方块表示他们属于二维条形码的一部分。

在这里插入图片描述

3 特征提取

图像的纹理特征可以描述物体特有的属性,用以区别其他物体。纹理特征总体可分为空域和频域两大类。在本文算法中,我们采用的纹理特征均属于空域的纹理特征,也是局部特征,它们分别是多分辨率直方图特征、局部二值模式特征和边缘方向直方图特征。

多分辨率直方图特征具备旋转无关的特点。这种纹理特征保留了灰度直方图特征计算简单和保存方便的特点。同时它又可以描述纹理的局部信息,弥补了传统的灰度直方图特征的缺点。

局部二值模式特征是一种计算复杂度较低的局部特征,它具有明暗无关和旋转无关的特点。
边缘方向直方图特征与全局的光照变化是无关的,它可以提取出二维条形码纹理的几何特点。

4 特征分类

学长开发的算法所使用的分类器为自适应 Spatialboost 算法,这是对 Spatialboost
算法的一个改进。使用这个分类器是由二维条形码的特点以及我们算法框架的特点所决定的。由于我们把原始输入图像分为若干大小固定的图像子块,属于二维条形码的图像子块在空间上有很强的关联性,或者说这些属于二维条形码的图像子块都是紧密相邻的。同时由于图像子块的尺寸不大,它所包含的信息量相对较少,有的时候就很难把属于二维条形码的图像子块和属于背景的图像子块区分开(它们在特征空间上可能重叠)。如果我们可以利用子块在空间上的联系,把空间信息加入到分类器中,将有利于提高分类器的准确率。

适应 Spatialboost
算法可以同时利用纹理特征以及子块在空间上的联系,在训练过程中,将纹理特征和空间信息自适应的结合起来训练分类器。这样,当前处理的子块的分类结果不仅依赖于它自己的纹理特征,还和它周围子块的分类结果密切相关。当属于背景的图像子块的纹理特征很接近于属于二维条形码的图像子块时,我们还是可以依靠和它相邻的背景子块来对它做出正确的分类。

5 后处理

经过特征提取和特征分类两个模块后,我们得到了对图像子块的分类结果,但最后我们期望得到的是对二维条形码的包围盒。在我们的设置下,自适应Spatialboost
分类器对背景子块的分类相当严格,此时对属于二维条形码的图像子块会有部分漏检发生,

在这里插入图片描述

因此在后处理模块中,我们先使用一种自适应聚类算法,对分类后的结果进一步改进,来精确的覆盖整个二维条形码。特征分类后定位到的子块的大小为
25×25,我们把这些子块再划分为 10×10 的小方块。接着以得到的 10×10 的子块为种子,用子块灰度值的方差为衡量标准往外聚类,聚类时的阈值设定为:

在这里插入图片描述

其中 M 是聚类开始时作为种子的子块的个数,k 为调整系数,在本文算法中 k设置为 0.5,Var 和 Mean
分别表示子块灰度值的均值和方差。由公式(3-1)可知,每幅图像的聚类阈值是自适应的计算得来的。聚类开始时首先从种子子块出发,计算它们周围的子块的灰度值方差,如果大于聚类阈值就把它标识为属于二维条形码,重复这个过程直到周围再没有子块符合聚类条件。图
3-5
是聚类算法的部分结果,第一行的图像是特征分类后的结果,准确的定位到了一部分二维条形码,但是没有完全的覆盖整个二维条形码,不利于我们输出最后的定位包围盒。第二行为聚类后的结果,可以看到小块几乎完全覆盖了整个二维条形码,此时再把这些小块合并为一个平行四边形就很方便了。

在这里插入图片描述

聚类后定位出来的小块基本上覆盖了整个二维条形码,最后我们只需要把定位出的小包围盒合并为大包围盒,并输出最后的定位结果。整个后处理流程见图

在这里插入图片描述

6 代码实现

这里演示条形码的检测效果:
在这里插入图片描述

关键部分代码实现:


# import the necessary packages
import numpy as np
import argparse
import cv2

# construct the argument parse and parse the arguments
# ap = argparse.ArgumentParser()
# ap.add_argument("-i", "--image", required = True, help = "path to the image file")
# args = vars(ap.parse_args())# load the image and convert it to grayscale
image = cv2.imread('./images/2.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# compute the Scharr gradient magnitude representation of the images
# in both the x and y direction
gradX = cv2.Sobel(gray, ddepth = cv2.CV_32F, dx = 1, dy = 0, ksize = -1)
gradY = cv2.Sobel(gray, ddepth = cv2.CV_32F, dx = 0, dy = 1, ksize = -1)# subtract the y-gradient from the x-gradient
gradient = cv2.subtract(gradX, gradY)
gradient = cv2.convertScaleAbs(gradient)# blur and threshold the image
blurred = cv2.blur(gradient, (9, 9))
(_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)# construct a closing kernel and apply it to the thresholded image
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)# perform a series of erosions and dilations
closed = cv2.erode(closed, None, iterations = 4)
closed = cv2.dilate(closed, None, iterations = 4)# find the contours in the thresholded image, then sort the contours
# by their area, keeping only the largest one
(cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
c = sorted(cnts, key = cv2.contourArea, reverse = True)[0]# compute the rotated bounding box of the largest contour
rect = cv2.minAreaRect(c)
box = np.int0(cv2.boxPoints(rect))

5 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/66610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决npm install报错: No module named gyp

今天运行一个以前vue项目,启动时报错如下: ERROR Failed to compile with 1 error上午10:19:33 error in ./src/App.vue?vue&typestyle&index0&langscss& Syntax Error: Error: Missing binding D:\javacode\Springboot-MiMall-RSA\V…

#include <graphics.h> #include <conio.h> #include<stdlib.h>无法打开源文件解决方案

一、问题描述 学习数据结构链表的过程中&#xff0c;在编写漫天星星闪烁的代码时&#xff0c;遇到了如下图所示的报错&#xff0c;#include <graphics.h> 、 #include <conio.h> 等无法打开源文件。 并且主程序中initgraph(初始化画布)、setfillcolor&#xff08;…

pdf转换成图片免费软件用哪个?pdf转换成图片就用它

随着技术的发展&#xff0c;现在企业办公运用到的电子文档各种各样&#xff0c;我们日常需要掌握的技能越来越高要求&#xff0c;其中pdf和图片是我们经常接触的文件格式之一&#xff0c;而且这两个文件格式我们会经常将它们进行转换&#xff0c;那么pdf转换成图片怎么操作呢?…

Qt +VTK+Cmake 编译和环境配置(第一篇 采坑)

VTK下载地址&#xff1a;https://vtk.org/download/ cmake下载地址&#xff1a;https://cmake.org/download/ 版本对应方面&#xff0c;如果你的项目对版本没有要求&#xff0c;就不用在意。我就是自己随机搭建的&#xff0c;VTK选择最新版本吧&#xff0c;如果后面其他的库不…

iPhone 隔空投送使用指南:详细教程

本文介绍了如何在iPhone上使用隔空投送,包括如何在iOS 11到iOS 14的iPhone上启用它、发送文件以及接受或拒绝AirDrop发送给你的文件。对于iOS 7以上的旧款iPhone,提供了另一种方法。 如何打开隔空投送 你可以通过以下两种方式之一启动隔空投送功能:在“设置”应用程序或控…

1、[春秋云镜]CVE-2022-32991

文章目录 一、相关信息二、解题思路&#xff08;手注&#xff09;三、通关思路&#xff08;sqlmap&#xff09; 一、相关信息 靶场提示&#xff1a;该CMS的welcome.php中存在SQL注入攻击。 NVD关于漏洞的描述&#xff1a; 注入点不仅在eid处&#xff01;&#xff01;&#xff…

uni-app+uView实现点击查看大图片的效果

<u-button text"月落" click"imgPreview()"></u-button> //注意&#xff1a;参数urls 是预览图片的链接地址&#xff0c;是个数组 imgPreview() {uni.previewImage({indicator: "none",loop: false,urls: []&#xff0c;}) },参数说…

Python爬虫抓取经过JS加密的API数据的实现步骤

随着互联网的快速发展&#xff0c;越来越多的网站和应用程序提供了API接口&#xff0c;方便开发者获取数据。然而&#xff0c;为了保护数据的安全性和防止漏洞&#xff0c;一些API接口采用了JS加密技术这种加密技术使得数据在传输过程中更加安全&#xff0c;但也给爬虫开发带来…

【前端demo】倒计时器 可选择时间 原生实现

文章目录 效果过程日历与获取时间居中背景与字计时器清空计时器 代码HTMLCSSJS 其他demo 效果 效果预览&#xff1a;倒计时器 可选择时间 (codepen.io) 参考&#xff1a; Simple Clock/Countdown timer (codepen.io) 前端页面实现倒计时效果的几种方法_前端倒计时__Boboy的…

Stable Diffuse 之 本地环境部署/安装包下载搭建过程简单记录

Stable Diffuse 之 本地环境部署/安装包下载搭建过程简单记录 目录 Stable Diffuse 之 本地环境部署/安装包下载搭建过程简单记录 一、简单介绍 二、注意事项 三、环境搭建 git 下载和安装 python 下载和安装 stable-diffusion-webui 下载和安装 测试 stable diffuse w…

智慧水产养殖方案,守护养殖水产品安全!

水产品在人们的饮食文化中占据着举足轻重的地位&#xff0c;更是人们摄入蛋白质的重要来源。因此&#xff0c;保障食品安全&#xff0c;提升养殖水产品的品质至关重要然。而传统的人工观察水产养殖方式较为单一&#xff0c;难以及时发现水质问题和投喂情况&#xff0c;容易导致…

Flink+Paimon多流拼接性能优化实战

目录 &#xff08;零&#xff09;本文简介 意外收获&#xff1a; &#xff08;一&#xff09;背景 &#xff08;二&#xff09;探索梳理过程 &#xff08;三&#xff09;源码改造 &#xff08;四&#xff09;修改效果 1、JOB状态 2、Level5的dataFile总大小 3、数据延…

STM32定时器定时及其应用

STM32定时器定时及其应用 定时器概述☆定时器相关配置CubeMX工程配置及程序实现固件库程序设计及实现 定时器概述 1. 工作原理 使用精准的时基&#xff0c;通过硬件的方式&#xff0c;实现定时功能。定时器核心就是计数器 2. 定时器分类   基本定时器&#xff08;TIM6~TIM7…

Redis 事务

1. 是什么 1. 官网 https://redis.io/dosc/manual/transactions/ 2. 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序地串行化执行而不会被其它命令插入&#xff0c;不许加塞 2. 能干啥 一个队列中&#xff0c;一次…

2022年03月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:红与黑 有一间长方形的房子, 地上铺了红色、 黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上, 只能向相邻的黑色瓷砖移动。 请写一个程序, 计算你总共能够到达多少块黑色的瓷砖。 时间限制: 1000 内存限制: 65536 输入…

C语言----详解socket通信

一&#xff1a;什么是socket 刚接触socket的同学想必也知道socket的中文名&#xff0c;套接字&#xff0c;与其说是中文名倒不如说这是什么玩意&#xff0c;我们先不要管中文名的实际意义&#xff0c;我们先来了解一下什么是socket。 我们上网产生的数据都是经过协议栈一层一层…

Ubuntu18.04安装cuDNN

注册账号 https://developer.nvidia.com/rdp/cudnn-archive 该网站下载安装包需要先进行注册。登录成功后&#xff0c;找到与CUDA对应的版本。 选择Linux版本进行下载。 下载后的格式为.tar.xz 解压 tar xvJf cudnn-linux-x86_64-8.9.3.28_cuda12-archive.tar.xz配置环境 su…

【广州华锐互动】AR远程连接专家进行协同管理,解放双手让协同更便捷

AR远程协同系统是一种基于AR技术&#xff0c;实现远程设备维修和技术支持的系统。该系统通过将虚拟信息叠加在现实世界中&#xff0c;实现对设备的全方位监控和管理&#xff0c;并可以通过AR眼镜等终端设备&#xff0c;实时查看设备的各项数据和信息&#xff0c;为设备维修提供…

Python小知识 - 1. Python装饰器(decorator)

Python装饰器&#xff08;decorator&#xff09; Python装饰器是一个很有用的功能&#xff0c;它可以让我们在不修改原有代码的情况下&#xff0c;为已有的函数或类添加额外的功能。 常见的使用场景有&#xff1a; a. 函数缓存&#xff1a;对于一些计算量较大的函数&#xff0c…