利用MATLAB进行车辆的速度测量

用MATLAB对车辆的统计第三章,对车速的测量,对车速的测量是在前两章的基础上进行补充:
对车速的测量我想到的有两种方法:
方法一:
直接在路上设置两个框,在已知路面的实际距离,和图上车辆经过的图上距离的情况下,简单地利用比例(要更加精确一点的话应该用摄像机的标定,用摄像机的内参外差,在经过一系列的变化,得到实际物体在空间中的位置)来计算车速,再知道车辆经过这两帧的帧数差与每帧之间的时间可以大致估计出车辆的车速。
在同一条车道前后设置两个记录车辆经过的框框与框之间的距离为L,当车辆经过第一个框时记录下记录下图片的帧数n1 ,当车辆进过第二个框时记录下第二个的帧数 n2,通过已知两个框实际距离L和帧与帧之间的时间间隔t利用公式:
V=L(n1−n2)×t
可以大致求出车辆的速度。
这个方法个人认为简单地不能在简单,以致刚开始想也没想就排除了(结果好像让我们用这个方法感觉有点伤)
首先
同一辆车经过两个框的帧差 大约在1到20之间为一个整数 ,V也为二十个速度之一,测的速度较为不准确。
再者:如果遇到车辆的变道如:


图中的这两白色面包车,
甚至是:

在发生前后两个框无法检测到同一辆车时会对后面的车辆的计数产生很大的影响;
解决方法1,将框的距离设置近一些,但测速的范围会下降
解决方法2,设置一个时间,当上框遇到框时,设置当过几帧时没检测到时就放弃这辆车,在后框设置当前框没检测到后框检测到时认为这辆车为变道而放弃;
方法二:
加上跟踪的方法:
步骤一:
往函数中传入要测量到车子进入测量框的帧数和记录车辆框的位置,读入相邻两张图片进行差分,并且二值化,同时声明一个一个数组来保存记录要每一帧中检测车辆质心位置。

function [jiludian,rect,speed]=gengzhong(shizheng,rect)
number=shizheng;
name=strcat('sy',num2str(number),'.jpg');
src1=imread(name);
number=number+1;
name=strcat('sy',num2str(number),'.jpg');
src2=imread(name);
jiludian=zeros(100,2);
k=1;
zhic1=src2-src1;
zhic1=im2bw(zhic1,0.1);

步骤二:
求出测量框内车辆的质心坐标位置:
并将质心坐标保存

function [y,x]=zhixin1(zhic1,rect)
u=0;
v=0;
zuobiaox=0;
zuobiaoy=0;
number=0;
jilux=0;
jiluy=0;
zhongxinx=rect(1)+rect(3)/2;
zhongxiny=rect(2)+rect(4)/2;
for i=zhongxiny-rect(4)/2:zhongxiny+rect(4)/2
    for j=zhongxinx-rect(3)/2:zhongxinx+rect(3)/2
        if(j<1920)
            if(zhic1(i,j)==1)
            number=number+1;
            u=(int64(i)+int64(u));
            v=(int64(j)+int64(v));
            zuobiaox=zuobiaox+double(zhic1(i,j));
            zuobiaoy=double(zhic1(i,j))+zuobiaoy;
            jilux=int64(jilux)+int64(j);
            jiluy=int64(jiluy)+int64(i);
            end
        end
    end
end
y=int64(u/zuobiaoy);
x=int64(v/zuobiaox);

步骤三:
读入第三张图片并与第二张图片进行差分和二值,并进行质心的查找:
质心的查找我们先对车辆的测量框按照车道的方向进行一定的扩充,大致预测出车在下一帧中的大致位置,进行质心的查找,并记录下第二个质心的坐标点;

number=number+1;
name=strcat('sy',num2str(number),'.jpg');
src1=src2;
src2=imread(name);
zhic2=src2-src1;
zhic2=im2bw(zhic2,0.1);
imshow(zhic2);
[y2,x2]=zhixin2(zhic2,rect);
jiludian(2,1)=y2;
jiludian(2,2)=x2;

function [y,x]=zhixin2(zhic1,rect)
u=0;
v=0;
zuobiaox=0;
zuobiaoy=0;
number=0;
jilux=0;
jiluy=0;
zhongxinx=rect(1)+rect(3)/2;
zhongxiny=rect(2)+rect(4)/2;
for i=zhongxiny-rect(4)/2:zhongxiny+rect(4)/2+40
    for j=zhongxinx-rect(3)/2:zhongxinx+rect(3)/2+30
        if(j<1920)
            if(zhic1(i,j)==1)
            number=number+1;
            u=(int64(i)+int64(u));
            v=(int64(j)+int64(v));
            zuobiaox=zuobiaox+double(zhic1(i,j));
            zuobiaoy=double(zhic1(i,j))+zuobiaoy;
            jilux=int64(jilux)+int64(j);
            jiluy=int64(jiluy)+int64(i);
            end
        end
    end
