RM装甲板识别
作者:互联网
目录
装甲板检测功能
- 检测摄像头采集到的图像中目标的位置,在目标移动时保证检测的稳定性和正确性,在多个目标时,筛选出最佳打击目标并保证打击的一致性。
开发环境
Visual Studio 2017 + OpenCV3.4.5。
装甲板检测流程图
原理及操作
对于目标装甲板的识别,采取的是根据灯柱的位置来确定装甲板的位置的方法,所以准确的找到灯柱的位置是十分重要的,还要根据装甲板的特征来设定筛选条件,以此来准确定位到装甲板。因为识别时面对的情况是多种多样的,我们需要排除各种环境干扰并提高程序的鲁棒性,同时目标的快速移动也会给目标识别带来很大的挑战,这就要对算法的效率要求更加的严格。
装甲板检测算法如下:
- 先将摄像头采集到的图像转为灰度图,对灰度图进行二值化找出亮度较高的区域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);
扩大灯柱候选区域,效果图如下:
- 对灯柱候选区域进行处理,找到符合条件的灯柱。
具体实现方法:
-
使用
findContours( max_color, tmp_contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
将候选灯柱轮廓找出,效果图如下:
-
使用
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);
- 对筛选出来的区域进行远近和角度的分析,从而得到打击目标,效果图如下:
结果分析
- 识别红色目标:
- 识别蓝色目标:
该装甲板检测方法能够准确找到目标装甲板的位置,可以适应较多环境,对于不同角度的的目标装甲板识别有较好的识别率,即使面对反光等情况也有较好的稳定性,但是当距离较远时或者环境干扰较多时,可能会出现无法识别或者识别错误的情况。
标签:tmp,color,区域,灯柱,RM,识别,rect,装甲 来源: https://blog.csdn.net/weixin_43871310/article/details/105584650