实验任务与要求:
图像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)/255
Sobelx = np.array([[-1,0,

最低0.47元/天 解锁文章
607