end
y=int64(u/zuobiaoy);
x=int64(v/zuobiaox);

步骤四:
根据前两个质心的坐标移动搜索质心的框的位置,并在搜索框中搜索出质心的位置,并记录下质心的位置,再根据找到的质心坐标和前一个的质心坐标位置移动搜索框的位置找出下一个质心的位置如此循环。退出条件为最多寻找20帧图片,或车辆的质心坐标y已经到达或大于图上坐标的1016。

for b=number+1:number+40
    yuandian(1,1)=y1;
    yuandian(1,2)=x1;
    yuandian(2,1)=y2;
    yuandian(2,2)=x2;
    x1=x2;
    y1=y2;
    name=strcat('sy',num2str(b),'.jpg');
    src1=src2;
    src3=src2;
    src2=imread(name);
    zhic2=src2-src1;
    zhic2=im2bw(zhic2,0.2);

    houx=2*yuandian(2,2)-yuandian(1,2);
    houy=2*yuandian(2,1)-yuandian(1,1);
    [y2,x2]=zhixin3(zhic2,rect,houy,houx);
    hold on;
    [state,result]=draw_rect(src3,[x2-rect(3)/2,y2-rect(4)/2],[rect(3),rect(4)],0);
    plot(x2,y2,'LineWidth',2,'Color','b');
    imshow(result);
    jiludian(k,1)=y2;
    jiludian(k,2)=x2;
    k=k+1;
    if(y2>1016)
        break;
    end
    pause(0.01);

end
function [y,x]=zhixin3(zhic1,rect,houy,houx)
u=0;
v=0;
zuobiaox=0;
zuobiaoy=0;
number=0;
jilux=0;
jiluy=0;

for i=houy-rect(4)/2:houy+rect(4)/2
    for j=houx-rect(3)/2:houx+rect(3)/2
        if(j<1920&&i<1072&&j>0&&i>0)
            if(zhic1(i,j)==1)
            number=number+1;
            u=(int64(i)+int64(u));
            v=(int64(j)+int64(v));
            zuobiaox=zuobiaox+double(zhic1(i,j));
            zuobiaoy=double(zhic1(i,j))+zuobiaoy;
            jilux=int64(jilux)+int64(j);
            jiluy=int64(jiluy)+int64(i);
            end
        end
    end
end
y=int64(u/zuobiaoy);
x=int64(v/zuobiaox)

步骤五:
根据网上的查找得到道路上白虚线为2m,白虚线之间的距离为4m,我们选择如图红框区域长度为10m作为比例尺,从图中测量红框上边点的坐标为490,下边坐标为760

zhengshu=b;
[kaishi,kaiwei]=zhidao_nearest(jiludian,760);
[jieshu,jiewei]=zhidao_nearest(jiludian,460);
speed=((jiewei-kaiwei)/270*10)/((jieshu-kaishi)*0.1);
function [x,y]=zhidao_nearest(A,b)
[Asort,index]=sort(abs(A(:)-b));
y=A(index(1));
x=find(A==y);

对质心的坐标的数组进行监视查找到最接近460,760的帧数与质心坐标,
根据对视频进行图片的分解,得出相邻两帧之间的时间差为0.1s
根据公式:
V=y1−y2n差×t×10270
其中 y1为最接近y=760的坐标值, y2为最接近y=490的坐标值,10270 为接近490与接近760的帧数之差,10为实际距离为10m,270为图上距离为270像素,
运行结果:

终结这只是简易版本,完整版可以参考论文
浙江大学的《基于视频的高速公路车速检测和车辆跟踪系统》感觉还是比较详细的介绍地(不过还是推荐用C来实现)

时间: 2024-10-26 11:10:31

利用MATLAB进行车辆的速度测量的相关文章

杭州装上“城市大脑”——车辆通行速度最高提升11%

[本文转载自中国城市报] 日前,杭州市政府公布了一项"城市大脑"计划:为这座首批列入国家智慧城市试点的城市,安装一个人工智能中枢--杭州城市数据大脑.在杭州萧山区的部分路段初步试验中,城市大脑通过智能调节红绿灯,车辆通行速度最高提升了11%. "城市大脑是个大胆而有创意的计划,也是智慧城市结合人工智能技术的必然产物."IEC智慧城市系统委员会及国标总体组专家余涛向中国城市报记者表示. 据悉,交通拥堵,只是城市大脑迎战的第一个难题.城市大脑的目标,是让数据帮助城市来做

