智慧交通day03-车道线检测实现05:透视变换+代码实现

为了方便后续的直方图滑窗对车道线进行准确的定位,我们在这里利用透视变换将图像转换成俯视图,也可将俯视图恢复成原有的图像,代码如下:

计算透视变换所需的参数矩阵:

def cal_perspective_params(img, points):offset_x = 330offset_y = 0img_size = (img.shape[1], img.shape[0])src = np.float32(points)# 俯视图中四点的位置dst = np.float32([[offset_x, offset_y], [img_size[0] - offset_x, offset_y],[offset_x, img_size[1] - offset_y],[img_size[0] - offset_x, img_size[1] - offset_y]])# 从原始图像转换为俯视图的透视变换的参数矩阵M = cv2.getPerspectiveTransform(src, dst)# 从俯视图转换为原始图像的透视变换参数矩阵M_inverse = cv2.getPerspectiveTransform(dst, src)return M, M_inverse

透视变换:

def img_perspect_transform(img, M):img_size = (img.shape[1], img.shape[0])return cv2.warpPerspective(img, M, img_size)

下面我们调用上述两个方法看下透视变换的结果:

在原始图像中我们绘制道路检测的结果,然后通过透视变换转换为俯视图。

img = cv2.imread("./test/straight_lines2.jpg")
img = cv2.line(img, (601, 448), (683, 448), (0, 0, 255), 3)
img = cv2.line(img, (683, 448), (1097, 717), (0, 0, 255), 3)
img = cv2.line(img, (1097, 717), (230, 717), (0, 0, 255), 3)
img = cv2.line(img, (230, 717), (601, 448), (0, 0, 255), 3)
points = [[601, 448], [683, 448], [230, 717], [1097, 717]]
M, M_inverse = cal_perspective_params(img, points)
transform_img = img_perspect_transform(img, M)
plt.figure(figsize=(20,8))
plt.subplot(1,2,1)
plt.title('原始图像')
plt.imshow(img[:,:,::-1])
plt.subplot(1,2,2)
plt.title('俯视图')
plt.imshow(transform_img[:,:,::-1])
plt.show()


总结:

透视变换将检测结果转换为俯视图。


代码:

# encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
#遍历文件夹
import glob
from moviepy.editor import VideoFileClip
import sys
reload(sys)
sys.setdefaultencoding('utf-8')"""参数设置"""
nx = 9
ny = 6
#获取棋盘格数据
file_paths = glob.glob("./camera_cal/calibration*.jpg")# 绘制对比图
def plot_contrast_image(origin_img, converted_img, origin_img_title="origin_img", converted_img_title="converted_img",converted_img_gray=False):fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 20))ax1.set_title = origin_img_titleax1.imshow(origin_img)ax2.set_title = converted_img_titleif converted_img_gray == True:ax2.imshow(converted_img, cmap="gray")else:ax2.imshow(converted_img)plt.show()#相机矫正使用opencv封装好的api
#目的:得到内参、外参、畸变系数
def cal_calibrate_params(file_paths):#存储角点数据的坐标object_points = [] #角点在真实三维空间的位置image_points = [] #角点在图像空间中的位置#生成角点在真实世界中的位置objp = np.zeros((nx*ny,3),np.float32)#以棋盘格作为坐标,每相邻的黑白棋的相差1objp[:,:2] = np.mgrid[0:nx,0:ny].T.reshape(-1,2)#角点检测for file_path in file_paths:img = cv2.imread(file_path)#将图像灰度化gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#角点检测rect,coners = cv2.findChessboardCorners(gray,(nx,ny),None)#若检测到角点,则进行保存 即得到了真实坐标和图像坐标if rect == True :object_points.append(objp)image_points.append(coners)# 相机较真ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, gray.shape[::-1], None, None)return ret, mtx, dist, rvecs, tvecs# 图像去畸变:利用相机校正的内参,畸变系数
def img_undistort(img, mtx, dist):dis = cv2.undistort(img, mtx, dist, None, mtx)return dis#车道线提取
#颜色空间转换--》边缘检测--》颜色阈值--》并且使用L通道进行白色的区域进行抑制
def pipeline(img,s_thresh = (170,255),sx_thresh=(40,200)):# 复制原图像img = np.copy(img)# 颜色空间转换hls = cv2.cvtColor(img,cv2.COLOR_RGB2HLS).astype(np.float)l_chanel = hls[:,:,1]s_chanel = hls[:,:,2]#sobel边缘检测sobelx = cv2.Sobel(l_chanel,cv2.CV_64F,1,0)#求绝对值abs_sobelx = np.absolute(sobelx)#将其转换为8bit的整数scaled_sobel = np.uint8(255 * abs_sobelx / np.max(abs_sobelx))#对边缘提取的结果进行二值化sxbinary = np.zeros_like(scaled_sobel)#边缘位置赋值为1,非边缘位置赋值为0sxbinary[(scaled_sobel >= sx_thresh[0]) & (scaled_sobel <= sx_thresh[1])] = 1#对S通道进行阈值处理s_binary = np.zeros_like(s_chanel)s_binary[(s_chanel >= s_thresh[0]) & (s_chanel <= s_thresh[1])] = 1# 结合边缘提取结果和颜色通道的结果,color_binary = np.zeros_like(sxbinary)color_binary[((sxbinary == 1) | (s_binary == 1)) & (l_chanel > 100)] = 1return color_binary#透视变换-->将检测结果转换为俯视图。
#获取透视变换的参数矩阵【二值图的四个点】
def cal_perspective_params(img,points):# x与y方向上的偏移offset_x = 330offset_y = 0#转换之后img的大小img_size = (img.shape[1],img.shape[0])src = np.float32(points)#设置俯视图中的对应的四个点 左上角 右上角 左下角 右下角dst = np.float32([[offset_x, offset_y], [img_size[0] - offset_x, offset_y],[offset_x, img_size[1] - offset_y], [img_size[0] - offset_x, img_size[1] - offset_y]])## 原图像转换到俯视图M = cv2.getPerspectiveTransform(src, dst)# 俯视图到原图像M_inverse = cv2.getPerspectiveTransform(dst, src)return M, M_inverse#根据透视变化矩阵完成透视变换
def img_perspect_transform(img,M):#获取图像大小img_size = (img.shape[1],img.shape[0])#完成图像的透视变化return cv2.warpPerspective(img,M,img_size)if __name__ == "__main__":#透视变换#获取原图的四个点img = cv2.imread('./test/straight_lines2.jpg')points = [[601, 448], [683, 448], [230, 717], [1097, 717]]#将四个点绘制到图像上 (文件,坐标起点,坐标终点,颜色,连接起来)img = cv2.line(img, (601, 448), (683, 448), (0, 0, 255), 3)img = cv2.line(img, (683, 448), (1097, 717), (0, 0, 255), 3)img = cv2.line(img, (1097, 717), (230, 717), (0, 0, 255), 3)img = cv2.line(img, (230, 717), (601, 448), (0, 0, 255), 3)plt.figure()#反转CV2中BGR 转化为matplotlib的RGBplt.imshow(img[:, :, ::-1])plt.title("Original drawing")plt.show()#透视变换M,M_inverse = cal_perspective_params(img,points)if np.all(M != None):trasform_img = img_perspect_transform(img, M)plt.figure()plt.imshow(trasform_img[:, :, ::-1])plt.title("vertical view")plt.show()else:print("failed")

