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

弯轨检测的已经实现并且检测效果不弱于直线:火车轨道铁路轨道检测识别(弯轨+直轨)通用性(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源码+详细解析)相关推荐

  1. 基于YOLOv5行人车辆跟踪检测识别计数系统源码+数据集,实现出/入分别计数

    yolov5 deepsort 行人 车辆 跟踪 检测 计数 下载地址:基于YOLOv5行人车辆跟踪检测识别计数系统源码+数据集 实现了 出/入 分别计数. 默认是 南/北 方向检测,若要检测不同位置 ...

  2. Robocom比赛中使用opencv-python进行轨道线识别(附带python源码+讲解)

    1.前言: 此代码是本人参加Robocom比赛中完成其中一个要求模块使用的代码.主要功能是根据给定的图片,识别出黑色轨道线的线条在图片中的大致位置.如下图所示: 比赛要求:编写代码,从200张图片中随 ...

  3. python 网站 源码_在线浏览美图源码,附带python源码

    源码介绍 本源码由@香谢枫林 开发,首页图片做了浏览器窗口自适应,最大化占满PC浏览器和移动浏览器的窗口,并且防止出现滚动条. 源码截图 美图源码1 美图源码2 功能介绍 首页图片设置了4个点击功能区 ...

  4. Python源码深度解析—float空闲对象缓存池

    建议将思维导图保存下来观看,或点击这里在线观看.

  5. Python源码深度解析—float类型对象

    建议将思维导图保存下来观看,或点击这里在线观看.

  6. Python源码深度解析—引用计数

    建议将思维导图保存下来观看,或点击这里在线观看.

  7. Python源码深度解析—对象的行为和多态性

    建议将思维导图保存下来观看,或点击这里在线观看.

  8. Python源码深度解析—对象的创建

    建议将思维导图保存下来观看,或点击这里在线观看.

  9. Python源码深度解析—Python提供的C API

    今天比较忙,所以更新的较少,不过满满的都是干货啊! 建议将思维导图保存下来观看,或点击这里在线观看.

最新文章

  1. ES读写为何速度那么快(史上最全面总结)
  2. Python+django网页设计入门(5):自定义用户注册与登录功能
  3. Java Web学习总结(37)——Filter和Listener详解
  4. 【Qt串口调试助手】1.5 - 发送/接收字节数量统计
  5. 扩展Python模块系列(四)----引用计数问题的处理
  6. 镜像分割与高可用性灾难恢复
  7. 物流行业GPS定位应用解决方案
  8. JointJs快速入门
  9. mos管的rc吸收电路计算_RC吸收电路参数计算
  10. [单片机框架][bsp层][AT32F415][bsp_tim] tim定时器配置和使用
  11. vue 判断字符串是否是英文_Vuejs Element input组件区分中英文 统计长度
  12. 探索MapReduce过程及分组详解
  13. 求一个乘法算式采用几进制
  14. 妈妈说就算你注册的域名再长GOOGLE都能搜索出来,百度也有妈妈!
  15. 中国招聘网站调研报告
  16. bios和boot menu的关系?
  17. 专享策略02 | 商品股指通用套利策略(一)
  18. 狼已经一个sr闪狼已经夺人一个闪
  19. jvm原理解析——不疯魔不成活
  20. 万兆NAS存储网络组建方案

热门文章

  1. 本题要求按照规定格式打印前N行杨辉三角。
  2. 右下角部分图标不显示
  3. mysql delete 级联删除_MySQL级联删除和更新
  4. openwrt移植LTE模块
  5. Vue在build编译时写在style中的路径问题
  6. Sharding-Sphere 3.X万众瞩目登场,如约而至!
  7. 杨式太极拳腿功练习方法
  8. UnityAnimator游戏运行后动画不播放
  9. Linux查看运行的进程IP
  10. IDEA导出jar包的各种问题--解决