1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
视频图像分析是近年来计算机视觉领域中备受关注的前沿方向。从技术角度而言,其研究内容相当丰富,主要涉及到模式识别、图像处理、计算机视觉、人工智能等学科知识;同时动态场景中运动的快速分割、非刚性运动、目标之间互相遮挡或停止的处理等也为视频图像分析研究带来了一定的挑战。其中人运动的视觉分析是近年来计算机视觉领域中备受关注的前沿方向,它从包含人的图像序列中检测、识别、跟踪人并对其行为进行理解和描述,属于图像分析和理解的范畴。
其研究核心主要是从单个或多个视频序列中检测和跟踪运动人体,获取数据信息,进而描述和理解人体运动。这是一个很有挑战性的跨学科的研究课题,涉及到计算机视觉、计算机图形学、图像处理、模式识别和人工智能等多个学科。
目前,对于运动物体的检测和跟踪技术有着广泛的应用,概括起来有如下几个方面:
·智能监控:在银行、商店、停车场等对安全要求敏感的场合的保安设施中常常都装有一些可视化的监控设备。
·感知接口:在高级用户接口应用领域,希望计算机或机器人能更加智能的感知外部环境,即能通过识别跟踪分析使用者的面部表情、身体姿势和于势等的含义,来达到与人的交流,提高计算机或机器人的智能水平。
·运动分析:跟踪图像序列中感兴趣的人体部位,获得其运动特性。
·虚拟现实:目前许多电脑游戏中人体、动物行为的逼真设计效果得益于人体及动物的运动跟踪分析。
2.1 背景提取
由于人群视频空域上每个像素点的灰度值是沿时间轴不断变化的一维随机信号。该信号的非平稳段意味着有前景人群通过该像素点,而平稳段意味着该点表示背景图像。本算法的核心想法就是提取每个像素点的平稳部分像素值。假设某一帧的图像序列的像素值为I,那么相邻帧之间的像素值变化为:
式子1表示,当差值大于某个门限值的时候,像素变化为两者的差值,而当小于某个门限的时候,那么认为像素值没有改变,即为0.那么通常情况下,这个亮度变化会满足的如下的变化情况:
从上图的曲线可知,当某一段的值为0的时候,这说明这段的像素值没有发生改变,即这段的像素值即为实际的背景像素值。
2.2 运动物体检测
主要通过原视频和提取的背景做差分运算,从而获得实际的运动物体,运动物体的检测,其主要流程为差分运算,二值化处理,形态学处理,边缘提取,最后获得运动物体的捕获。经过背景消减法获取的前景,可以通过设置阈值得二值图像。
2.3 形态学处理
图中运动物体基本被提取出来了,但是提取出来的视频具有较大的噪声干扰,这样会严重影响实际的检测效果, 经过背景减后的二值化图像中,可能还存在一些噪声以及断裂,可以通过数学形态学处理使人群信息更加清晰、完整。数学形态学将二值图象看成是集合,并用结构元素进行“探测”。结构元素是一个可以在图象上平移、且尺寸比图象小的集合。基本的数学形态学运算是将结构元素在图象范围内平移,同时施加交、并等基本集合运算。数学形态学的实质是通过图象集合与结构元素间的相互作用来提取有意义的图象信息,不同的结构元素可以提取不同层面的图像信息。常用的二值图像的形态学运算有:膨胀运算、腐蚀运算、闭运算和开运算。
3.MATLAB核心程序
%获得视频的长和宽 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('人物跟踪'); %进行跟踪 .................................................................... 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