效果图:

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

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

相关文章

李宏毅老师ML_HW1——PM2.5预测

处理数据之前的pre-process 观察下载的数据文件train.csv train.csv只有每个月前20天的数据&#xff0c;另外每个月剩下10天数据用于作业结果评估&#xff0c;对学生不可见 观察数据发现rainfall栏有很多NR表示没有降雨&#xff0c;但是我们只需要数字&#xff0c;因此可以使用…

“员工请假”流程及在线表单开发示例

1. “员工请假”流程及在线表单开发示例 1.1. 描述 通过本示例达到快速对F2流程管理平台的在线表单速讯上手及零编码式的开发。实现一个以请假为示例的流程及在线表单&#xff0c;及请假数据的查询。 1.2. 目标效果 &#xff08;1&#xff09; 如何配置一个“请假在线表单” &a…

【Pytorch神经网络基础理论篇】 03 数据操作 + 数据预处理

同学你好&#xff01;本文章于2021年末编写&#xff0c;已与实际存在较大的偏差&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)…

git版本控制系统常用指令,Xmind笔记整理

git仓库使用、项目版本管理基本常用指令 纯手工整理Xmind笔记&#xff1a; 点我下载 预览图&#xff1a; Png&#xff1a; 如有错误&#xff0c;谢谢指出

Spark学习(一) -- Spark安装及简介

标签&#xff08;空格分隔&#xff09;&#xff1a; Spark 学习中的知识点&#xff1a;函数式编程、泛型编程、面向对象、并行编程。 任何工具的产生都会涉及这几个问题&#xff1a; 现实问题是什么&#xff1f;理论模型的提出。工程实现。思考&#xff1a; 数据规模达到一台机…

Django基本概念、安装、配置到实现框架,Xmind学习笔记

Django从安装、配置到实现简单web框架的基本操作流程 纯手工Xmind笔记整理&#xff1a; 点我下载 预览图&#xff1a; 如有错误&#xff0c;谢谢指出

智慧交通day03-车道线检测实现06:车道线定位及拟合+代码实现

学习目标 了解直方图确定车道线位置的思想我们根据前面检测出的车道线信息&#xff0c;利用直方图和滑动窗口的方法&#xff0c;精确定位车道线&#xff0c;并进行拟合。 1. 定位思想 下图是我们检测到的车道线结果&#xff1a; 沿x轴方向统计每一列中白色像素点的个数&…

USB驱动程序

1、USB驱动程序存在于不同的内核子系统(块设备、网络设备、字符设备等等)和USB主控制器之中。 2、USB核心为USB驱动程序提供了一个用于访问和控制USB硬件的接口,而不必考虑系统当前存在的各种不同类型的USB硬件控制器。 2.1 USB里的设备模型 Linux里一个很重要的概念是设备…

