直线道路线通过霍夫变换进行识别并画出

最近在研究高速直线识别,搜了一圈看了很多文章,确定了以下的主要流程。
主要流程

霍夫变换

lines = cv2.HoughLinesP(image,rho,theta,threshold,lines,minLineLength,maxLineGap)#概率霍夫变换
image:必须是二值图像,推荐使用canny边缘检测的结果图像。
rho:线段以像素为单位的距离紧固带,double类型,推荐使用2.0 距离分辨率,表示以像素为单位的距离精度,参数越高线段越多。
theta:线段以弧度为单位的角度精度,推荐使用numpy.pi/180。
threshod:累加平面的阈值参数,int类型,超过设定的阈值才会被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先试用100在逐步调整。
lines:可选参数,用于存储检测到的直线的输出数组。返回即为存储图中所有直线的数组。
minLineLength:线段以像素为单位的最小长度,低于这个长度的线段将不会显示,根据应用场景设置。
maxLineGap:同一方向上两条线段判定为一条线段的最大允许间隔,小于这个最大值,都认为是一条线段。

def hough_lines(img, rho, theta, threshold,min_line_len, max_line_gap):  #进行霍夫变换lines = cv2.HoughLinesP(img, rho, theta, threshold, np.array([]),minLineLength=min_line_len,maxLineGap=max_line_gap)  #概率霍夫变换line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8) #整一个黑底图片,展示画的线#print(lines)draw_lines(line_img, lines) #将底图和直线数组传入draw_lines进行画线return line_img #返回画好的图片

整体代码

