matlab2013b
视频图像分析是近年来计算机视觉领域中备受关注的前沿方向。从技术角度而言,其研究内容相当丰富,主要涉及到模式识别、图像处理、计算机视觉、人工智能等学科知识;同时动态场景中运动的快速分割、非刚性运动、目标之间互相遮挡或停止的处理等也为视频图像分析研究带来了一定的挑战。其中人运动的视觉分析是近年来计算机视觉领域中备受关注的前沿方向,它从包含人的图像序列中检测、识别、跟踪人并对其行为进行理解和描述,属于图像分析和理解的范畴。
其研究核心主要是从单个或多个视频序列中检测和跟踪运动人体,获取数据信息,进而描述和理解人体运动。这是一个很有挑战性的跨学科的研究课题,涉及到计算机视觉、计算机图形学、图像处理、模式识别和人工智能等多个学科。
目前,对于运动物体的检测和跟踪技术有着广泛的应用,概括起来有如下几个方面:
·智能监控:在银行、商店、停车场等对安全要求敏感的场合的保安设施中常常都装有一些可视化的监控设备。
·感知接口:在高级用户接口应用领域,希望计算机或机器人能更加智能的感知外部环境,即能通过识别跟踪分析使用者的面部表情、身体姿势和于势等的含义,来达到与人的交流,提高计算机或机器人的智能水平。
·运动分析:跟踪图像序列中感兴趣的人体部位,获得其运动特性。
·虚拟现实:目前许多电脑游戏中人体、动物行为的逼真设计效果得益于人体及动物的运动跟踪分析。
因此,研究运动物体的检测和跟踪具有十分重要的意义和应用前景。
1 背景提取
基于视频图像序列的前景提取常用的有相邻帧差法和背景帧差法两种。前者是利用相邻两帧或三帧之间图像信号的变化信息来提取运动前景;后者主要是假设静止背景下目标与背景的灰度之间存在着一定的对比度从而提取前景。
利用相邻帧间差分法进行目标检测的主要优点是:算法实现简单;程序设计复杂度低;易于实现实时监视。但在应用中存在二个问题,一是两帧间目标的重叠部分不容易被检测出来,即只检测出目标的一部分或者出现了较大比例的空洞,二是检测目标在两帧中变化的信息,这样会存在较多的伪目标点,检测出的目标往往比实际的目标大一些。
背景消减法可以提取出完整的目标图像,但在实际应用中仍有许多问题需要解决。实际应用中一幅标准的背景图像总是不容易得到的,一种简单的获取背景图像的方法是当场景中无任何目标出现时候捕获背景图像,很显然随着时间的推移,外界的光线会变化,这会引起背景图像的变化,因而这种人工的非自适应的方法获得的背景图像,会随着时间的推移,对场景中光照条件、大面积运动和噪声比较敏感,出现许多伪运动目标点,不利于目标的准确检测。
由于人群视频空域上每个像素点的灰度值是沿时间轴不断变化的一维随机信号。该信号的非平稳段意味着有前景人群通过该像素点,而平稳段意味着该点表示背景图像。本算法的核心想法就是提取每个像素点的平稳部分像素值。
这个部分的仿真结果如下所示:
图1 提取的背景
对应的代码如下所示:
function back3 = func_getbackground(image,frames,T);
rows = size(image,1);
cols = size(image,2);
d(1:rows,1:cols,1) = image(1:rows,1:cols,1);
for k = 2:frames
d(1:rows,1:cols,k) = image(1:rows,1:cols,k) - image(1:rows,1:cols,k-1);
end
//以上就是求解图像的差分
CDM(1:rows,1:cols,2:frames) = d(1:rows,1:cols,2:frames);
CDM(abs(CDM) < T)=0;
CDM(abs(CDM) >= T)=255;
//求CDM值
m=0;
for i=1:rows
for j=1:cols
for k=2:frames
if CDM(i,j,k) == 0
m(k)=1;
end
if CDM(i,j,k) == 255
m(k)=rand(1);
end
end
position(i,j) = func_position(m);
end
end
//求解CDM中最大的连0的坐标
for i=1:rows
for j=1:cols
back3(i,j) =image(i,j,position(i,j));
end
end
这里,基本上成功的获取的视频的背景,下面将根据提取的背景进行运动的检测。
2 运动物体检测
这里,我们主要通过原视频和提取的背景做差分运算,从而获得实际的运动物体,运动物体的检测,其主要流程为差分运算,二值化处理,形态学处理,边缘提取,最后获得运动物体的捕获。
选取适当的阈值就是既要尽可能保存图像信息,又要尽可能减少背景和噪声的干扰。
将当前帧和视频背景做差分运算,获得图像再做二值化处理,得到的仿真结果如下图所示:
图2 原视频与差分二值化处理后的视频
3.形态学处理
从上面的仿真结果可知,图中运动物体基本被提取出来了,但是提取出来的视频具有较大的噪声干扰,这样会严重影响实际的检测效果, 经过背景减后的二值化图像中,可能还存在一些噪声以及断裂,可以通过数学形态学处理使人群信息更加清晰、完整。数学形态学将二值图象看成是集合,并用结构元素进行“探测”。结构元素是一个可以在图象上平移、且尺寸比图象小的集合。基本的数学形态学运算是将结构元素在图象范围内平移,同时施加交、并等基本集合运算。数学形态学的实质是通过图象集合与结构元素间的相互作用来提取有意义的图象信息,不同的结构元素可以提取不同层面的图像信息。常用的二值图像的形态学运算有:膨胀运算、腐蚀运算、闭运算和开运算。通过MATLAB,仿真可以得到如下的仿真效果:
图4 bwareaopen函数处理效果
从图4的仿真结果可知,在差分背景之后的图中,存在大量的噪声干扰,通过形态学的处理,可以将大部分的噪点以及运动干扰去除,从而提高了整个系统的处理效果。
function images3 = func_morpho(image);
%***************************************************************
%This function is used to remove the noise
rows = size(image,1);
cols = size(image,2);
%Remove noise by size judging
images3(1:rows,1:cols)=bwareaopen(image(1:rows,1:cols),40);
end
4.边缘提取
边缘是指图像局部亮度变化最显著的部分。边缘主要存在于目标与目标、目标与背景、区域与区域(包括不同色彩)之间,是图像分割、纹理特征提取和形状特征提取等图像分析的重要基础。边缘提取首先检出图像局部特性的不连续性,然后再将这些不连续的边缘像素连成完备的边界。边缘的特性是沿边缘走向的像素变化平缓,而垂直于边缘方向的像素变化剧烈。通过边缘提取,可以有效的获得图像的轮廓,进一步,对图像的各种特征的提取具有十分重要的意思,本课题,所采用的边缘提取算法如下图所示:
该方法基本思想是判断当前非零点及其周围8个相邻点的值来判断是否为边界点。如图7,若一非零点的上、下、左、右四个邻点有任一点的像素为0,则判断该点为边界点;否则,若其相邻点像素均为0,则判断该点为内点。边缘提取的仿真效果如下图所示:
第五步:边缘检测
function images = func_edgedetection(image);
%***************************************************************
%This function is used to find the edge in binary image
rows = size(image,1);
cols = size(image,2);
for i=2:rows-1
for j=2:cols-1
%Find boundary pixel
if image(i,j)==1 &&(image(i+1,j)==0||image(i-1,j)==0||image(i,j+1)==0||image(i,j-1)==0)
images(i,j)=255;
else
images(i,j)=0;
end
end
end
%Boundary of image
images(rows,:)=0;
images(:,cols)=0;
end
通过上面的几个步骤,最终实现运动人体的检测,最后的仿真结果如下图所示:
(a).运动人体检测效果一
(b).运动人体检测效果二
图7 .运动人体检测效果仿真结果
function [res,res2] = func_detect(iamges0,images,seq);
[r,c] = size(images);
res(:,:,1) = seq;
res(:,:,2) = seq;
res(:,:,3) = seq;
for i = 1:r
for j = 1:c
if images(i,j) == 255
res(i:i,j:j,1) = 255;
res(i:i,j:j,2) = 0;
res(i:i,j:j,3) = 0;
else
res(i,j,1) = seq(i,j);
res(i,j,2) = seq(i,j);
res(i,j,3) = seq(i,j);
end
end
end
[rows,cols] = size(iamges0);
for i = 1:rows
for j = 1:cols
if iamges0(i,j) == 1
tt = rand(1,1);
if tt > 0.4
res2(i:i,j:j,1) = 255;
res2(i:i,j:j,2) = 0;
res2(i:i,j:j,3) = 0;
else
res2(i,j,1) = seq(i,j);
res2(i,j,2) = seq(i,j);
res2(i,j,3) = seq(i,j);
end
else
res2(i,j,1) = seq(i,j);
res2(i,j,2) = seq(i,j);
res2(i,j,3) = seq(i,j);
end
end
end
从上面的仿真结果可知,通过算法之后,基本实现了视频中每个运动个体的检测,图9中,红色部分即为实际运动的人体。但是,目前本算法仅仅实现了运动物体的检测,而没有实现每个个体的跟踪,在下一节,我们将介绍实现运动个体的跟踪的效果。
其仿真结果如下图所示:
(a). 运动人体跟踪仿真效果二
(b). 运动人体跟踪仿真效果二
图5 .运动人体跟踪仿真效果
从上面的仿真结果可知,采用本算法,可以成功的跟踪某个特定的运动人体。
clc;
clear;
close all;
warning off;
%调用视频
load people_1.mat
seq = uint8(seq);
n_frames = size(seq,3);
%显示视频的效果
implay(seq);
%调用子函数路径
addpath func_subset
%背景提取
back3 = func_background(seq,n_frames);
figure(1);
imshow(back3,[]);title('提取的背景');
%获得视频的长和宽
rows = size(seq,1);
cols = size(seq,2);
colors=['b.' , 'm.' , 'k.' , 'b*' , 'm*' , 'k*', 'bo' , 'mo' , 'ko',];
p = 1;
for k = 15:n_frames-90
disp('--------------------------------');
disp('Frame No.');k
figure(2);
subplot(331);
imshow(seq(:,:,k),[]);title('原始的图像');
%Frame differencing
images2(1:rows,1:cols) = func_framediff(seq(1:rows,1:cols,k),back3);
subplot(332);
imshow(images2,[]);title('差分结果');
%Morphological Processing
images3(1:rows,1:cols) = func_morpho(images2(1:rows,1:cols));
subplot(333);
imshow(images3,[]);title('滤波结果');
%Edge detection
images4(1:rows,1:cols) = func_edgedetection(images3(1:rows,1:cols));
subplot(334);
imshow(images4,[]);title('边缘检测效果');
%显示检测效果
[images5(1:rows,1:cols,1:3),images6(1:rows,1:cols,1:3),images7(1:rows,1:cols,1:3),Xcenters,Ycenters] = func_detect(images3,images4,seq(:,:,k));
subplot(335);
imshow(images5,[]);title('实际检测结果');
%进行跟踪
subplot(336);
imshow(images6,[]);title('人物跟踪');
subplot(337);
imshow(images7,[]);title('人物跟踪');
%进行跟踪
[images5t(1:rows,1:cols,1:3),images6t(1:rows,1:cols,1:3),images7t(1:rows,1:cols,1:3),Xcenterst,Ycenterst] = func_detect(images3,images4,seq(:,:,k-1));
if p == 1
for i = 1
for j = 1:length(Xcenterst)
d(i,j) = sqrt( (Xcenters(i)-Xcenterst(j))^2 + (Ycenters(i)-Ycenterst(j))^2 );
end
end
[V,I] = min(d);
else
for i = ind(p-1)
for j = 1:length(Xcenterst)
d(i,j) = sqrt( (Xcenters(i)-Xcenterst(j))^2 + (Ycenters(i)-Ycenterst(j))^2 );
end
end
[V,I] = min(d);
end
ind(p) = I;
if isempty(Xcenterst) == 0 & isempty(Xcenters) == 0
res3(1:rows,1:cols,1:3) = func_tracker(images3,seq(:,:,k),Xcenterst,Ycenterst,Xcenters,Ycenters,ind);
subplot(338);
imshow(res3,[]);title('人物跟踪');
else
subplot(338);
imshow(images7,[]);title('人物跟踪');
end
p = p + 1;
end
[01]Trucco E,Plakas K.Video Tracking:A Concise Survey.IEEE Journal of Oceanic Engineering. 2006
[02]Ismail Haritaoglu,David Harwood,Larry S Davis.W:Real-Time Surveillance of people and their activities.IEEE Transactions on Pattern Analysis and Machine Intelligence.2000.
[03]Meng Liu,Chengdong Wu,Yunzhou Zhang.A Review of Traffic Visual Tracking Technology. International Conference on Audio,Language and Image Processing.2008aA10-09