TemplateSyntaxError at XXXX或页面样式未生效

报错TemplateSyntaxError at或页面样式未生效 直观原因就是模板的语法有误&#xff0c;造成这一原因的根源是使用pycharm&#xff08;idea&#xff09;的自动注释&#xff0c;而pycharm没有装django配置&#xff0c;ctrl/时会将block中的内容用html注释<!—>包围内容 对…

智慧交通day03-车道线检测实现07:车道曲率和中心点偏离距离计算+代码实现

学习目标 知道车道曲率计算的方法知道计算中心点偏离距离的计算1.曲率的介绍 曲线的曲率就是针对曲线上某个点的切线方向角对弧长的转动率&#xff0c;通过微分来定义&#xff0c;表明曲线偏离直线的程度。数学上表明曲线在某一点的弯曲程度的数值。曲率越大&#xff0c;表示…

智慧交通day03-车道线检测实现08: 在离线视频(非实时)中检测车道线+代码实现

学习目标 了解在视频中检测车道线的方法在前面几节中一步步完成摄像机标定、图像畸变校正、透视变换、提取车道线、检测车道线、计算曲率和偏离距离后&#xff0c;在图像上实现了复杂环境下的车道线检测算法。现在我们将视频转化为图片&#xff0c;然后一帧帧地对视频数据进行处…

Django 模板实现(动态)图片/头像展示到页面

Django 模板实现&#xff08;动态&#xff09;图片作头像展示到页面 在网上搜了加载图片到前端的解决方法&#xff0c;大多都比较复杂&#xff0c;要引用PIL&#xff0c;下载Cropper插件&#xff08;可以用于裁图&#xff09;之类的&#xff0c;下面是一个简单易懂的方法实现&…

Django之验证码的实现,简单快捷的方法

Django之验证码的实现&#xff0c;简单快捷的方法 实现验证码随网页变动即时刷新&#xff0c;实现有期限时间 请确保安装好pillow 直接show code&#xff1a; 0、路由urs.py from django.urls import path, re_path from . import views urlpatterns [re_path(r^test/$, vie…

智慧交通day04-特定目标车辆追踪01:总览概述

项目介绍&#xff1a; 运动目标跟踪一直以来都是一项具有挑战性的工作, 也是研究的热点方向. 现阶段, 随着硬件设施 的不断完善和人工智能技术的快速发展, 运动目标跟踪技术越来越重要. 目标跟踪在现实生活中有很 多应用, 包括交通视频监控、运动员比赛分析、智能人机交互 、跟…

智慧交通day04-特定目标车辆追踪02:Siamese网络+单样本学习

1.Siamese网络 Siamese network就是“连体的神经网络”&#xff0c;神经网络的“连体”是通过共享权值来实现的&#xff0c;如下图所示。共享权值意味着两边的网络权重矩阵一模一样&#xff0c;甚至可以是同一个网络。 如果左右两边不共享权值&#xff0c;而是两个不同的神经网…

CSS如何实现两个a标签元素的文字一个靠左一个靠右,并且能点击分别不同的链接

CSS如何实现两个a标签元素的文字一个靠左一个靠右&#xff0c;并且能点击分别不同的链接 作为一个非专业前端&#xff0c;有时候开发又必须自己写一些简单的前端&#xff0c;在网上有时候不能及时查找到内容&#xff0c;只能自己尝试&#xff0c;如下是实现两个span中的a标签下…

智慧交通day04-特定目标车辆追踪03:siamese在目标跟踪中的应用-SiamFC(2016)

目标追踪任务是指在一个视频中给出第一帧图像的bbox的位置&#xff0c;在后续的帧中追踪该物体的任务。 目标追踪不同于目标检测的是&#xff1a; 1、需要给出首帧的标定框。 2、只需要给出标定框&#xff0c;后续的搜索范围往往在上一帧图像的附近。 孪生网络是使用深度学习…

word-break|overflow-wrap|word-wrap——CSS英文断句浅析

---恢复内容开始--- word-break|overflow-wrap|word-wrap——CSS英文断句浅析 一 问题引入 今天在再次学习 overflow 属性的时候&#xff0c;查看效果时&#xff0c;看到如下结果&#xff0c;内容在 div 中国换行了&#xff0c;可是两个 P 元素的内容并没有换行&#xff0c;搜索…

智慧交通day04-特定目标车辆追踪03:siamese在目标跟踪中的应用-SiamRPN(2017)

3.2 SiamRPN(2017) 3.2.1 网络结构 Siam-RPN提出了一种基于RPN的孪生网络结构&#xff0c;由孪生子网络和RPN网络组成&#xff0c;前者用来提取特征&#xff0c;后者用来产生候选区域。其中&#xff0c;RPN子网络由两个分支组成&#xff0c;一个是用来区分目标和背景的分类分…

ubuntu 18 Cannot find installed version of python-django or python3-django.

ubuntu系统下安装了django&#xff0c;但是启动django项目时报错 Cannot find installed version of python-django or python3-django. 原因&#xff1a; ubuntu大于14版本的应该安装python3-django 解决办法&#xff1a; apt-get install python3-django 如果提示你有几个…