视觉介绍文档

说明:

  1. 由于加入了最小矩形检测的代码还未调整至最佳,检测效果并不理想,故上交两套代码和检测结果,代码1未使用最小矩形检测,代码2使用了最小矩形检测。

  2. Result 1 中的图片和视频使用1中同一份代码在只改变hsv参数下得出的检测结果。

封装思路

​        视觉检测过程主要有以下部分:相机驱动,目标检测,行动预测。因此用于目标检测的Find_Contour函数和行动预测的Kalmanfilter两个函数被封装用来完成特定功能。

​        测过程中存在两个主要对象:摄像头(Camera)和发光物体(Object),因此分别封装为两个类(Class)。

视觉介绍文档_第1张图片

        对Camera有参数初始化,打开摄像头和关闭摄像头三个操作,因此这个类中有这三种方法。

        对发光物体,分为以下几种方法:1.目标物体检测,计算装甲板中心点位置 2.物体行动预测。

视觉介绍文档_第2张图片

识别原理

目标识别

首先将视频中的第一帧由BGR色彩空间转换到HSV色彩空间

再提取视频中装甲板橙黄色的hsv阈值上下限,利用opencv库中的findContours函数提取橙黄色通道中的轮廓。再对提取出来的轮廓进行面积排序,选取最大的面积作为目标。

视觉介绍文档_第3张图片

判断条件

为了提高识别准确率需要添加额外判断条件来排除干扰,尽可能准确的识别目标物体。

最小面积:

识别到物体后,可以计算画出的矩形面积来估计检测物体的面积。设置面积下限可以除去一些较小光块的干扰。

视觉介绍文档_第4张图片

相比绝对参数,设置相对参数可以使代码适应性更广,减少出错的可能。

长宽比:

在一定长宽比范围内的矩形才符合检测要求。

视觉介绍文档_第5张图片

面积占比:

即实际轮廓面积与矩形面积的比值。该比值需要大于特定值才符合检测要求

视觉介绍文档_第6张图片

最小矩形

使用opencv内置函数cv.minAreaRect,获得包裹符合要求的轮廓的最小矩形上各点的坐标。

再在这些坐标中找到矩形上下左右四个角点的坐标并计算出矩形长宽。

视觉介绍文档_第7张图片

行动预测

先计算两个矩形各自的中心点坐标,再取这两个点中点作为装甲板中心点。得到该点后,利用卡尔曼滤波进行轨迹预测。我们小组直接调用了封装好的kalmanfilter库,返回目标中心的坐标,并画出该坐标位置。

视觉介绍文档_第8张图片 

 

遇到的问题以及解决方案

  1. 往代码中加入最小矩形检测时,与直接使用findContours函数不同,findContours函数可以直接提供矩形的长宽值,因此可以直接计算矩形面积并排序。但最小矩形检测无法一开始就得到矩形长宽值并对轮廓面积进行排序。同时为了简化代码,解决方法是先利用其他判断条件对检测的轮廓进行筛选,最后再用轮廓面积排序。在筛选过程中,对于每个符合要求的轮廓,将其Box列表(最小矩形角点坐标)按顺序存入列表Rec,将长宽值以及记录下的每个轮廓的编号i放入同一数组WH内保存。在对面积排序时编号会跟着整个数组一起走,面积大的轮廓的编号排在前面,需要得到轮廓对应最小矩形的坐标时,只要利用编号索引找到Rec列表中的对应位置即可。

    视觉介绍文档_第9张图片

  2. 在将符合要求的轮廓点放入同一数组时,因为寻找最小矩形四个角点时用到了numpy数组,轮廓点中的数组因此是numpy数组,尝试了如创建空的numpy数组并用np.append方法添加元素,但未能成功。苦苦思索之后,想到用arr.tolist()方法将Numpy数组转化为列表就可以使用常规list.append()添加元素了,顿时豁然开朗。

仍然存在的问题

使用了最小矩形检测的代码经常会丢失目标,检测稳定性一般。

参数

#橙黄色hsv阈值的上下限

​ low_light = np.array([11, 43, 46])

high_light = np.array([34, 255, 255])

#长宽比:7:2 最小面积:50

Final_Box,i = findContours(frame,7,2,50)

你可能感兴趣的:(opencv,计算机视觉,深度学习,python)