📄 framedif2.m
字号:
%求解视频的帧差分布 (方法二:X2法)
%读取视频
clear all;
clc;
tic;%start time
shot=mpgread('..\videos\cut.mpg',[1:200],'truecolor');%读取视频
%shot=aviread('video\skiing.avi');
frames=size(shot,2);
w=size(shot(1,1).cdata,1);%height
h=size(shot(1,1).cdata,2);%width
clf;
%axis off;
%movie(shot,1,25,[50 50 0 0]);
%gray
count1=zeros(256,1);
count2=zeros(256,1);
%rgb
countr1=zeros(256,1);
countr2=zeros(256,1);
countg1=zeros(256,1);
countg2=zeros(256,1);
countb1=zeros(256,1);
countb2=zeros(256,1);
%%%%
framedif=zeros(frames,1);
framedifr=zeros(frames,1);
framedifg=zeros(frames,1);
framedifb=zeros(frames,1);
framedifrgb=zeros(frames,1);
%%%%%%%%%%%求帧间差%%%%%%%%%%%%%%
divnum=64;%district num
phase=256/divnum;%division
%%
gray1=double(rgb2gray(shot(1,1).cdata));
%%%%%%%
r=double(shot(1,1).cdata(:,:,1));
g=double(shot(1,1).cdata(:,:,2));
b=double(shot(1,1).cdata(:,:,3));
for j=1:w
for k=1:h
count1(gray1(j,k)+1)=count1(gray1(j,k)+1)+1;
countr1(r(j,k)+1)=countr1(r(j,k)+1)+1;
countg1(g(j,k)+1)=countg1(g(j,k)+1)+1;
countb1(b(j,k)+1)=countb1(b(j,k)+1)+1;
end
end
district1=zeros(divnum,1);
district2=zeros(divnum,1);
%%%%%%%%%
districtr1=zeros(divnum,1);
districtr2=zeros(divnum,1);
districtg1=zeros(divnum,1);
districtg2=zeros(divnum,1);
districtb1=zeros(divnum,1);
districtb2=zeros(divnum,1);
for m=1:divnum
for n=1:phase
district1(m,1)=district1(m,1)+count1((m-1)*phase+n,1);
districtr1(m,1)=districtr1(m,1)+countr1((m-1)*phase+n,1);
districtg1(m,1)=districtg1(m,1)+countg1((m-1)*phase+n,1);
districtb1(m,1)=districtb1(m,1)+countb1((m-1)*phase+n,1);
end
end
for i=2:frames
%for c=1:3
gray2=double(rgb2gray(shot(1,i).cdata));
r=double(shot(1,i).cdata(:,:,1));
g=double(shot(1,i).cdata(:,:,2));
b=double(shot(1,i).cdata(:,:,3));
for j=1:w
for k=1:h
count2(gray2(j,k)+1)=count2(gray2(j,k)+1)+1;
countr2(r(j,k)+1)=countr2(r(j,k)+1)+1;
countg2(g(j,k)+1)=countg2(g(j,k)+1)+1;
countb2(b(j,k)+1)=countb2(b(j,k)+1)+1;
end
end
for m=1:divnum
for n=1:phase
district2(m,1)=district2(m,1)+count2((m-1)*phase+n,1);
districtr2(m,1)=districtr2(m,1)+countr2((m-1)*phase+n,1);
districtg2(m,1)=districtg2(m,1)+countg2((m-1)*phase+n,1);
districtb2(m,1)=districtb2(m,1)+countb2((m-1)*phase+n,1);
end
end
for m=1:divnum
if district2(m,1)~=0||district1(m,1)~=0
framedif(i,1)=framedif(i,1)+(district2(m,1)-district1(m,1))*(district2(m,1)-district1(m,1))/max(district1(m,1),district2(m,1));
end
if districtr2(m,1)~=0||districtr1(m,1)~=0
framedifr(i,1)=framedifr(i,1)+(districtr2(m,1)-districtr1(m,1))*(districtr2(m,1)-districtr1(m,1))/max(districtr1(m,1),districtr2(m,1));
end
if districtg2(m,1)~=0||districtg1(m,1)~=0
framedifg(i,1)=framedifg(i,1)+(districtg2(m,1)-districtg1(m,1))*(districtg2(m,1)-districtg1(m,1))/max(districtg1(m,1),districtg2(m,1));
end
if districtb2(m,1)~=0||districtb1(m,1)~=0
framedifb(i,1)=framedifb(i,1)+(districtb2(m,1)-districtb1(m,1))*(districtb2(m,1)-districtb1(m,1))/max(districtb1(m,1),districtb2(m,1));
end
end
%framedif(i,1)=framedif(i,1)/(2*w*h);
%framedifr(i,1)=framedifr(i,1)/(2*w*h);
%framedifg(i,1)=framedifg(i,1)/(2*w*h);
%framedifb(i,1)=framedifb(i,1)/(2*w*h);
framedifrgb(i,1)=(framedifr(i,1)+framedifg(i,1)+framedifb(i,1))/3;
if (framedif(i,1)>=50000)%%output the frames before and after the shot change
figure(1),
subplot(121),imshow(shot(1,i-1).cdata),xlabel(strcat('第',int2str(i-1),'帧')),title('突变前图像帧');
subplot(122),imshow(shot(1, i).cdata),xlabel(strcat('第',int2str( i),'帧')),title('突变后图像帧');
end
district1=district2;
districtr1=districtr2;
districtg1=districtg2;
districtb1=districtb2;
district2=zeros(divnum,1);
districtr2=zeros(divnum,1);
districtg2=zeros(divnum,1);
districtb2=zeros(divnum,1);
count2=zeros(256,1);
countr2=zeros(256,1);
countg2=zeros(256,1);
countb2=zeros(256,1);
end
%%%%%%%%%绘制图形%%%%%%%%%%%
figure(2),
%axis([0,100,0,60000])
axis auto;
plot(framedif);
hold;
%figure,
%plot(framedifr,'r');
%figure,
%plot(framedifg,'g');
%figure,
%plot(framedifb,'b');
%figure,
plot(framedifrgb,'--k');
xlabel('帧数');% x label
ylabel('直方图帧差');%y label
title('X2法直方图帧差统计');%title setting
l=legend('灰度值','彩色量');
box on;
%set(gca,'Color','none');
%set(l,'color','none');
%text(90,65000,'突变边界');
%line([0,150],[60000,60000],'color','k','linestyle','-.');
toc;%统计时间
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -