实验任务与要求:

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

问题分析

本实验采用计算机视觉中模板匹配的相关技术,通过分析本实验中需要检测的场景与螺母的分布与位置,可以发现图片中螺母的形状是平躺,但存在不同大小和颜色的螺母,而且螺母之间间距也有稀疏不同,而且存在与螺母相似度较高的圆形物体,对多目标检测带来较大的影响。最后一张检测图像的检测场景更为复杂,由于存在许多干扰的元素。给螺母的检测带来较大的困难。为此考虑到一些解决方法,其中通过建立螺母的模板进行检测,分别利用到了彩色模板和边缘模板,以及轮廓模板。对于采用的方法有图像金字塔和距离变换。同时由于需要检测的螺母是多个,因此采用进行多目标匹配的方法。

方法流程的设计

通过分析检测螺母的场景,首先尝试采用最直接的截图获取螺母模板的方式,来进行模板的匹配,因此采用opencv中的模板匹配函数,函数返回模板与图片的响应图,根据响应图中的最大值来设置响应的阈值,进而通过调节阈值达到多目标检测的结果。通过实验结果分析,发现采用截取多个螺母模板取平均,所得到的模板的检测结果较好,因此需要加入求模板平均的步骤。其次,考虑到检测场景中存在大小不同的螺母,因此考虑到构建螺母模板的金字塔,通过与不同大小的模板的匹配,来检测出不同大小的螺母。另外考虑到螺母为正六边形,为此构造不同旋转角度的螺母,由于螺母的对称性,其中旋转角度为[0,60]。

实验配置与结果

图片一的检测结果:

图片二的检测结果:

图片三的检测结果:

采用图像金字塔构建模板金字塔如下所示:

通过用不同大小的模板对图片中的螺母进行匹配,希望能够检测出不同大小的螺母,以图片1的检测结果如下所示:

实验结果分析

通过上述实验结果,可以看出采用距离变换选取合适的参数,可以得到较好的检测结果,由于检测场景中存在干扰元素,即存在与螺母相似的物体,因此在进行多目标检测时存在一个困境,就是如果为了检测更多的螺母,进行降低阈值的操作,会导致检测出圆形的非螺母物体,因此就给检测带来较大的困难,而且图片4中的螺母分布较密集,导致检测结果不理想,图片5中将检测场景变得更加复杂,由于图片中存在蝴蝶,而且蝴蝶的翅膀上的斑点与螺母相似,造成很大的检测困难。
实验通过建立模板金字塔,通过不同的模板分别进行检测,可以缓解多目标检测与检测准确度之间的矛盾。通过调节阈值参数,获得一个还可以接受的检测结果。

源代码

#截取螺母模板
Template = cv.imread(filename='01.jpg',flags=cv.IMREAD_UNCHANGED)
Template = cv.resize(Template,(int(Template.shape[1]/2),int(Template.shape[0]/2)))
if Template is None:print('opening image failed.')
x,y,w,h = cv.selectROI(Template)
T1 = cv.cvtColor(Template[y:y+h,x:x+w,:],cv.COLOR_BGR2GRAY).astype(np.float32)/255Sobelx = np.array([[-1,0,1],[-2,0,2],[-1,0,1]],np.float32)
Sobely = Sobelx.T
Gx = cv.filter2D(T1,-1,Sobelx)
Gy = cv.filter2D(T1,-1,Sobely)
M1 = np.sqrt(Gx**2 + Gy**2)cv.imshow('template',M1)
cv.waitKey(0)
cv.destroyAllWindows()x,y,w,h = cv.selectROI(Template)
T2 = cv.cvtColor(Template[y:y+h,x:x+w,:],cv.COLOR_BGR2GRAY).astype(np.float32)/255
Gx = cv.filter2D(T2,-1,Sobelx)
Gy = cv.filter2D(T2,-1,Sobely)
M2 = np.sqrt(Gx**2 + Gy**2)
M2 = cv.resize(M2,(M1.shape[1],M1.shape[0]))cv.imshow('template',M2)
cv.waitKey(0)
cv.destroyAllWindows()M = M1
cv.addWeighted(M1,0.5,M2,0.5,0.0,M)plt.figure()
plt.imshow(M,cmap = 'gray')
plt.show()#对图片进行模板匹配,对每个模板进行匹配,结果放在列表中
frame = cv.imread(filename='01.jpg',flags=cv.IMREAD_UNCHANGED)
frame = cv.resize(frame,(int(frame.shape[1]/2),int(frame.shape[0]/2)))I = cv.cvtColor(frame,cv.COLOR_BGR2GRAY).astype(np.float32)/255Sobelx = np.array([[-1,0,1],[-2,0,2],[-1,0,1]],np.float32)
Sobely = Sobelx.TGx = cv.filter2D(I,-1,Sobelx)
Gy = cv.filter2D(I,-1,Sobely)
im = np.sqrt(Gx**2 + Gy**2)cv.imshow('im',cv.resize(im,(700,700)))
cv.waitKey(0)
cv.destroyAllWindows()im1 = frame.copy()
for line in all_T:template = line[0]if template.shape[0]>=im.shape[0] or template.shape[1]>=im.shape[1]:print("NO detect")passelse:res = matchTemplateOfvarious(im,line)cv.imshow('res',cv.resize(res,(700,700)))cv.waitKey(0)cv.destroyAllWindows()#获取最大响应值_,max_val,_,_ = cv.minMaxLoc(res)print("此大小模板的匹配不同角度的螺母的最大值")print(max_val)if max_val>0.42:#对res二值化,二值化阈值选取最大响应的某个比例thresh = 0.355_,detects = cv.threshold(res,thresh,255,cv.THRESH_BINARY)#计算二值化之后的响应图的连通分量_,_,_,centroids = cv.connectedComponentsWithStats(detects.astype(np.uint8))#获取每个连通分量的质心位置,并根据此获得每个目标的包围盒坐标centroids = centroids + [T.shape[1]/2, T.shape[0]/2]centroids = np.round(centroids).astype(np.int32)top_left = np.round(centroids - [T.shape[1]/2, T.shape[0]/2]).astype(np.int32)bot_right = np.round(centroids + [T.shape[1]/2, T.shape[0]/2]).astype(np.int32)#在图像上绘制检测到的每一个目标的包围盒for l in range(1,centroids.shape[0]):cv.rectangle(im1,(top_left[l,0], top_left[l,1]),(bot_right[l,0], bot_right[l,1]),[1,0,0],2)plt.imshow(im1)
plt.show()

