基于模板匹配的螺母检测(计算机视觉实验)

2023-11-08


更新日期:2021/6/26


前言

模板匹配是将模板图像与目标图像中每一处做比较,得出一个相似度(或距离)值,如果模板图与目标图像的某一位置的相似度较高,则该位置可能是目标位置。

本次实验给出几张图片,图片中有大小、角度等不同的多个螺母,要求从图片中检测出这些螺母(详细实验内容及要求请见下文)。

由于某些图片存在较大噪声干扰,实验中基于传统的模板匹配方法,尝试过各种手段,有些螺母始终不能很好地响应出亮点,仅两张图片中的螺母能在不出错的情况下完全检测出。要想实现更佳的效果,可以尝试使用机器学习的方法。


提示:博主正在学习《计算机视觉》(本科)课程,此博文原为本人实验课程技术报告,经整理后发布,欢迎大家相互交流学习。本人才疏学浅,如果有不到位的地方,欢迎大家提出意见和建议。
文章除特别注明处外,均为博主原创,转载请附原文出处。以下是本文正文内容。

实验任务与要求

图像01~05.jpg中是几个螺母的照片,请设计并实现一个方法,正确地检测出其中的螺母,注意:有一个是圆形的不要检测,只检测六边形螺母。可以从其中一幅图像中截取模板。

01.jpg-05.jpg:
(实验材料图片为课程老师原创,已得到同意发布,请勿盗用)

1 实验情况概述:

实验过程中,曾尝试过模板匹配、边缘匹配、高斯滤波处理、双边滤波处理等各种方法,均没有取得良好的效果:“03.jpg”中的三个螺母和“04.jpg”中的一个螺母在响应图中,亮点不够明显,不能很好地检测出;在“05.jpg”中,只有1个螺母能被成功响应。只有在“01.jpg”“02.jpg”两张图像上,经过不断地调整,得到了完全正确的识别结果。

2 算法流程

最终算法的流程如下:

第一步:模板库建立①截取模板。在“01.jpg”中找出有代表性的螺母,截取作为模板;②模板旋转。每个模板以步长13°旋转,旋转到60°的位置。旋转到60°是因为螺母是中心对称图形,每旋转30°就和原图相同。实际上,由于螺母上的锈纹等原因,螺母最好旋转360°,但这样会大大增多模板数量,降低检测速度,故不采用。旋转得到的模板分别建立图像金字塔,分别得到大小不同的模板。经过以上三个步骤,得到了每个原始模板不同朝向、不同大小的模板,用于下一步检测。实验中截取的原始模板图有6个,如图1所示:

图1 截取的原始模板

第二步:待检测图像预处理。载入待检测图像,将其进行高斯模糊预处理,目的是去除图像的噪声。

第三步:模板匹配。将第一步得到的模板库中每个模板分别与图像进行匹配,得到最大响应图。

第四步:找出螺母位置①响应图高斯模糊预处理。此步骤的目的是消除由于匹配时噪声引起的响应图中的小亮点。比如,圆形零件位置处会产生小而亮的点,使用高斯模糊可以减弱其亮度。而六边形螺母位置的亮点一般较大,受高斯模糊影响较小;②阈值处理。相应最大值乘以特定的系数,得到阈值亮度,对响应图进行阈值;③获得每一个连通分量的质心位置,得到每个点的坐标,即为检测结果。

3 实验结果与分析

对每个图像分别进行实验。

需要调整的参数主要是阈值系数(最大响应要乘的数)和响应图预处理的高斯滤波核大小。其中,阈值系数每个图像各不相同,高斯滤波核大小除“02.jpg”外均设置为15*15,“02.jpg”设置为15*15,“02.jpg”设置为35*35。在调整参数的过程中,首先确保的是正确性,在不出错的基础上再尽量识别更多的螺母。

以下为5张图像的检测结果和对结果的分析。

3.1 “01.jpg”和“02.jpg”检测结果

“01.jpg”“02.jpg”两张图像上,经过不断地调整,得到了完全正确的识别结果。其中,“01.jpg”识别良好,是因为模板都是从这张图像上截取的;在“02.jpg”,采用了35*35的滤波核对响应图进行滤波,而不是其它图像的15*15,原因是能更好地消除圆形零件小而亮的响应点,而15*15不能做到。

