火车轨道铁路轨道检测识别(附带Python源码+详细解析) 您所在的位置:网站首页 高铁运行轨迹视频大全 火车轨道铁路轨道检测识别(附带Python源码+详细解析)

火车轨道铁路轨道检测识别(附带Python源码+详细解析)

2024-06-19 06:37| 来源: 网络整理| 查看: 265

    现在的网络上,铁轨检测的源码几乎没有,所以自己参照着一篇汽车车道线检测的方法,然后调节参数,实现了铁轨的轨道检测,但现在只能检测直线,弯曲的铁轨检测下一步会实现,实现之后会更新的,敬请期待。    

    弯轨检测的已经实现并且检测效果不弱于直线:火车轨道铁路轨道检测识别(弯轨+直轨)通用性(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 image if len(img.shape) > 2: channel_count = img.shape[2] # i.e. 3 or 4 depending on your image mask_color = (255,) * channel_count#如果 channel_count=3,则为(255,255,255) else: mask_color = 255 cv2.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) threshold:#将差值大于阈值的直线弹出 slope.pop(idx)#弹出斜率 lines.pop(idx)#弹出直线 else: break

    

    最后,将两个图像进行叠加,输出图像

   

    完整代码:https://github.com/Zanderzt/Rail-detection

   代码调不易,star两行泪,欢迎star,感谢~

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有