车速检测 您所在的位置:网站首页 如何测实时车速多少码 车速检测

车速检测

2023-10-04 19:58| 来源: 网络整理| 查看: 265

车速检测

这是我的第一篇博客哈哈,、受到疫情的影响,在家完成模式识别的作业。本次是模式识别作业的其中一个,车速检测,在此记录一下,好日后查找,当然,如果能对大家有帮助,我将会很高兴滴。话不多说,我们看重点。 基于视频的实时车速检测有两种方法,一种是目标检测法,另一种是线圈法。前者就是检测出每一帧中车的位置,然后根据相机标定的值得到车在实际道路上的位移,通过距离除以时间就能得到车速。后者是在固定的两个位置分别设置两个虚拟线圈(为啥叫虚拟线圈,因为实际上这两个位置是人为圈出来的)。当汽车经过虚拟线圈时,这个区域的像素值会改变。当检测到像素值发生改变时,记录当前帧数,两个帧数相减得到汽车经过两个虚拟线圈的帧数,然后根据视频帧率得到时间,最后就是距离除以时间就能得到车速。 整体检测流程如下图所示 在这里插入图片描述

可视化虚拟线圈

这个对车速检测没有任何关系,纯粹是是我们能肉眼看到设置的线圈的位置,毕竟眼见为实嘛。 在图像上画线

function [ dest ] = DrawVirtualbox( src, pt, wSize, lineSize, color ) % %将图像画上有颜色的框图,如果输入是灰度图,先转换为彩色图像,再画框图 % 图像矩阵 % 行向量方向 是 y % 列向量方向 是 x %---------------------------------------------------------------------- %输入: % src: 原始图像,可以为灰度图,可为彩色图 % pt: 左上角坐标 [x1, y1] % wSize: 框的大小 [wx, wy] % lineSize: 线的宽度 % color: 线的颜色 [r, g, b] %---------------------------------------------------------------------- %输出: % dest: 画好了的图像 %---------------------------------------------------------------------- %flag=1: 有缺口的框 %flag=2: 无缺口的框 flag = 2; %判断输入参数个数 if nargin < 5 color = [255 255 0]; end if nargin < 4 lineSize = 1; end if nargin < 3 disp('输入参数不够 !!!'); return; end %判断框的边界问题 [yA, xA, z] = size(src); x1 = pt(1); y1 = pt(2); wx = wSize(1); wy = wSize(2); % x1 = pt(1); % y1 = pt(2); % wx = wSize(1); % wy = wSize(2); if x1>xA || ... y1>yA||... (x1+wx)>xA||... (y1+wy)>yA disp('画的框将超过图像 !!!'); return; end %如果是单通道的灰度图,转成3通道的图像 if 1==z dest(:, : ,1) = src; dest(:, : ,2) = src; dest(:, : ,3) = src; else dest = src; end %开始画框图 for c = 1 : 3 %3个通道,r,g,b分别画 for dl = 1 : lineSize %线的宽度,线条是向外面扩展的 d = dl - 1; if 1==flag %有缺口的框 dest( y1-d , x1:(x1+wx) , c ) = color(c); %上方线条 dest( y1+wy+d , x1:(x1+wx) , c ) = color(c); %下方线条 dest( y1:(y1+wy) , x1-d , c ) = color(c); %左方线条 dest( y1:(y1+wy) , x1+wx+d , c ) = color(c); %左方线条 elseif 2==flag %无缺口的框 dest( y1-d , (x1-d):(x1+wx+d) , c ) = color(c); %上方线条 dest( y1+wy+d , (x1-d):(x1+wx+d) , c ) = color(c); %下方线条 dest( (y1-d):(y1+wy+d) , x1-d , c ) = color(c); %左方线条 dest( (y1-d):(y1+wy+d) , x1+wx+d , c ) = color(c); %左方线条 end end end %主循环尾 end %函数尾

根据自己设置的虚拟线圈的位置画框

