识别装甲板
#识别装甲板
整体思路如下:
- 图像预处理:
- 选取颜色通道阈值区间
- 形态学操作
- 边缘检测
- 筛选矩形:
- 查找合适灯条,注意两两灯条之间的距离,是否垂直,角度问题(因为车在转的时候不同侧的灯条容易被错误识别为装甲板)
- 筛选除去部分矩形(有些灯条组合需要删除)
- 识别装甲板:
- 绘图(远距离,近距离分别处理)
- 判断是否是装甲板:
- 遍历所有矩形,两两组合判断
##具体实现方法
方法一:hsv色彩分离
- 输入视频帧,读取每一帧图像
- 颜色空间转换 BGR → HSV
- 颜色阈值分割
- 设定蓝色阈值范围(lower_blue,upper_blue)
- 使用cv2.inRange()提取蓝色区域
- 形态学处理
- 结构元素(3x3矩形核)
- 开运算:去噪点
- 闭运算:填充小孔
- 轮廓提取
- cv2.findContours()检测外轮廓
- 灯条筛选
- 计算轮廓外接矩形 (x, y, w, h)
- 过滤:宽高比例 h/w > 3
- 过滤:轮廓面积 > 50
- 灯条配对
- 遍历所有灯条两两组合
- 过滤条件:
- 高度差 < 20% 最大高度
- 灯条中心纵坐标差 < 最大高度50%
- 中心横向距离在 0.5~5 倍最大高度范围内
- 装甲板绘制
- 根据配对灯条计算矩形框
- 绘制红色矩形标记
- 结果显示与退出
- cv2.imshow展示
- 按q退出循环
方法二:通道相减法(但是未使用)
- 第一步:图像的预处理,从RGB的角度考虑去识别蓝色灯条,也就是说如果蓝色通道的分量要比 其他两个通道都要大,就能说明物体足够蓝,因此一般选择蓝色通道减去红色通道,经过此番操作后, 会发现原图中的蓝色区域仍然有着较高的亮度。
- 第二步:二值化并取交集,以根据不同的阈值得到不同效果的图片进行不断地调整最后得到一个 最优的阈值
- 第三步:形态学操作,先用滤波过滤图像,然后一般可以使用闭操作,先膨胀后腐蚀,来增强轮廓的表现。
- 第四步:寻找轮廓并筛选拟合出的对象
利弊分析与整合(detect.py)
在实际操作中,我发现在近距离使用hsv色彩空间的效果比较好,可能是因为近距离的灯条比较明显,远距离下 灯条的亮度比较暗,使用bgr色彩空间的效果比较好,虽然牺牲了一部分的识别准确率,但是提高了识别的准确率 是真的,然后我分了两个不同的部分进行处理,也就是远距离和近距离采取的方法不同,不同之处见下:
- 近距离检测(detect_near_distance):
- 转为 HSV,设定蓝色阈值提取 mask
- 提取轮廓,筛选为灯条
- 成对配对灯条,构成装甲板候选对
- 远距离检测(detect_far_distance):
- 提取蓝色通道,并二值化
- 模糊、膨胀、开闭运算增强连通区域
- 拟合椭圆
- 两两椭圆进行配对,限制角度、长度、距离、斜率等条件
- 对配对结果使用NMS进行过滤去重
整体代码:
import cv2
import numpy as np#创建灯条类对象
c