您的当前位置:首页正文

matlab提取给定视频的背景-并根据此背景将视频中的运动物体提取出来

2021-03-10 来源:星星旅游
提取给定视频的背景,并根据此背景将视频中的运动物体提取出来

一.代码如下:

第一个函数代码如下:

clear;

mov=VideoReader(’1。avi’);%读取视频函数 imgRgb = read(mov,1);%读取一帧视频

imgRgb1 = im2double(imgRgb);%图像数据转化为双精度 R1 = imgRgb1(:,:,1); G1 = imgRgb1(:,:,2); B1 = imgRgb1(:,:,3); q = 1;

for t=2: 20 :mov。NumberOfFrames%2到帧的总数,每次以20增长

imgRgb = read(mov,t);%读取每一帧视频 subplot(221);

imshow(imgRgb);%显示每一帧 drawnow;%刷新屏幕

imgRgb1 = im2double(imgRgb); R = imgRgb1(:,:,1); G = imgRgb1(:,:,2); B = imgRgb1(:,:,3); R1 = R + R1; G1 = G + G1; B1 = B + B1; q = q+1; R2 = R1*1/q; G2 = G1*1/q;

B2 = B1*1/q;%每一次都取的均值 end

background = cat(3,R2,G2,B2);%将矩阵合并 subplot(222); title(’±³¾°’);

imshow(background,[]);%显示背景

imwrite(background,’D:\\»úÆ÷Óã\\ÊÓƵ´¦ÀíÔöÇ¿\\result。jpg','jpg');%保

存帧

第二个函数代码如下:

clear all;%清除所有

mov = VideoReader('1.avi’); %读取视频函数 imgRgb = imread(’result.jpg’);%读取保存帧 imgRgb1 = im2double(imgRgb);%图像数据转化为双精度

for ii =1000: 20 :mov。NumberOfFrames%从1000到帧的总数,以20为增量作为循环 zhen = read(mov,ii);%读的帧的图像 subplot(221) title(’vision');

imshow(zhen);%显示zhen的图像 drawnow; %刷新屏幕

zhen1 = im2double(zhen);%将zhen的图像变为双精度 cha = zhen1 - imgRgb1; %cha为实际图像与底图的差值

cha1=im2bw(cha,0。2);%将灰度图像转化为二值图像,而设置的阀值为0。2 for i = 1 : 240; for j = 1 : 320; if(i < (-j+180)) cha1(i,j) = 0; end end

end

cx = 0; cy = 0; nn = 0;

for i = 1 : 240; for j = 1 : 320; if(cha1(i,j)==1) cx = cx+i; cy = cy+j; nn = nn+1; end end

end %这个程序写的有问题nn的值再变,不是一直是1. if(nn〉0)

fx = round(cx/nn);%四舍五入取整 fy = round(cy/nn); %四舍五入取整

fprintf(’第一个点(%d,%d)\\n’ , fy,(240-fx) ); subplot(223) grid on;

title(’rule’);

axis([0 320 0 240]);

plot(fy,(240—fx)'.’); %显示二维数组,但是因为程序循环的问题,并没有打印出来。 drawnow; hold on; end subplot(222)

imshow(cha1,[]); %显示二值图像 drawnow; end

二.后期的处理

1. 不屏蔽写上部分的后,且二值化的阈值设置为0.2的图像如图2—1 二值0.2所示:

图2-1 二值0.2

2. 阈值为0。4的图像如图2-2 二值化0.4所示:

图2-2 二值0。4

※整体的程序并没有做人体形态处理和噪点的去除,后期还需要改进。

因篇幅问题不能全部显示,请点此查看更多更全内容