火车轨道铁路轨道检测识别(附带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 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) <= 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,感谢~

 

  • 58
    点赞
  • 187
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
基于动态图神经网络的异常流量检测python码是一个使用动态图神经网络实现的异常流量检测系统,下面是详细的说明和模型解释: 1. 项目说明: - 目标:该项目的目标是通过动态图神经网络来检测网络流量中的异常行为,以识别可能的网络攻击或异常流量情况。 - 码语言:该项目使用Python作为开发语言。 2. 详细注释: - 码中加入了详细的注释,以便开发者理解每行代码的功能和作用。 3. 模型: - 动态图神经网络(Dynamic Graph Neural Network)是一种基于图神经网络模型,用于处理动态变化的图结构。这种模型能够适应网络流量数据发生变化的情况,并根据最新的网络流量信息进行异常检测。 - 该模型基于图结构数据,其中节点表示网络中的不同主机或设备,边表示主机或设备之间的连接关系。模型将网络流量数据转换为图数据,并使用动态图神经网络来分析节点和边的特征,以检测异常行为。 - 模型的输入包括节点特征和边特征,节点特征可以是主机或设备的网络活动情况,边特征可以是节点之间的网络通信情况。 - 模型的输出是异常行为的预测结果,即对网络中每个节点的异常可能性进行预测和评分。 - 模型的训练过程包括使用已标记的正常和异常网络流量数据来训练模型,并使用交叉熵或其他损失函数来优化模型的预测能力。 总结:基于动态图神经网络的异常流量检测python码是一个使用动态图神经网络模型实现的异常流量检测系统,通过对网络流量数据进行图转换和节点、边特征分析,能够识别网络中的异常行为。码中包含详细的注释说明,有助于理解每行代码的功能和作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值