视频监控系统
大连海事大学课程设计报告
视频监控系统设计
(分题:人体目标轨迹识别)
学 院:信息科学技术学院
专业班级:自动化四班
姓 名:韩志伟
学 号:2220082913
2012-3-23 1
, 论文摘要
本次课程设计主要围绕视频监控系统进行设计。按照循序渐进的
,由浅入深,对视频监控系统进行相关的设计。本次课程设计中用到的基本方法包括数字图像的
示方法、图像的读写、图像的显示、图像间的转化、图像的相加、相减、绝对相减运算、图像去噪、图像分割、图像亮度调节、图像压缩等。在这些基本方法的基础上,进行了视频文件的连接以及显示,并从视频中获取图像。视频监控的主要判别方法有背景差法和帧差法,由这两种方法所进行的控制相互对比,在具体的分题中采用了合适的方法。
, 关键字
图像处理、视频文件连接、视频文件显示、背景差法、帧差法、视频监控判别、视频监控报警
, 主要函数
图像表示、读写、显示函数:imread imshow imview imwrite
不同图像的区别及转化函数:rgb2gray im2bw
图像基本运算函数:imadd imsubtract imabsdiff
图像处理函数:nrfiltdemo imadgdemo edgedemo dctdemo bwlabel
regionprops
视频文件的连接、显示函数:aviread aviinfo
摄像头连接、显示函数:videoinput preview
视频获取帧图像函数:getsnapshot
2012-3-23 2
一、学习并掌握图像的基本概念
1、数字图像的表示方法、图像读写及显示方法
例
(1)读入图像
RGB = imread('football.jpg'); //将图片导入内存中 用RGB数组存储 [X,map] = imread('trees.tif'); //X为图片的灰度图,map
(2)显示图像
>> RGB=imread('Water lilies.jpg'); >> imshow(RGB) //显示图片
输出结果:
(3)查看图片RGB值
>> imview('trees.tif') //显示图片 并可以查看任意一坐标的RGB值 输出结果:
2012-3-23 3
(4)存储图片
>> RGB=imread('Water lilies.jpg'); >> imwrite(RGB,'Water.jpg') //把图像Water lilies.jpg以Water.jpg格式保存在work文件夹下; >> imshow('Water.jpg')
输出结果:
2、不同类型图像(彩色图像、灰度图像、黑白图像)的区别及转换方法 例
(1)彩色图像转换为灰度图
例
I = imread('board.tif');
J = rgb2gray(I); //把图像转化成灰度图
figure, imshow(I), figure, imshow(J); 输出结果:
2012-3-23 4
(2)彩色图像转换为黑白图
例
[X,map]=imread('trees.tif'); BW = im2bw(X,map,0.4); //把图像以0.4为界转化成黑白图像
figure,imshow(X,map), figure, imshow(BW) 输出结果:
3、图像基本运算
(1)图像的色值加法
例
clc
close all
I = imread('rice.png');
J = imadd(I,90);
figure, imshow(I)
figure, imshow(J) 输出结果:
2012-3-23 5
(2)图像的色值减法
例
clc
close all
I = imread('rice.png');
Iq = imsubtract(I,50);
figure, imshow(I), figure, imshow(Iq)
输出结果:
(3)图像之差
例
clc
close all
I = imread('cameraman.tif');
J = uint8(filter2(fspecial('gaussian'), I)); %将I经过高斯运算给J
K = imabsdiff(I,J); %|I-J|给k
figure,imshow(J),figure,imshow(I);figure,imshow(K,[]), % [] = scale data
automatically
输出结果:
2012-3-23 6
4、图像处理的三大任务 (1)改善图像质量
a、图像去噪
例
>> nrfiltdemo//图像去噪声
b、图像亮度调节
例
>> imadjdemo//亮度调节
2012-3-23 7
(2)图像分割
边缘检测
>> edgedemo//边缘检测
(3)图像压缩
频率压缩
>> dctdemo//频域压缩
2012-3-23 8
二、转我视频监控系统的基本功能及构成
1、视频文件连接、显示方法(aviread、aviinfo)
例
>> aviinfo( 'vipmen.avi')//视频显示参数
ans =
Filename: [1x66 char]
FileSize: 16442880
FileModDate: '07-Jan-2006 19:06:02'
NumFrames: 283
FramesPerSecond: 30.0000
Width: 160
Height: 120
ImageType: 'truecolor'
VideoCompression: 'none'
Quality: 0
NumColormapEntries: 0
2、从视频中获取图像的方法
视频文件的连接
videoIn = 'vipmen.avi';
获取视频第N帧图像
imageFrame=aviread(videoIn,N); 例: videoIn='vipmen.avi';
imageFrame=aviread(videoIn,1);
imageFirst=imageFrame.cdata;
imshow(imageFirst);
得到的第一帧图像为:
3从图像中指定感兴趣区域、并获取自图像的方法
4、视频监控判别方法
2012-3-23 9
(1)背景差法:
背景差法流程图
2012-3-23 10
三、具有智能判别的视频监控系统设计及实现
摄像头的连接:videoinput
摄像头的显示:preview
从实时视频中获取一帧图像的方法:getsnapshot
分题一:人体目标轨迹识别(进入或离开房间)
开始
连接摄像头并延
时5秒
获取第一帧图像
获取当前帧
获取最大面积区域的 中心横坐标
当前中心坐标减去前一个
中心横坐标
否 中心差>1?
是
判定人体前进方
向
保存当前中心横坐标做下一 次计算中心差用
否 i+1 i>3500?
是
退出
人体目标轨迹识别流程图
2012-3-23 11
原理:本监测系统主要是通过帧差法,获取移动人体的中心坐标,通过临次中心坐标之差正负判别人体移动方向(左或右)
进门识别后右上角会有白色小方框显示:
进门采集图
出门识别后左上角会有一白色小方框显示:
出门采集图
四、分析结果
1、背景对实验结果的干扰
复杂背景对实验结果的干扰比单调色彩实验背景对实验结果要大,选取实验背
景时尽量选取色彩比较简单的背景,而且背景颜色与人体所穿衣服颜色相似时也容
易产生较大干扰。
2、光线对实验结果的干扰
较强光线与较弱光线都容易对实验结果造成一定干扰,光线适中比较合适。
2012-3-23 12
3 、人体移动速度对实验结果的影响
人体移动太快时,容易对采集图像造成影响,对后续结果产生严重影响,可能检
测不到人体移动方向;人体移动太慢时,系统识别不到人体移动,检测不到人体移动
方向。人体正常移动或移动稍快时,实验效果最明显。
4、人体移动方向对实验结果的影响
由于本程序是根据人体中心点在图像横坐标X轴上的移动方向判断人体移动方
向的,所以当人体移动方向与摄像方向一致时,测不出结果,只有垂直时才能明显测
出结果。
5、参数中心点坐标之差对实验结果的影响
参数越大,干扰对实验的影响越小,但是越不容易检测到结果,参数越小越灵敏,
但干扰对实验的影响越大,所以选择一个适当的参数很重要。
6、系统改进
(1)可以在程序中加入中心点的纵坐标变化和人体在图像中面积的变化判断,这样能够
更准确的判断人体移动轨迹。
(2)可以在程序代码中加入声频警告,使系统功能更完善。
(3)可以在程序中加入去除噪声程序,重录制的视频中获得更清晰的图片,减少外部干
扰。
(4)可以在程序中加入人体识别程序,规避物体移动的影响。
五、总结
经过这次的课程设计,学会并掌握了用MATLAB来进行基本的图像处理和视频
监控技术的设计。通过用MATLAB可以进行图片的基本处理,进行图片的查看,修
改,包括对图片进行加、减、绝对减,对图片的去噪、亮度调节。对数字视频进行
播放,并可以从中获取图像。利用摄像头来进行摄像,对相关的视频进行监控,监
控人体目标的移动,获取中心点,判别并显示出人体目标的移动方向。这次的课设
完成了基本
,了解了关于MATLAB的更多的对于图像处理的功能。对于视频监
控系统的设计,有了更深的了解和更多的认识。提高了对图像和视频的处理能力,
并能够设计简单的视频监控系统,拓展了知识面。同时也对视频监控技术产生了浓
厚的兴趣,无论重娱乐的角度或实用的角度,视频监控技术都有很重要的作用。 附录;
1、背景差法代码
close all
clear all
clc
videoIn = 'vipmen.avi';
videoInfo = aviinfo(videoIn);
num = videoInfo.NumFrames;
imageFrame=aviread(videoIn,1); %获取第一帧
imageFirst=imageFrame.cdata; %获取第一帧图片
videoOut = avifile('D:/out1.avi'); %视频保存路径
for i=1:10: num %采集视频循环
aviobj = aviread(videoIn,i); %获取第i帧
image=aviobj.cdata; %获取第i帧图片
subImage=imabsdiff(image,imageFirst); %当前图片与第一帧图片相减
2012-3-23 13
grayImage = rgb2gray(subImage); %图片变成灰度图 % subgray=grayImage(1:50,1:50); %获取指定区域图片 % imshow(subgray);
BW=im2bw(grayImage); %变成黑白图片
Sum=sum(BW(:)); %计算图像中1的个数
if Sum>=10 %警告~
grayImage(1:10,1:10)=255; %在有人来了的图片上显示白色方框
disp('有人来了!');
end
[X, map] = gray2ind(grayImage, 236);
frame = im2frame(X, map); %图像转化成帧
videoOut = addframe(videoOut,frame); %添加帧到视频中去 end
videoOut = close(videoOut);
2、帧差法代码
close all
clear all
clc
videoIn = 'vipmen.avi';
videoInfo = aviinfo(videoIn);
num = videoInfo.NumFrames;
Height=videoInfo.Height;
Width=videoInfo.Width;
imageFrame=aviread(videoIn,1); %获取第一帧 imageFirst=imageFrame.cdata; %获取第一帧图片 videoOut = avifile('D:/out2.avi'); %视频保存路径 for i=2:5: num %采集视频循环
aviobj = aviread(videoIn,i); %获取第i帧
imageFirst=aviread(videoIn,i-1); %获取第i-1帧
imageFirst=imageFrame.cdata; %获取第i-1帧图片
image=aviobj.cdata; %获取第i帧图片
subImage=imabsdiff(image,imageFirst); %当前图片与第i帧图片相减
grayImage = rgb2gray(subImage);
BW=im2bw(grayImage); %变成黑白图片
Sum=sum(BW(:)); %计算图像中1的个数
if Sum>=10
grayImage(1:10,1:10)=255; %在有人来了的图片上显示白色方框
disp('有人来了');
end
[X, map] = gray2ind(grayImage, 236);
frame = im2frame(X, map); %图像转化成帧
videoOut = addframe(videoOut,frame); %添加帧到视频中去
2012-3-23 14
end
videoOut = close(videoOut);
3、人体目标轨迹识别代码
close all
clear all
clc
obj=videoinput('winvideo',1); %连接摄像头 preview(obj); %显示图像
pause(5)
preImage=getsnapshot(obj); %获取第一帧图像 preImage2bw=im2bw( preImage); %将第一帧图像变成黑白图
firstImage=preImage;
firstImagebw=im2bw(firstImage);
firstImagegray=rgb2gray(firstImage);
preImagegray=firstImagegray;
preCenter=180;
nowdifCenter=0; %当前中心点
predifCenter=0; %上次中心点差
videoOut = avifile('D:/人体目
别.avi'); Sum=0;
disp('开始~');
for i=2:10:1500
getImage=getsnapshot(obj); %获取当前帧
getImage2gray=rgb2gray(getImage); %将当前帧转化成灰度图
getImage2bw=im2bw(getImage); %将当前帧转化成黑白图
preImagegray=rgb2gray(preImage);
image2gray=imabsdiff(getImage2gray,preImagegray);%获取当前帧与前一帧
的差值图
image2bw=im2bw(image2gray,0.4);
L=bwlabel(getImage2bw);
s=regionprops(L,{'Area','Centroid'});
centroids=cat(1,s.Centroid);
Num=size(centroids);
max=s(1).Area;
maxlabel=1;
2012-3-23 15
for j=1:Num %查找最大区域的坐标值
if s(j).Area>=max;
max=centroids;
maxlabel=j;
end
end
Center=s(maxlabel).Centroid(1,1); %获取中心坐标
Sum=sum(image2bw(:));
nowdifCenter=Center-preCenter; %当前差值图与前次差值图中心坐标之差
if Sum>500
disp('nowdifCenter=');
disp(nowdifCenter);
if nowdifCenter>=1 %往右走
if predifCenter>=1
getImage2gray(1:10,300:310)=255;
disp( 'ÍùÓÒ×ß');
disp('nowdifCenter=');
disp(nowdifCenter);
end
elseif 0.5+nowdifCenter<=0 %往左走
if (predifCenter+1<=0)
getImage2gray(1:10,1:10)=255;
disp( 'Íù×ó×ß');
disp('nowdifCenter=');
disp(nowdifCenter);
disp('predifCenter=');
disp(predifCenter);
end
end
end
[X, map] = gray2ind(getImage2gray, 236);
frame = im2frame(X, map);
videoOut = addframe(videoOut,frame);
predifCenter=nowdifCenter;
preCenter=Center; %保存中心坐标
preImage=getImage;
end
videoOut = close(videoOut);
delete(obj);
2012-3-23 16