火车轨道铁路轨道检测识别(附带Python源码+详细解析)
现在的网络上,铁轨检测的源码几乎没有,所以自己参照着一篇汽车车道线检测的方法,然后调节参数,实现了铁轨的轨道检测,但现在只能检测直线,弯曲的铁轨检测下一步会实现,实现之后会更新的,敬请期待。
弯轨检测的已经实现并且检测效果不弱于直线:火车轨道铁路轨道检测识别(弯轨+直轨)通用性(Python源码+讲解)
针对现有的火车轨道检测,从汽车车道线延伸过来,用的是同样的方法可以实现火车轨道检测。
需求环境
Ubuntu16.04
python3.5
opencv3.2
原图:
效果图:
首先,是对图片的读取操作,采用的是imread函数
img = mplimg.imread("lane.jpg")
print("start to process the image....")
①灰度转换
首先是对图片进行灰度转换 cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
这里的灰度图因为有颜色让我探索了好久,后来发现imwrite之后的是没有颜色的,猜想原因应该是plt.imshow()的原因
②高斯变换
进行高斯变换,曲率选择29 cv2.GaussianBlur(gray, (blur_ksize, blur_ksize), 0, 0)
③边缘检测(Canny算子检测)
利用canny算子检测,设置好双阈值 [40,130],cv2.Canny(blur_gray, canny_lthreshold, canny_hthreshold)
④选取RIO区域
针对火车的特殊性,轨道总是出现在固定的位置,选取一个梯形的RIO区域
RIO区域如下所示:网格区域,选取出来四个角点
def roi_mask(img, vertices):#img是输入的图像,verticess是兴趣区的四个点的坐标(三维的数组)mask = np.zeros_like(img)#生成与输入图像相同大小的图像,并使用0填充,图像为黑色#defining a 3 channel or 1 channel color to fill the mask with depending on the input imageif len(img.shape) > 2:channel_count = img.shape[2] # i.e. 3 or 4 depending on your imagemask_color = (255,) * channel_count#如果 channel_count=3,则为(255,255,255)else:mask_color = 255cv2.fillPoly(mask, vertices, mask_color)#使用白色填充多边形,形成蒙板masked_img = cv2.bitwise_and(img, mask)#img&mask,经过此操作后,兴趣区域以外的部分被蒙住了,只留下兴趣区域的图像return masked_img
⑥识别两条铁轨,霍夫直线检测
针对两条铁轨不同的斜率划分出来左右,霍夫直线检测,然后将划分出来的点,进行线性拟合,绘制出两个铁轨
两条铁路的的斜率和拍摄的视角有关系,如果摄像机安装在机车的中心区域,那么两条铁轨的斜率是一正一负两个级别,可以用0来进行划分,但是因为我图片中的拍摄位置问题,两条铁路都是负斜率,所以需要界定一个中间值,大概是 -0.6左右,将两条铁轨可以完美的区别开。
def draw_lanes(img, lines, color=[255, 0, 0], thickness=8):left_lines, right_lines = [], []#用于存储左边和右边的直线for line in lines:#对直线进行分类for x1, y1, x2, y2 in line:#cv2.line(img, (x1, y1),(x2,y2), color, thickness) # 画出直线k = (y2 - y1) / (x2 - x1)if k < -7:left_lines.append(line)else:right_lines.append(line)# for line in right_lines:
# for x1,y1,x2,y2 in line:
# cv2.line(img, (x1, y1), (x2, y2), color, thickness)if (len(left_lines) <= 0 or len(right_lines) <= 0):return img# for line in left_lines: # 对直线进行分类
# for x1, y1, x2, y2 in line:
# cv2.line(img, (x1, y1), (x2, y2), color, thickness) # 画出直线#clean_lines(left_lines, 0.1)#弹出左侧不满足斜率要求的直线clean_lines(right_lines, 0.1)#弹出右侧不满足斜率要求的直线left_points = [(x1, y1) for line in left_lines for x1,y1,x2,y2 in line]#提取左侧直线族中的所有的第一个点left_points = left_points + [(x2, y2) for line in left_lines for x1,y1,x2,y2 in line]#提取左侧直线族中的所有的第二个点right_points = [(x1, y1) for line in right_lines for x1,y1,x2,y2 in line]#提取右侧直线族中的所有的第一个点right_points = right_points + [(x2, y2) for line in right_lines for x1,y1,x2,y2 in line]#提取右侧侧直线族中的所有的第二个点left_vtx = calc_lane_vertices(left_points, 700, img.shape[0])#拟合点集,生成直线表达式,并计算左侧直线在图像中的两个端点的坐标right_vtx = calc_lane_vertices(right_points, 700, img.shape[0])#拟合点集,生成直线表达式,并计算右侧直线在图像中的两个端点的坐标cv2.line(img, (left_vtx[0][0],left_vtx[0][1]), left_vtx[1], color, thickness=20)#画出直线cv2.line(img, (right_vtx[0][0]-50,right_vtx[0][1]), right_vtx[1], color, thickness=20)#画出直线#将不满足斜率要求的直线弹出
def clean_lines(lines, threshold):slope=[]for line in lines:for x1,y1,x2,y2 in line:k=(y2-y1)/(x2-x1)slope.append(k)#slope = [(y2 - y1) / (x2 - x1) for line in lines for x1, y1, x2, y2 in line]while len(lines) > 0:mean = np.mean(slope)#计算斜率的平均值,因为后面会将直线和斜率值弹出diff = [abs(s - mean) for s in slope]#计算每条直线斜率与平均值的差值idx = np.argmax(diff)#计算差值的最大值的下标if diff[idx] > threshold:#将差值大于阈值的直线弹出slope.pop(idx)#弹出斜率lines.pop(idx)#弹出直线else:break
最后,将两个图像进行叠加,输出图像
完整代码:https://github.com/Zanderzt/Rail-detection
代码调不易,star两行泪,欢迎star,感谢~
火车轨道铁路轨道检测识别(附带Python源码+详细解析)相关推荐
- 基于YOLOv5行人车辆跟踪检测识别计数系统源码+数据集,实现出/入分别计数
yolov5 deepsort 行人 车辆 跟踪 检测 计数 下载地址:基于YOLOv5行人车辆跟踪检测识别计数系统源码+数据集 实现了 出/入 分别计数. 默认是 南/北 方向检测,若要检测不同位置 ...
- Robocom比赛中使用opencv-python进行轨道线识别(附带python源码+讲解)
1.前言: 此代码是本人参加Robocom比赛中完成其中一个要求模块使用的代码.主要功能是根据给定的图片,识别出黑色轨道线的线条在图片中的大致位置.如下图所示: 比赛要求:编写代码,从200张图片中随 ...
- python 网站 源码_在线浏览美图源码,附带python源码
源码介绍 本源码由@香谢枫林 开发,首页图片做了浏览器窗口自适应,最大化占满PC浏览器和移动浏览器的窗口,并且防止出现滚动条. 源码截图 美图源码1 美图源码2 功能介绍 首页图片设置了4个点击功能区 ...
- Python源码深度解析—float空闲对象缓存池
建议将思维导图保存下来观看,或点击这里在线观看.
- Python源码深度解析—float类型对象
建议将思维导图保存下来观看,或点击这里在线观看.
- Python源码深度解析—引用计数
建议将思维导图保存下来观看,或点击这里在线观看.
- Python源码深度解析—对象的行为和多态性
建议将思维导图保存下来观看,或点击这里在线观看.
- Python源码深度解析—对象的创建
建议将思维导图保存下来观看,或点击这里在线观看.
- Python源码深度解析—Python提供的C API
今天比较忙,所以更新的较少,不过满满的都是干货啊! 建议将思维导图保存下来观看,或点击这里在线观看.
最新文章
- ES读写为何速度那么快(史上最全面总结)
- Python+django网页设计入门(5):自定义用户注册与登录功能
- Java Web学习总结(37)——Filter和Listener详解
- 【Qt串口调试助手】1.5 - 发送/接收字节数量统计
- 扩展Python模块系列(四)----引用计数问题的处理
- 镜像分割与高可用性灾难恢复
- 物流行业GPS定位应用解决方案
- JointJs快速入门
- mos管的rc吸收电路计算_RC吸收电路参数计算
- [单片机框架][bsp层][AT32F415][bsp_tim] tim定时器配置和使用
- vue 判断字符串是否是英文_Vuejs Element input组件区分中英文 统计长度
- 探索MapReduce过程及分组详解
- 求一个乘法算式采用几进制
- 妈妈说就算你注册的域名再长GOOGLE都能搜索出来,百度也有妈妈!
- 中国招聘网站调研报告
- bios和boot menu的关系?
- 专享策略02 | 商品股指通用套利策略(一)
- 狼已经一个sr闪狼已经夺人一个闪
- jvm原理解析——不疯魔不成活
- 万兆NAS存储网络组建方案