“01.jpg”“02.jpg”两张图像的识别结果分别如图2和图3所示,左为识别结果,右为对应模糊处理过的响应图:

图2 01.jpg识别结果和15*15高斯滤波后的响应图
图3 02.jpg识别结果和35*35高斯滤波后的响应图

3.2 “03.jpg”和“04.jpg”检测结果

“03.jpg”中的三个螺母和“04.jpg”中的一个螺母不能良好的检测出。原因是响应图中的亮点不够明显,如果阈值设置太低,又会使圆形零件被错误识别。“03.jpg”“04.jpg”两张图像的识别结果分别如图4和图5所示,左为识别结果,右为对应模糊处理过的响应图:

图4 03.jpg识别结果和15*15高斯滤波后的响应图
图5 04.jpg识别结果和15*15高斯滤波后的响应图

3.3 “05.jpg”检测结果

“05.jpg”识别结果最差,原因在于背景图像部分的匹配结果差。在模板中,除了有模板部分,在四角和中心还有一部分的背景。在“05.jpg”中,由于背景相较前几张图像变化较大,故模板在螺母位置不能很好地匹配,响应很弱。“05.jpg”的识别结果如图6所示,左为识别结果,右为对应模糊处理过的响应图:

图6 05.jpg识别结果和15*15高斯滤波后的响应图

针对“05.jpg”的问题,一个可能的解决思路是:对opencv模板匹配函数进行改进,改进方案为:可以指定一张和待匹配图像同尺寸的二值图像,用于表示哪些像素参与匹配,哪些像素不参与匹配。这样,就可以在匹配时略去背景图像部分,仅螺母的部分参与匹配。

3.4 其它问题

问题1:实验中建立的模板库中的模板多达120个,检测效率低下,通常要等待5秒到10秒才得出检测结果;

问题2:不同的图像需要不同的阈值和响应图高斯滤波核大小设置,无法做到自适应。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于模板匹配的螺母检测(计算机视觉实验) 的相关文章

  • 为什么这些双精度数的返回值为-1.#IND?

    I have double score cvMatchContourTrees CT1 CT2 CV CONTOUR TREES MATCH I1 0 0 cout lt
  • 如何在Python中使用tcp套接字发送和接收网络摄像头流?

    我正在尝试重新创建这个项目 https github com hamuchiwa AutoRCCar 我拥有的是服务器 我的电脑 和客户端 我的树莓派 我所做的与原始项目不同的是我尝试使用一个简单的网络摄像头而不是树莓派摄像头将图像从我的
  • OpenCV:视频结束后如何重新启动?

    我正在播放视频文件 但播放完毕后如何再次播放 Javier 如果您想一遍又一遍地重新启动视频 也称为循环播放 可以通过在帧数达到时使用 if 语句来实现cap get cv2 cv CV CAP PROP FRAME COUNT 然后重置帧
  • 相机标定(OpenCV 2.3)-如何使用畸变参数?

    我有一组带有一些附加标记的刚体图像 我在这些标记之一中定义了一个原点坐标系 我想获得该坐标系与在相机原点定义的坐标系之间的旋转和平移 我尝试了一段时间 POSIT 以下this http goo gl cUYYt 但从未获得可接受的结果 直
  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • 提高 pytesseract 从图像中正确识别文本的能力

    我正在尝试使用读取验证码pytesseract模块 大多数时候它都能提供准确的文本 但并非总是如此 这是读取图像 操作图像以及从图像中提取文本的代码 import cv2 import numpy as np import pytesser
  • 我是否必须使用我的数据库训练 Viola-Jones 算法才能获得准确的结果?

    我尝试提取面部数据库的面部特征 但我认识到 Viola Jones 算法在两种情况下效果不佳 当我尝试单独检测眼睛时 当我尝试检测嘴巴时 运作不佳 检测图像的不同部分 例如眼睛或嘴巴 或者有时会检测到其中几个 这是不可能的情况 我使用的图像
  • 如何使用 Python 将我的 GoPro Hero 4 相机直播连接到 openCV?

    我在尝试从我的新 GoPro Hero 4 相机捕获实时流并使用 openCV 对其进行一些图像处理时遇到麻烦 这是我的试用 创建的窗口上没有显示任何内容 import cv2 import argparse import time imp
  • 从图像坐标获取对象的世界坐标

    I have been following this http docs opencv org modules calib3d doc camera calibration and 3d reconstruction html docume
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip
  • OpenCV 跟踪器:模型未在函数 init 中初始化

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • cv2.drawContours() - 取消填充字符内的圆圈(Python,OpenCV)

    根据 Silencer的建议 我使用了他发布的代码here https stackoverflow com questions 48244328 copy shape to blank canvas opencv python 482465
  • 在 Visual Studio 2012 中安装 OpenCV

    我正在尝试安装 OpenCV 来与 Visual Studio 一起使用 我使用的是2012Pro版本 但我认为它应该与vs10相同 我正在关注这个教程 http docs opencv org doc tutorials introduc
  • OpenCV Mat 和 Leptonica Pix 之间的转换

    我需要在 C 中在 OpenCV Mat 图像和 Leptonica Pix 图像格式之间进行转换 这用于 8 位灰度图像的二值化 我发现发现了 ikaliga的回答 https stackoverflow com a 25929320 2
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • 图像梯度角计算

    我实际上是按照论文的说明进行操作的 输入应该是二进制 边缘 图像 输出应该是一个新图像 并根据论文中的说明进行了修改 我对指令的理解是 获取边缘图像的梯度图像并对其进行修改 并使用修改后的梯度创建一个新图像 因此 在 MATLAB Open
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • BRISK 特征检测器检测零个关键点

    下面显示的 Brisk 探测器没有给我任何关键点 有人可以提出一个问题吗 我将尝试用一些代码解释我在下面所做的事情 include opencv2 features2d features2d hpp using namespace cv u