基于图像金字塔的模板匹配检测螺母相关推荐

  1. 基于图像灰度的模板匹配

                                                                基于图像灰度的模板匹配 设模板图像T(m*n),待匹配图像I(M*N),两幅图像 ...

  2. 高斯肤色概率模型matlab,基于肤色模型与模板匹配的人脸检测研究

    摘要:本文提出了一种基于肤色模型与模板匹配的人脸检测方法.基于YCbCr色彩空间的高斯概率模型,对肤色进行相似度计算和二值化分割,采用形态学对二值化后的图像去噪处理,随后又利用人脸先验知识进一步排除非 ...

  3. 基于几何特征的模板匹配原理

    基于几何特征的模板匹配通过计算模板图像与目标图像特征信息,来判断目标图像中是否有与模板图像相近或相同的图像. 模板匹配的大致流程: 首先,需要制作一个模板,并以模板图像以一定角度旋转,制作0°–360 ...

  4. 两个一样的图像相除会怎么样_【壮凌自动化分析】一种动力电池生产中基于图像运动模糊的速度检测方法...

    一种动力电池生产中基于图像运动模糊的速度检测方法 1.西南大学 电子信息工程学院,重庆 400715) 2.非线性电路与智能信息处理重庆市重点实验室,重庆 400715) 1.当前背景与成熟方法介绍 ...

  5. 基于opencv的图片模板匹配及其简单应用

    opencv的图片模板匹配及其简单应用 我的个人博客 基础知识 基于opencv的图片模板匹配 注: python及其相关包的安装不在讨论范围内 opencv提供了图片模板匹配的方法, cv2.mat ...

  6. 基于图像的口罩佩戴自动检测系统设计

    基于图像的口罩佩戴自动检测系统设计 一.前言 学校的一门综合设计,在此仅作学习记录,在此仅作学习记录!在此仅作学习记录!再不记录一下自己都忘掉了,同时希望看到的友友指出不足,共同进步,如果有的话吼吼吼 ...

  7. 深度学习阅读导航 | 04 FPN:基于特征金字塔网络的目标检测

    写在前面:大家好!我是[AI 菌],一枚爱弹吉他的程序员.我热爱AI.热爱分享.热爱开源! 这博客是我对学习的一点总结与记录.如果您也对 深度学习.机器视觉.算法.Python.C++ 感兴趣,可以关 ...

  8. Python相机自动采集图像,然后模板匹配、自动截取保存图片

    前言 通过python调用相机然后间隔一段时间进行拍摄图片,进行识别提取. 提示:以下是本篇文章正文内容,下面案例可供参考 一.确保电脑存在相机等硬件设备 我的电脑没有相机硬件设备,于是我通过手机在局 ...

  9. Halcon学习笔记之模板匹配-基于形状的多模板匹配

    基于形状的模板匹配在我们实际的项目中应用最广,同时在一些项目中,光是选中一个目标作为匹配的模板,效果可能还达不到我们所需要达到的要求或者我们所需要检测的目标存在多个特征需要去判别,所以这个时候可以考虑 ...

最新文章

  1. mysql通过订单量排序_mysql8 参考手册--通过排序优化
  2. js基础面试高频面点1:变量提升
  3. gitlab 邮件配置(smtp)
  4. python代码实例sicket_Python socket聊天脚本代码实例
  5. matlab中load seamout,matlab中的save与load函数
  6. java threadlocal 并发_Java并发编程:ThreadLocal
  7. android开发访问百度搜索,Android开发如何添加搜索功能———大神求救啊
  8. tg3269c网卡驱动linux,TP-Link TG-3269C驱动
  9. 高数18讲 之基础知识
  10. mybatis根据日期范围查询,多参数查询
  11. 麻将432牌型听牌判断流程图
  12. 扒一扒:2020台湾Android-Kotlin--Java-面試題庫,竟如此--
  13. 强化学习笔记3:RL agent的主要组成部分
  14. 华为路由器交换机eNSP配置命令
  15. 腾讯云https证书部署nginx
  16. 2068 Problem M 鸡兔同笼
  17. 从任正非的内部信,看系统开发公司如何度过寒冬
  18. STM32的最小系统组成
  19. 数字化转型的避坑指南:细说数字化转型十二大坑
  20. 如何获得免费网络空间

热门文章

  1. contenteditable的属性
  2. 前端map传给后端接收
  3. 2022年浙江大学计算机考研初试成绩多久出来?
  4. pve服务器自动开启pvp,魔兽8.0迎PVP有史以来最大改动,再也没有PVE和PVP服务器之分了...
  5. 从功能会员到生态会员 阿里“88VIP”改变了什么?
  6. OSI TCP/IP学习笔记
  7. 最新飞翔福袋脚本源码分享(Autojs完整源码)
  8. HTML定义ESCPOS热敏打打印模板,打印小票
  9. 施耐德电气尹正:智能制造始于IT赋能OT
  10. tracer王_跨界明星,从王天天到Tracer85车手,兴趣玩成专业的酷盖