RM装甲板识别

装甲板检测功能

  • 检测摄像头采集到的图像中目标的位置,在目标移动时保证检测的稳定性和正确性,在多个目标时,筛选出最佳打击目标并保证打击的一致性。

开发环境

Visual Studio 2017 + OpenCV3.4.5。

装甲板检测流程图

在这里插入图片描述

原理及操作

对于目标装甲板的识别,采取的是根据灯柱的位置来确定装甲板的位置的方法,所以准确的找到灯柱的位置是十分重要的,还要根据装甲板的特征来设定筛选条件,以此来准确定位到装甲板。因为识别时面对的情况是多种多样的,我们需要排除各种环境干扰并提高程序的鲁棒性,同时目标的快速移动也会给目标识别带来很大的挑战,这就要对算法的效率要求更加的严格。
装甲板检测算法如下:

  1. 先将摄像头采集到的图像转为灰度图,对灰度图进行二值化找出亮度较高的区域1,再通过对原图通道相减并二值化得到包含目标颜色的区域2,将区域1和区域2进行相与操作并通过形态学操作得到灯柱候选区域。
    具体实现方法:
  • 使用cvtColor(img_bgr,thres_whole, CV_BGR2GRAY);将原图转为灰度图,效果图如下:
    在这里插入图片描述

  • 使用threshold(thres_whole,thres_whole, value_thres*0.8, 255, THRESH_BINARY);将灰度图二值化,找出亮度较高的区域1,效果图如下:
    在这里插入图片描述

  • 使用split(img_bgr, splited);对原图进行通道分离,再根据目标颜色使用subtract(splited[0], splited[2], color);进行通道相减,效果图如下:
    在这里插入图片描述

  • 使用threshold(color, color,110, 255, THRESH_BINARY);对通道相减后的图像进行二值化操作,并同时对二值化后的图像使用dilate(color, color, element);进行膨胀操作,得到包含目标颜色的区域2,效果图如下:
    在这里插入图片描述

  • 使用max_color = color & thres_whole;语句将区域1和区域2进行相与操作,得到包含目标颜色且较亮的区域,即灯柱候选区域,为防止灯柱过细,使用膨胀操作dilate(max_color, max_color, element2);扩大灯柱候选区域,效果图如下:
    在这里插入图片描述

  1. 对灯柱候选区域进行处理,找到符合条件的灯柱。
    具体实现方法:
  • 使用findContours( max_color, tmp_contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);将候选灯柱轮廓找出,效果图如下:
    在这里插入图片描述

    扫描二维码关注公众号,回复: 10938269 查看本文章
  • 使用minAreaRect(tmp_contours[i]);得到候选灯柱轮廓最小包围矩形,并对矩形进行筛选,条件如下:

* 最小包围矩形偏离垂直方向的角度的绝对值;
* 最小包围矩形最长边的数值;
* 最小包围矩形的面积;
* 最小包围矩形长边与短边的比值;

有关参数数值要根据实际情况而定

bool condition_angle1 = (fabs(tmp_rect.angle) < 45.0) && tmp_rect.size.height > tmp_rect.size.width; 
bool condition_angle2 = (fabs(tmp_rect.angle) > 60.0) && tmp_rect.size.width > tmp_rect.size.height; 
bool condition_length = max_len > 7;
bool condition_area = area_contour > 25 && area_contour < 600;
bool condition_ratio = (max_len / min_len > 1.5) && (max_len / min_len < 25.0);

在这里插入图片描述
3. 对筛选出来的灯柱两两匹配,筛选出装甲板区域,并对筛选出来的目标进行分析,得到最佳打击目标。
具体实现如下:

  • 对得到的灯柱进行两两匹配,筛选出满足装甲板条件的区域,筛选条件如下:
* 灯柱中点的距离;
* 灯柱之间的较长边的比值;
* 灯柱之间角度差值的绝对值;
* 灯柱中点坐标y的差值;

有关参数数值要根据实际情况而定

bool condition1 = distance > MAX(leni, lenj) && distance <= 3*MAX(leni, lenj)/*150*/;	 //灯条中点距离
bool condition3 = rate < 1.5;//长度比值
bool condition4 = angle_sub >= 0 && angle_sub < 15;		//角度差
bool condition5 = fabs(rect_i.center.y - rect_j.center.y) < 0.5*fabs(rect_i.center.x - rect_j.center.x);
  • 对筛选出来的区域进行远近和角度的分析,从而得到打击目标,效果图如下:
    在这里插入图片描述

结果分析

  • 识别红色目标:

在这里插入图片描述

  • 识别蓝色目标:

在这里插入图片描述

该装甲板检测方法能够准确找到目标装甲板的位置,可以适应较多环境,对于不同角度的的目标装甲板识别有较好的识别率,即使面对反光等情况也有较好的稳定性,但是当距离较远时或者环境干扰较多时,可能会出现无法识别或者识别错误的情况。

发布了6 篇原创文章 · 获赞 12 · 访问量 671

猜你喜欢

转载自blog.csdn.net/weixin_43871310/article/details/105584650
rm