利用matlab写好了图片合成代码,如何使我写的代码可以单独拎出来类似软件应用那样,可以单独使用

问题描述 利用matlab写好了图片合成代码,如何使我写的代码可以单独拎出来类似软件应用那样,可以单独使用 10C 利用matlab写好了图片合成代码,如何使我写的代码可以单独拎出来类似软件应用那样,可以单独使用 解决方案 可以用一些工具转换matlab代码为Python的代码. 比如说https://github.com/victorlei/smop. 或者用matlab自带的deploy tool. 可以换成java, c and c++包.http://www.mathworks.com/

matlab-Matlab程序案例利用Matlab解决一个利用最优化原理的实际问题

问题描述 Matlab程序案例利用Matlab解决一个利用最优化原理的实际问题 能不能给出一个利用最优化方法工具是使用Matlab来实现的具体案例? 解决方案 听起来是算法表示不懂--话说算法好牛的大数学家的算法可以根据你随便给定的几个数字推算出一个数列符合要求-- 解决方案二: http://cn.mathworks.com/products/optimization/?requestedDomain=www.mathworks.com看官方文档. 解决方案三: 用最小堆解决一个实际问题

利用matlab回复一副抖动图像的程序是什么?

问题描述 利用matlab回复一副抖动图像的程序是什么? 用手机拍了一张图像,由于拍摄过程中手机抖动了,图像不清晰了,怎么用radon等matlab函数将其复原 解决方案 搜一下matlab维纳滤波就可以了

利用GetString提高ASP的速度

许多ASP程序员都有过执行数据库查询,然后将查询结果用HTML表格的形式显示出来的经历. 许多ASP程序员都有过执行数据库查询,然后将查询结果用HTML表格的形式显示出来的经历.通常我们是这么做的: 以下是引用片段: <%  'Create connection / recordset  'Populate data into recordset object  %> <TABLE> <% Do While not rs.EOF %> <TR> <TD

利用HTML优化加快网页速度

速度|网页|优化      web开发人员是否必须掌握复杂的组件技术才能加快html页面的访问速度?答案是:不一定!实际上,有许多关于HTML与DHTML方面的技巧,它们原理简单而且上手容易.无论是技术高超的老手,还是初涉编程的菜鸟,领会这些都十分必要.      明显HTML,暗渡"公用脚本"      减少web页面下载时间的关键就是设法减小文件大小.当多个页面共用一些成分内容时,就可以考虑将这些公用部分单独分离出来.比如:我们可以将多个HTML页面都用到的脚本程序编写成独立存在的

如何利用HTML优化加快网页速度

速度|网页|优化 web开发人员是否必须掌握复杂的组件技术才能加快html页面的访问速度?答案是:不一定!实际上,有许多关于HTML与DHTML方面的技巧,它们原理简单而且上手容易.无论是技术高超的老手,还是初涉编程的菜鸟,领会这些都十分必要. 明显HTML,暗渡"公用脚本"减少web页面下载时间的关键就是设法减小文件大小. 当多个页面共用一些成分内容时,就可以考虑将这些公用部分单独分离出来.比如:我们可以将多个HTML页面都用到的脚本程序编写成独立存在的.js文件,然后再在页面中按如

利用html加快网页打开速度

web开发人员是否必须掌握复杂的组件技术才能加快html页面的访问速度?答案是:不一定!实际上,有许多关于HTML与DHTML方面的技巧,它们原理简单而且上手容易.无论是技术高超的老手,还是初涉编程的菜鸟,领会这些都十分必要. 明显HTML,暗渡"公用脚本" 减少web页面下载时间的关键就是设法减小文件大小.当多个页面共用一些成分内容时,就可以考虑将这些公用部分单独分离出来.比如:我们可以将多个HTML页面都用到的脚本程序编写成独立存在的.js文件,然后再在页面中按如下方式调用它: &

NES文件利用MATLAB可视化

NES是Nintendo Entertainment System的缩写,记录了NES小游戏的所有代码和数据.像超级玛丽.忍者龙剑传.热血格斗.007等游戏都有精彩纷呈的背景图片和形象生动的人物造型,我们是否能提取出这些素材,经过加工,用于其他UI设计呢?今天我们用MATLAB研究下具体内容. NES文件结构分为3大部分:文件头.CPU代码区.PPU数据区.通过文件头可以获得代码区.数据区的大小.这里只需要数据区. 数据区组织为4KB大小的数据块,填充在PPU地址区间0x0000~0x1000(