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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25819827/article/details/53557711

用MATLAB对车辆的统计第三章,对车速的测量,对车速的测量是在前两章的基础上进行补充:
对车速的测量我想到的有两种方法:
方法一:
直接在路上设置两个框,在已知路面的实际距离,和图上车辆经过的图上距离的情况下,简单地利用比例(要更加精确一点的话应该用摄像机的标定,用摄像机的内参外差,在经过一系列的变化,得到实际物体在空间中的位置)来计算车速,再知道车辆经过这两帧的帧数差与每帧之间的时间可以大致估计出车辆的车速。
在同一条车道前后设置两个记录车辆经过的框框与框之间的距离为L,当车辆经过第一个框时记录下记录下图片的帧数n1 ,当车辆进过第二个框时记录下第二个的帧数 n2,通过已知两个框实际距离L和帧与帧之间的时间间隔t利用公式:
V=L(n1n2)×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=y1y2n×t×10270
其中 y1为最接近y=760的坐标值, y2为最接近y=490的坐标值,10270 为接近490与接近760的帧数之差,10为实际距离为10m,270为图上距离为270像素,
运行结果:
这里写图片描述
终结这只是简易版本,完整版可以参考论文
浙江大学的《基于视频的高速公路车速检测和车辆跟踪系统》感觉还是比较详细的介绍地(不过还是推荐用C来实现)

没有更多推荐了,返回首页