# coding:utf-8import cv2
import numpy as np
import os
import numpydef gauss_blur(img):  #高斯滤波blur_ksize = 5  # Gaussian blur kernel sizeblur_gray = cv2.GaussianBlur(gray, (blur_ksize, blur_ksize), 0, 0)return blur_graydef canny_edgedet(blur_gray): #canny 边缘检测# Define our parameters for Canny and applylow_threshold = 250high_threshold = 320edges = cv2.Canny(blur_gray, low_threshold, high_threshold)return edgesdef ROI_filtering(edges):  #选择需要的区域# Next we'll create a masked edges image using cv2.fillPoly()mask = np.zeros_like(edges)ignore_mask_color = 255# This time we are defining a four sided polygon to mask#imshape = image.shapevertices = np.array([[(30, 300), (220, 200), (400, 80), (860, 300)]], dtype=np.int32)cv2.fillPoly(mask, vertices, ignore_mask_color)masked_edges = cv2.bitwise_and(edges, mask)return masked_edgesdef draw_lines(img, lines, color=[255, 0, 0], thickness=2):  #画线x1_list = []lines_list = lines.tolist()#按照线段start x1坐标进行删除重复坐标#print(lines_list)# for line in lines_list:#     x1_list.append(line[0][0])# #print(x1_list)# for lin in lines_list:#     for i in x1_list:#         if abs(int(line[0][0]) - i) <= 30 and abs(int(line[0][0]) - i) != 0:#             #print(lin)#             lines_list.remove(lin)# #print(lines_list)# print(len(lines_list))#延长直线for line in lines_list:x1 = int(line[0][0])  # 以(x0, y0)为起点,将线段延长y1 = int(line[0][1])x2 = int(line[0][2])y2 = int(line[0][3])# 延长直线#定义起点和终点start_point = (x2,y2)end_point = (x1,y1)#计算线条的方向和长度direction = np.subtract(end_point, start_point)length = np.linalg.norm(direction)#设置延长线的长度因子extension_factor = 200#计算延长线的起点extended_start_point = tuple(np.subtract(start_point, extension_factor * direction / length).astype(int))# 计算延长线的终点extended_end_point = tuple(np.add(end_point, extension_factor * direction / length).astype(int))#画线cv2.line(img, extended_start_point, extended_end_point, color, thickness)#cv2.line(img, (x1, y1), (x2, y2), color, thickness)#print('type(lines_list)',type(lines_list))# for line in lines_list:#     for x3, y3, x4, y4 in line:#         x1_list.append(x3)# for line in lines_list:#     for x1, y1, x2, y2 in line:#         print(type(line))#         print(x1_list)#         for i in x1_list:#             #print(abs(int(x1) - i))#             if abs(int(x1) - i) <= 120:#                 pass#                 #numpy.delete(lines, line, axis=None)# print(lines)#                 #cv2.line(img, (x1, y1), (x2, y2), color, thickness)def hough_lines(img, rho, theta, threshold,min_line_len, max_line_gap):  #进行霍夫变换# cv2.HoughLinesP(image,rho,theta,threshold,lines,minLineLength,maxLineGap)# image:必须是二值图像,推荐使用canny边缘检测的结果图像# rho:线段以像素为单位的距离紧固带,double类型,推荐使用1.0 距离分辨率,表示以像素为单位的距离精度# theta:线段以弧度为单位的角度精度,推荐使用numpy.pi/180# threshod:累加平面的阈值参数,int类型,超过设定的阈值才会被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先试用100# lines:可选参数,用于存储检测到的直线的输出数组。# minLineLength:线段以像素为单位的最小长度,根据应用场景设置# maxLineGap:同一方向上两条线段判定为一条线段的最大允许间隔,小于这个最大值,都认为是一条线段lines = cv2.HoughLinesP(img, rho, theta, threshold, np.array([]),minLineLength=min_line_len,maxLineGap=max_line_gap)  #概率霍夫变换line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8)#print(lines)draw_lines(line_img, lines)return line_imgdef weighted_img(img, initial_img, α=0.7, β=1., λ=0.):return cv2.addWeighted(img, α, initial_img, β, λ)   #将画线图和原图重合if __name__=='__main__':img_path = './img/1c.png' #图片位置img = cv2.imread(img_path) #读取原图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #将原图转换成灰度图blur_gray = gauss_blur(gray) #高斯滤波canny_img = canny_edgedet(blur_gray)# cv2.imshow('img',masked_edges)  #canny边缘检测和非极大值抑制# cv2.waitKey(0)# cv2.destroyAllWindows()# 霍夫变换的参数,这个是我测试最符合我的参数,详细作用看第97行rho = 3theta = np.pi / 180threshold = 180min_line_length = 80max_line_gap = 2000line_img = hough_lines(canny_img, rho, theta, threshold,min_line_length, max_line_gap)mix = weighted_img(line_img, img, α=0.7, β=1., λ=0.)cv2.imshow('img', mix)cv2.waitKey(0)cv2.destroyAllWindows()

这是原图
在这里插入图片描述

这是画线图
在这里插入图片描述

这是最终效果
在这里插入图片描述

有待改进
1、目前没有直线拟合函数,用过很多都有问题,还需突破。
2、与YOLOv5识别进行结合,检测车辆越线别车或非法变道、占用应急车道等违法违规行为。

参考文章:
视觉无人机高速公路违章检测之——车道线检测
OpenCV-Python 霍夫直线检测-HoughLinesP函数参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/702748.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统—锁机制的应用(实验)

文章目录 锁机制的应用1.实验目标2.实验过程记录(1).阅读kernel/kalloc.c(2).理解xv6的自旋锁工作原理(3).阅读kernel/bio.c(4).阅读kernel/sleeplock.c(5).重新设计内存分配器(6).重新设计磁盘缓存 3.问题及解决方案问题1问题2问题3 实验小结 锁机制的应用 1.实验目标 基于xv…

【稀疏三维重建】pixelSplat:仅需两张图像的3D Gaussian Splats重建

