2024年数学建模研究生赛E题从视频中提取数据的代码。主要包括三个部分:车流量计算、各车道车流量计算和平均速度计算。主要讲述了代码的使用方法,包括需要修改的参数和文件路径,以及一些特殊情况的处理方法。同时还提供了参数估计和绘图的相关代码,以及如何根据不同视频视角调整代码。
代码链接
2024“华为杯”数模研赛E数据提取代码
首先需要将所有视频文件直接复制到文件夹目录下
计算车流量
核心代码为1.py
,运行代码会生成x.x.txt
,然后使用1-draw.py
读取txt,绘制折线图
需要修改内容如下:
第8行
# 导入视频
txt_name='4.2.txt'
video_path = '4.2.mp4' # 视频文件路径
修改对应的路径、视频编号。
第31行
# 设定通过线的位置
point2x=0
point2y=int(height*0.50)
point1x=width
point1y=int(height*0.45)
这是检测线的个端点,合适的参数请查看参数记录.txt
的前半部分
1-draw.txt中的第6行
file_path = '1.1.txt'
修改成你需要绘制的视频编号
1-draw.txt中的第31行
window_size = 5
可稍作修改,建议5~20之间
各车道车流量计算
核心代码为三车道.py
,绘图代码为三车道-draw.py
相比于普通的车流量计算,还需要修改车道线的划分。
第38行
# 车道划分
side1=int(width*0.25)
side2=int(width*0.4)
需要调整参数。合适的参数也在最佳参数.txt
中,如:
1
point1x=0
point1y=int(height*0.2)
point2x=width
point2y=int(height*0.5)0.25 0.4
表示1系列视频需要调整两个划分线为0.25和0.4
三车道draw中的第46行
plt.plot(smoothed_total, label='总车流量')
plt.plot(smoothed_lane3, label='快车道车流量')
plt.plot(smoothed_lane2, label='慢车道车流量')
plt.plot(smoothed_lane1, label='应急车道车流量')
由于拍摄视角原因,可能需要交换“应急车道”和“快车道”,即变成
plt.plot(smoothed_total, label='总车流量')
plt.plot(smoothed_lane1, label='快车道车流量')
plt.plot(smoothed_lane2, label='慢车道车流量')
plt.plot(smoothed_lane3, label='应急车道车流量')
以画出图例正确的折线图
计算平均速度
估算k
使用代码标点.py
启动视频,空格暂停,鼠标左键在画面中点击以生成坐标。请点击每辆车的前后两个轮子的位置。生成每行四个数据,复制到坐标\x.x.xlsx
中,注意excel需要保留表头。
使用代码估算k.py
读取excel表格,使用多项式以拟合函数\(k(x,y)\)。
上述操作可以跳过,比较好的表达式已经保存在参数估计.txt
的后半部分
计算速度
核心代码为速度.py
,绘图代码为速度-draw.py
对于不同视角的视频,将k的表达式复制到核心代码的第12行
def calc_k(x,y):k = 3.5060369468e-01 + 2.4844164330e-04 * x + -1.6744365346e-03 * y + 4.2032717049e-07 * x ** 2 + -1.3060908122e-06 * y ** 2 + 2.4295921693e-06 * x * yreturn k
替换其中的k的表达式。
由于是计算速度,所以不需要管检测线和车道线,也就是说只需要修改视频文件路径和k的表达式即可。