随机推荐

  • 全球计算机出货量排名,2018年全球电脑出货量排名:联想夺冠,惠普戴尔分列二三...

    作者 虎龙吟 美国当地时间2019年1月10日 Gartner发布了2018年全球个人电脑出货量数据报告 根据Gartner发布的数据 2018年第四季度 全球个人电脑出货量达到6860万台 比2017年第四季度下降了4 3 根据Gartn
  • chatglm2-6b在P40上做LORA微调

    背景 目前 大模型的技术应用已经遍地开花 最快的应用方式无非是利用自有垂直领域的数据进行模型微调 chatglm2 6b在国内开源的大模型上 效果比较突出 本文章分享的内容是用chatglm2 6b模型在集团EA的P40机器上进行垂直领域的
  • 萌妖出没服务器维护电视版,萌妖出没-萌妖出没手游官网版预约-9k9k手游网

    萌妖出没是一款根据经典动漫改编而成的策略竞技手游 游戏中还原了众多经典的场景 玩家在玩游戏的过程中还有回味众多经典的动漫情节 众多宠物精灵等你来收集 打造强大的精灵战队 带领它们不断的战斗冒险 体验其中的无穷乐趣 感兴趣的玩家随时可以来下载
  • 牛客网——字符串排序(C++)

    题目描述 编写一个程序 将输入字符串中的字符按如下规则排序 规则 1 英文字母从 A 到 Z 排列 不区分大小写 如 输入 Type 输出 epTy 规则 2 同一个英文字母的大小写同时存在时 按照输入顺序排列 如 输入 BabA 输出 a
  • R语言 第四章 初级绘图(3)核密度图,小提琴图,QQ图,星状图,等高图,固定颜色选择函数,渐变色生成函数,主体调色板,rainbow(),RcolorBrewer包

    关注公众号凡花花的小窝 收获更多的考研计算机专业编程相关的资料 绘制其他图形 核密度图 sm包中sm density compare函数用于绘制核密度图 核密度图是用一条密度曲线而不是通过柱状来展示连续型变量的分布 相比直方图 密度图的一个
  • getUserProfile:fail 调用失败?getUserProfile:fail can o

    一般Fail原因有很多 如果fail函数的参数返回结果有具体的提示错误 比如长度关键字等问题 那么根据提示直接更改就行 还有一种情况就是我们使用测试号 Uni开发时 我们调用getUserProfile函数返回错误 我们首先要考虑AppId
  • 分享三个不同目录双向更新的实用方法

    分享三个不同目录双向更新的实用方法 方法一 rsync 判断脚本 进行双向更新 方法二 使用rsync的 u选项 方法三 使用rsync inotify监控工具 扩展 方法一 rsync 判断脚本 进行双向更新 脚本内容如下 bin bas
  • 一起来!白嫖Amazon DynamoDB!!!

    Amazon DynamoDB简介 Amazon DynamoDB是由Amazon Web Services AWS 提供的一种快速 灵活 全托管的NoSQL数据库服务 支持文档和键 值数据模型 它具有自动扩展 低延迟 高可靠性 高吞吐量等
  • 4.2 配置Mysql与注册登录模块(中)

    目录 学习目标 学习内容 后端 JWT工具类 数据库修改 写具体业务API 根据token获取用户信息 注册API 前端 这节课实现了登录效果 学习目标 jwt验证 后端的API 前端登录注册页面 学习内容 前端和后端会有跨域问题 不用传统
  • Linux 中的 colcrt 命令及示例

    Linux 系统中的colcrt命令用于格式化文本处理器输出 以便可以在阴极射线管显示器上查看 它删除了下划线 删除线和下划线 这些内容无法在 CRT 上显示 因为在 CRT 屏幕上的给定位置只能生成一个字符 它还将所有下划线放在新行上 位
  • 华为服务器怎么升级2016系统,服务器怎么升级

    服务器怎么升级 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 当您购买的弹性云服务器规格无法满足业务需要时 您可以随时变
  • Ruby

    1 如何安装ralis 在线安装常常因为公司proxy server的原因产生连接问题 所以可以先到https rubygems org下载然后离线安装 gem install l rails2 3 5 gem
  • 【LeetCode刷题】-岛屿数量

    Task 思路 1 首先判断给定的二维数组是不是空的 2 对二维数组遍历一下 对每个元素进行判断 a 如果这个值等于1 那么就把计数器 1 并且对该元素四周进行深度搜索 3 返回 代码 class Solution public int n
  • 定制 findbugs规则

    come from http www 51testing com html 97 13997 211893 html Findbugs是著名的开源java静态代码分析工具 基于bytecode扫描 具备数据流分析能力 操作很简单 可以下载单
  • vue dialog 弹窗组件

    因为官方组件不是很好用所以自己写了一个弹窗组件 javascript
  • Event Driven Class OSAL 基于事件驱动的模拟操作系统

    EventDrivenClassOSAL详解 Event Driven Class OSAL 基于事件驱动的模拟操作系统 前言 什么是OSAL OSAL为 Operating System Abstraction Layer 即 操作系统抽
  • Django使用MySQL数据库出现的问题--mysqlclient库的安装

    python有的时候真的是很不友好 我的vc14库是最新的 不能装 首先明确 Django使用MySQL数据库需要MySQL python 2 7 或者MySQLclient 3 6 库的支持 但是 他们都不好装 要不网上也不会有那么多关于
  • 正弦波逆变器c语言程序源码,官方开源-EG8010单相纯正弦波逆变器驱动板资料分享...

    该项目是基于EG8010和IR2110S设计的单相纯正弦波逆变器驱动板设计 见附件下载其原理图 PCB 使用说明等 该单相纯正弦波逆变器采用专用芯片EG8010 为控制芯片 驱动芯片采用IR2110S 驱动板上集成了电压 电流 温度保护功能
  • 基于KNN的手写字符识别

    整理了一下自己之前做过的手写字符识别的资料 分享出来供大家学习交流 后续可能还会分享一些其他方法进行手写字符识别的资料 敬请期待 一 任务和设计思路 二 KNN算法实现 1 KNN算法简介 2 简单的KNN代码 3 使用sklearn的KN
  • 基于模板匹配的螺母检测(计算机视觉实验)

    文章目录 前言 实验任务与要求 1 实验情况概述 2 算法流程 3 实验结果与分析 3 1 01 jpg 和 02 jpg 检测结果 3 2 03 jpg 和 04 jpg 检测结果 3 3 05 jpg 检测结果 3 4 其它问题 更新日