文章目录 一.摘要二、相关工作 , 背景(gs)三、基于图像的三维高斯预测3.1 双视图图像编码器&#xff08;解决尺度模糊性&#xff09;3.2 &#xff08;像素对齐的&#xff09;高斯参数预测 四、实验效果 论文&#xff1a;《pixelSplat: 3D Gaussian Splats from Image Pairs for…

天锐绿盾 | 如何防止电脑内文件遭到泄露?

天锐绿盾是一款专为企业设计的数据防泄漏软件系统&#xff0c;它通过一系列综合性的安全措施来有效防止电脑内文件遭到泄露。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是天锐绿盾防止文件泄露的主要功能和方法&a…

01.认识HTML及常用标签

目录 URL&#xff08;统一资源定位系统&#xff09; HTML&#xff08;超文本标记语言&#xff09; 1&#xff09;html标签 2&#xff09;head标签 3&#xff09;title标签 4&#xff09;body标签 标签的分类 DTD文档声明 基础标签 1&#xff09;H系列标签 2&#xff09…

【高阶数据结构】图--最短路径问题

图--最短路径问题 一、单源最短路径--Dijkstra算法1、简介2、解析3、代码4、测试用例5、打印最小路径代码和测试6、缺陷&#xff1a;不能使用负路径 二、单源最短路径--Bellman-Ford算法1、简介2、解析&#xff08;1&#xff09;详情i、负权问题&#xff1a;一个点只跑一趟找最…

CST电磁仿真软件远场变更和结果相关【从入门到精通】

1、使用阵列系数计算阵列远场结果 对单一天线进行 仿真分析后&#xff0c;查看反映阵列系数的远场结果&#xff01; Navigation Tree > Farfields > Selection > Farfield Plot > Array Factor 下面介绍一下&#xff0c;对单一天线进行仿真后&#xff0c;轻松计…

股指期货基差衡量的是什么?

在股指期货市场中&#xff0c;基差、升水和贴水是三个关键的术语&#xff0c;这些基差衡量的是现货市场的价格与期货市场的价格之间的差异。 一、基差&#xff1a;现货与期货的价差 1. 定义&#xff1a;基差是指现货价格与相应期货合约价格之间的差额。计算方式是现货价格减去…

「Python绘图」绘制奥运五环

python 绘制奥运五环 一、预期结果 二、核心代码 import turtle print("开始绘制奥运五环")# 创建Turtle对象 pen turtle.Turtle() pen.shape("turtle") pen.pensize(8)print("绘制蓝色圆") pen.up() pen.goto(50-170,0) pen.down() pen.color…

【千帆AppBuidler】零代码构建AI人工智能应用,全网都在喊话歌手谁能应战,一键AI制作歌手信息查询应用

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景创建应用平台地址随机生成快速创建应用头像应用名称应用描述…

【全开源】JAVA红娘婚恋相亲交友系统源码支持微信小程序+微信公众号+H5+APP

红娘婚恋相亲交友系统&#xff1a;遇见你的命中注定 在快节奏的现代生活中&#xff0c;许多单身男女都在寻找一个平台&#xff0c;希望能遇见那个能与自己携手共度一生的伴侣。红娘婚恋相亲交友系统正是为了满足这一需求而诞生的&#xff0c;它旨在为广大单身男女提供一个安全…

20240514基于深度学习的弹性超材料色散关系预测与结构逆设计

论文&#xff1a;Dispersion relation prediction and structure inverse design of elastic metamaterials via deep learning DOI&#xff1a;https://doi.org/10.1016/j.mtphys.2022.100616 1、摘要 精心设计的超材料结构给予前所未有的性能&#xff0c;保证了各种各样的具…

Java(二)——方法与数组

文章目录 方法与数组方法方法的定义方法的执行实参与形参方法重载方法签名 数组创建与初始化数组的类型数组应用转字符串排序查找&#xff08;二分&#xff09;填充拷贝判等 二维数组创建及初始化遍历本质和内存分布不规则二维数组 方法与数组 方法 什么是方法&#xff1f; …