基于python实现车辆测速两种的方法

  • 姓名:黄镜轩

  • 院系:机电工程学院

  • 班级:车辆工程1班

  • 联系方式:QQ - 3326078070

    本文参考了:

    案例-使用python实现基于opencv的车辆识别:(https://blog.csdn.net/qq_33392383/article/details/122681242)


车辆的两种测速方法

车辆的测速方法主要分为外部物理量法和内部检测法两种。本文将介绍这两种方法,并结合实际的代码实现进行讲解,以便更好地理解车辆测速的原理和方法。

内部检测法

内部检测法是指借助车载传感器和计算机等设备,通过分析车辆的内部参数来估算车辆的速度。过去老式的车辆是通过机械结构通过仪表盘实现车辆速度的输出。而如今的高端汽车已经采用电子的方法通过机械机构的传感器实现车速的计算。下列代码正是采用通过传感器采集的参数计算车速的方法来计算车速:

chuanganqicesu.py
```
import math
```
该行代码引入Python中的数学库,以便后面使用的数学函数。```
def calculate_speed():
```
该行定义了一个名为`calculate_speed()`的函数,用于计算车辆的速度和误差。```print("请输入以下参数:")engine_speed = float(input("发动机转速(rpm):"))transmission_gear_ratio = float(input("变速器齿轮比:"))tire_radius = float(input("轮胎半径(m):"))axle_ratio = float(input("差速器齿轮比:"))vehicle_speed_signal = float(input("车速信号(km/h):"))
```
该程序先提示用户输入相应的参数,然后通过`input()`函数读取用户输入,并将其转换成浮点数类型。```rolling_radius = tire_radius * 1000 / 2.54 / 2
```
该行计算轮胎滚动半径,将输入的轮胎半径由英寸单位转换为米单位,并除以二得到轮胎滚动半径。```wheel_speed = engine_speed * transmission_gear_ratio * 60 / (2 * math.pi * axle_ratio)
```
该行计算车轮的实际转速,根据输入的发动机转速、变速器齿轮比和差速器齿轮比等参数利用一些物理公式计算出车轮的实际转速。```vehicle_speed_kph = wheel_speed * rolling_radius * 3.6
```
该行计算车辆的整体速度,将车轮实际转速乘上轮胎滚动半径和系数3.6得到车辆的整体速度(单位:公里/小时)。```error = abs(vehicle_speed_signal - vehicle_speed_kph)
```
该行计算速度误差,取计算得到的车辆速度与输入的车速信号之差的绝对值作为误差。```print("计算得到的速度为:{0:.2f}km/h,与车速信号相差{1:.2f}km/h".format(vehicle_speed_kph, error))
```
该行输出计算得到的车辆速度和误差,其中`{0:.2f}`和`{1:.2f}`表示格式化输出两个浮点数类型变量,分别保留两位小数。```
if __name__ == "__main__":calculate_speed()
```
该行代码用于判断当前模块是否是主程序入口,如果是则执行`calculate_speed()`函数以进行车速计算。

这个程序需要用户输入发动机转速、变速器齿轮比等参数,然后根据一些物理公式计算出车辆的速度。这种方法适用于需要高精度测量的场景,但需要一定的专业技能和设备。

外部物理量法

外部物理量法是指测量车辆周围环境的物理量来估算车辆的速度,常见的有雷达、激光等方法。这种方法通常需要专业的设备和技术支持,适用于一些特殊的场景,例如交通管理、安全监测等领域。

下面是一个基于OpenCV库的视频测速程序示例,代码如下:

shexiangtoucesu.py
```
import cv2
import numpy as np
```
导入OpenCV和Numpy库。```
cap = cv2.VideoCapture('video.mp4')
```
创建一个`VideoCapture`对象,读取给定路径下的视频文件。```
roi_x1, roi_y1, roi_x2, roi_y2 = 300, 400, 500, 600
```
设置感兴趣区域(ROI),定义ROI的左上角坐标和右下角坐标。```
prev_pos = None
```
初始化上一个车辆位置为`None`,并在后面的循环中更新。```
while True:ret, frame = cap.read()if not ret:break
```
循环读取每一帧视频帧,如果视频帧读取失败,则结束循环。```gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
```
将读取到的视频帧转换为灰度图像。```roi = gray[roi_y1:roi_y2, roi_x1:roi_x2]
```
根据预设的ROI,从灰度图像中提取出ROI的数据。```_, thresh = cv2.threshold(roi, 50, 255, cv2.THRESH_BINARY)
```
对 ROI 进行二值化处理。```kernel = np.ones((3, 3), np.uint8)thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
```
对 ROI 进行形态学开运算操作。```contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
```
从二值化的 ROI 中查找轮廓,获取边界信息。```cv2.drawContours(frame, contours, -1, (0, 255, 0), 3)
```
在原图上绘制车辆轮廓。```positions = []for contour in contours:M = cv2.moments(contour)if M['m00'] == 0:continuecx = int(M['m10'] / M['m00'])cy = int(M['m01'] / M['m00'])positions.append((cx, cy))
```
计算出检测到的车辆的中心坐标,并将其保存在`positions`列表中。```if prev_pos is not None and len(positions) > 0:prev_x, _ = prev_poscurr_x, _ = positions[0]pixel_per_meter = 30   fps = 30               speed = (curr_x - prev_x) * pixel_per_meter * fps / 100  print("车辆速度: %.2f m/s" % speed)
```
如果上一个帧检测到了车辆位置,且当前帧也检测到了车辆位置,则计算车辆运动速度。其中,`pixel_per_meter`表示每个像素对应多少米,`fps`表示视频帧率。```if len(positions) > 0:prev_pos = positions[0]
```
如果当前帧检测到了车辆位置,则更新上一个车辆位置的坐标为当前帧第一个检测到的坐标。```cv2.imshow('frame', frame)if cv2.waitKey(1) == ord('q'):break
```
显示处理后的视频帧,并等待用户按下`q`键退出程序。```
cap.release()
cv2.destroyAllWindows()
```
释放视频资源并关闭所有窗口。

这个程序可以读取一个视频文件,然后通过OpenCV库提供的图像处理接口来提取图像中的车辆轮廓,并计算出车辆的速度。这种方法虽然适用范围较窄,但实现相对简单,无需专业技能和设备。

总结

通过以上两种方法,我对两种车辆测速方法有了更深刻的认识,同时我也对python和OpenCV

有了更深刻的认识。但这两个程序只能实现最初级的功能,而且外部物理量测速法由于本人技术原因不能准确的实现车速的测量/(ㄒoㄒ)/~~。

基于python实现车辆测速两种的方法相关推荐

  1. 面试题:基于Python的青蛙跳台阶两种解法

    问题 一只青蛙要跳上 n 层高的台阶,一次能跳一级,也可以跳两级,请问这只青蛙有多少种跳上这个 n 层高台阶的方法? 递归 设青蛙跳上 n 级台阶有 f(n)种方法,把这 n 种方法分为两大类,第一种 ...

  2. python车辆测速视频车速检测

    python车辆测速视频车速检测 start_time = time.time()rc, image = video.read()if type(image) == type(None):breaki ...

  3. 输出九九乘法表——python(两种解决方法,嵌套循环的使用)

    用python输出九九乘法表 --------------------两种解决方法 在平时做题时会遇到让我们输出九九乘法表对于这类问题我们可以先做出输出一个直角三角行的形状,在以上的基础上就行代码的修 ...

  4. dhcpd option43的两种配置方法

    最近在研究dhcpd的配置,发现config文件支持好多种表达式,挺有意思的.项目要用到DHCP的option 43(厂商特定信息选项)字段,用来给客户端下发ACS URL.本文就基于该需求给出了两种 ...

  5. 基于web端和C++的两种深度学习模型部署方式

    深度学习Author:louwillMachine Learning Lab 本文对深度学习两种模型部署方式进行总结和梳理.一种是基于web服务端的模型部署,一种是基... 深度学习 Author:l ...

  6. NVIDIA专家实战演示,教你快速搭建基于Python的车辆信息识别系统

    主讲人 | 何琨 英伟达 量子位编辑 | 公众号 QbitAI 随着智慧城市.自动驾驶的快速落地,车辆的检测和识别应用场景非常广泛,如车牌识别.车流统计.车辆属性识别等. 近日,在英伟达x量子位发起的 ...

  7. 基于单片机的霍尔测速系统

    设计简介: 本设计是基于单片机的霍尔测速系统,主要实现以下功能: 可通过LCD1602速度最大值和霍尔测得的速度值: 可通过按键调整速度最大值. 标签:51单片机.LCD1602.MX1508.霍尔传 ...

  8. python ioc di_Spring介绍,IOC(控制反转),DI(依赖注入)介绍及两种注入方法

    Spring介绍,IOC(控制反转),DI(依赖注入)介绍及两种注入方法 第一中方法:在xml文件中注入: (1)开源的轻量级的应用开发框架 特点:a.简化开发:b.解耦:c.集成: 原理对象与对象之 ...

  9. CV公开课报名 | 快速搭建基于Python的车辆信息识别系统

    位来 发自 凹非寺 量子位 编辑 | 公众号 QbitAI 时下,智慧城市和自动驾驶快速发展,车辆的检测和识别应用场景非常广泛,如车牌识别.车流统计.车辆属性识别等. 但是从0搭建一个精度高.速度快的 ...

最新文章

  1. 为什么 Linux 需要 Swapping
  2. 逻辑回归 + GBDT模型融合实战!
  3. 带FIFO的UART收发器设计(转发)
  4. HTML学习感想(4)【密码输入框、单选、复选框】
  5. 玩转UITableView
  6. opencv复杂变换cvPyrDown [6]
  7. 测试需求分析第二部分
  8. Ubuntu 14.10 下开机不进入图形化界面
  9. vscode 更改中办发文_如何在Visual Studio代码或VSCode中更改集成终端
  10. 小米手机用什么蓝牙耳机好?高颜值游戏专属蓝牙耳机推荐
  11. 开源库uthash第一弹uthash.h
  12. BAAF-Net源码阅读
  13. iOS---iPhoneXs iPhoneXs Max iPhoneXr
  14. 植发搞笑图片_搞笑:终于找到原图了!像不像?
  15. itest(爱测试) 4.2.1 发布,开源BUG 跟踪管理 敏捷测试管理软件
  16. python后端 工作 知乎_[Python]知乎后端实习生面试心得
  17. 大阳能充电新技术---Powerfoyle
  18. 一文熟悉 Go 的循环结构 —— for 循环
  19. 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心, 因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。
  20. 免费AI改图神器,一个万能宝藏在线工具箱

热门文章

  1. 或许你会想知道变老特效怎么弄
  2. 第九周 计算存款利息和本息合计
  3. 简单聊聊Promise
  4. linux脚本乘法运算符,使用shell脚本实现加法乘法运算
  5. vue2+vant 开发公众号
  6. golang时间戳转换
  7. golang 如何翻转含有中文 数字 英文字母等任意字符串
  8. regiongrow.m
  9. 母猫过马路时被撞死 公猫守候久久不愿离去(图)
  10. SQL语句建表基础教程