分为三部分
1、Graph-Cut based Object Segmentation
2、Tracking-based Video Cut-out
3、光滑处理Video Matting
具体要求是:
1,静态图片的目标提取,要用最好的算法或者要有一点改进
2,使用目标跟踪来提取视频中的目标,不必用光流法,用最好或最新的算法或者有改进
3,对目标进行光滑处理的时候,能够通过调整阀值,来区分毛发和背景
必须是要实时进行
分别对三个部分进行介绍:
1、Graph-Cut based Object Segmentation
1,静态图片的目标提取,要用最好的算法或者要有一点改进
这个通过对静态图片的目标提取仿真后,应用到视频的目标提取,因为在实际中,视频是由多个帧图像构造的,本质上也是图像。
这里使用的算法,本质上就是对当前帧的图像进行分割提取处理。
这里,图像目标分割,我们主要采用的是一种基于改进的物体轮廓提取算法。
这里,我们使用的算法是一种改进的基于活动轮廓的目标提取算法。这里,我们主要使用一种基于概率密度函数来计算目标区域和背景区域不同来进行分割的。
仿真测试1:
仿真测试2:
仿真测试3:
从上面的仿真效果可知,通过目标提取,可以有效的获得图片中的目标,但是从提取的结果可知,其边缘有一些毛刺干扰,因此,我们在进行做跟踪的时候,需要进行实时的光滑处理。
2、Tracking-based Video Cut-out
2,使用目标跟踪来提取视频中的目标,不必用光流法,用最好或最新的算法或者有改进
这里,我们所需要的跟踪算法和一般的跟踪算法不同,因为一般的很多文献的跟踪算法都是产生一个大致的区域(多为矩形方框区域)来进行跟踪的,由于本课题需要最后替换背景,因此,必须完整的得到整个目标的轮廓进行跟踪。这里,首先对一个已经录制好的视频进行仿真处理,得到的结果如下所示:
算法会对该运动目标进行实时的轮廓跟踪,为背景的替换奠定了基础。
仿真效果如上所示。更换好背景的跟踪效果。
3、光滑处理Video Matting
3,对目标进行光滑处理的时候,能够通过调整阀值,来区分毛发和背景
主要在上面两个步骤的基础上,进一步优化分割效果,从而使得分割后的结果根据完美。因为在实际轮廓提取的时候,会出现目标边缘曲线不光滑,而且对于一些比较“狭长”的目标,提取的轮廓往往会出现覆盖的问题,针对这些问题,我们将初始提取的轮廓进行进一步的光滑处理。
在做光滑处理之前,得到的轮廓曲线如下图像所示:
从上面的仿真结果可知,如果没有加入光滑处理,其轮廓曲线比较粗糙,不是很光滑,而且部分边界存在残缺,没有完全“围住”目标的轮廓,此外,目标中间的有部分区域被误认为是背景区域而被错误的去除,所以,我们需要增加光滑处理算法使得得到的轮廓更加平滑。
这里,我们采取的算法策略为根据文献中讲到的算法,进行边缘的光滑处理。通过仿真,得到的提取效果如下所示:
对比上面的仿真结果可知,加入光滑处理之后,效果得到进一步的改善。A10-21
clc;
clear;
close all;
warning off;
addpath 'func\'
%粒子更新滤波
Para_Updata = [1,0,1,0;
0,1,0,1;
0,0,1,0;
0,0,0,1];
Num_Particles = 8000;
X_rgb = 20;
X_pos = 8;
X_vec = 4;
%读取视频以及视频参数
PIX_Size = [160,200];
%粒子初始化
X1 = func_Particle_initial(PIX_Size,Num_Particles);
X2 = func_Particle_initial(PIX_Size,Num_Particles);
delete(imaqfind);
%Set up video object. Note: to change to a different camera (or camera setup) change the following line:
vid = videoinput('winvideo',1,'YUY2_640x480');
%Set the video object to always return rgb images:
set(vid, 'ReturnedColorSpace', 'rgb');
triggerconfig(vid,'manual');
start(vid)
%Initialize frame Frm and fps variable
Frm = 0;
fps = 0;
%Set the total runtime in seconds
runtime = 100;
h = figure(1);
tic;
timeTracker = toc;
while toc < runtime
toc
Frm = Frm + 1;
%获得摄像头图像
img = getsnapshot(vid);
img = double(imresize(img,[PIX_Size]));
figure(1);
subplot(121);
imshow(uint8(img));
axis off
title('摄像头视频获取');
%获得每一帧图像
PIX_each_frame = img;
if Frm > 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%更新粒子
X2 = func_Particle_Updata(Para_Updata,X_pos,X_vec,X2);
%计算状态
STATE2 = func_Likelihood(X_rgb,[220;160;160],X2(1:2,:),PIX_each_frame);
%粒子重采样
X2 = func_Particle_Resample(X2,STATE2);
%跟踪效果显示
subplot(122);
image(PIX_each_frame/max(max(max(PIX_each_frame))));
STR = ['粒子跟踪效果',num2str(Frm)];
title(STR)
hold on
plot(X2(2,:),X2(1,:),'g.');
hold off
axis off
set (gcf,'Position',[200,300,800,250], 'color','w')
drawnow;
end
end
stop(vid)
% figure;
% for Frame = 1:Frm
% subplot(121);
% imshow(uint8(OLD{Frame}));title('原始图像');
% subplot(122);
% imshow(uint8(NEW{Frame}));title('新背景图像');
% pause(0.05);
% end