clear all; clc % %导入视频 [fileName,pathName] = uigetfile({'*.mp4'; '*.mkv'; '*.avi'},'Select the video'); videoSrc = vision.VideoFileReader(strcat(pathName, fileName)); frame = step(videoSrc); paddedFrame = padarray(frame, [30 30], 0, 'both'); %填充 %由于相机有一定的倾斜角度,因此将图像进行校正 rotatedImg = imrotate(paddedFrame, -7, 'bilinear', 'crop'); %旋转 % Image=im2double(frame); Image=im2double(rotatedImg); rotatedImg = imrotate(paddedFrame, -7, 'bilinear', 'crop'); %旋转 % %虚拟线圈1和2在视频中的位置 %以下四个位置自己更改 pt = [930, 775]; wSize = [120,8]; pt1 = [1250, 1025]; wSize1 = [300,20]; %画出两个虚拟线圈的图 des = DrawVirtualbox(Image,pt,wSize,5 ); des = DrawVirtualbox(des,pt1,wSize1,5 ); figure(1); imshow(Image) figure(2); imshow(des)

下图是画的两个虚拟线圈。在这里插入图片描述

检测虚拟线圈区域内的像素跳变

通过虚拟线圈内的像素值跳变,可以判断是否有车经过该区域。通过实验,可以得知,当有车经过该虚拟线圈时,前后两帧线圈内的像素值之差会有跳变,因此将这个跳变作为判断准则。 首先药计算出线圈区域内的像素值,然后就是相邻两帧的像素差值。

function [value1, value2] = ROIFeature(frame) % %得到虚拟线圈的灰度值 %---------------------------------------------------------------------- %输入: % frame: 视频帧 %---------------------------------------------------------------------- %输出: % value1: 虚拟线圈1的灰度值 % value2: 虚拟线圈2的灰度值 %---------------------------------------------------------------------- Image=im2double(frame); I=rgb2gray(Image); %转为灰度图 roi1 = I(775:782,930:1050); %设置虚拟线圈一 roi2 = I(1025:1025,1250:1550);%设置虚拟线圈二 value1 = sum(sum(roi1)); %虚拟线圈一内的灰度值总和 value2 = sum(sum(roi2)); %虚拟线圈二内的灰度值总和 [feature1,feature2] = ROIFeature(frame); %得到虚拟线圈一和虚拟线圈二区域的灰度值和 if ~exist('f1') %判断是否为第一帧图像 f1 = feature1; f2 = feature2; else d1(frameNo) = feature1 - f1; %将相邻帧的像素差值存在矩阵中 d2(frameNo) = feature2 - f2; f1 = feature1; f2 = feature2;

由于其他物体也可能导致虚拟线圈内的像素值发生改变,因此,增加了一项汽车识别。使用了最简单的背景差分法检测汽车,但这种方法误差挺大。而且需要实时更新背景才能准确的检测出运动的物体。

function [Position] = IsCar(frame) % %检测车区域 %---------------------------------------------------------------------- %输入: % frame: 视频帧 %---------------------------------------------------------------------- %输出: % Position: 汽车的位置 %---------------------------------------------------------------------- newimag=imread('BC.jpg'); %事先得到的背景图 newimag = padarray(newimag, [30 30], 0, 'both'); %填充 newimag = imrotate(newimag, -7, 'bilinear', 'crop'); %旋转 newimag=im2double(newimag); newimag=medfilt2(newimag); %背景图滤波 frame=rgb2gray(frame); frame=medfilt2(frame); %对视频帧进行滤波 Diff= abs(frame - newimag); %差分分即视频帧减背景图 Diff = mat2gray(Diff); Diff = Diff > graythresh(Diff); %得到二值图像 se = [0,1,0;1,1,1;0,1,0]; Diff = imerode(Diff,se); %形态学操作腐蚀图像 % figure;imshow(Diff);title('腐蚀图像'); %找到面积最大的矩形框 s = regionprops(Diff, 'Area', 'BoundingBox'); boundary =size(s); Blob=0; for k = 1: boundary(1) Blob(k)=s(k).Area; end [maxValue, DrawIt] = max(Blob(:)); % 找到最大的检测区域 Position = s(DrawIt).BoundingBox; %画出矩形框 % figure(); % imshow(frame,[]) % title('Detected moving object with bounding box') % rectangle('Position',Position, 'EdgeColor','c')

通过背景差分法检测出来的汽车。在这里插入图片描述 至此,在增加判断条件和公司计算就能将车速算出来啦。这里我们没有进行相机标定,测出来的车速只是一个大概值。如果是实际的项目,要修改的地方很多。最后附一张我识别的车速图片。不得不夸一句,matlab真相,至少GUI界面设计非常简单方便呢。 在这里插入图片描述第一次写博客,有种不知道怎么下笔的感觉。以后我会慢慢提升的。如果有任何问题欢迎指出,也欢迎评论哈。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有