将视频截取成帧
fileName = 'q.avi'; %此处输入视频名称,要带后缀,注意好像只有wmv和avi格式
obj = VideoReader(fileName);
numFrames = obj.NumberOfFrames;% 帧的总数
for k = 1 :numFrames% 读取数据
frame = read(obj,k);
imshow(frame);
imwrite(frame,strcat(num2str(k),'.jpg'),'jpg');% 保存帧
End
灰度二值化图像
for i=1:numberofframe%numberofframe为图像张数
imageName=strcat(num2str(i),'.jpg');
I = imread(imageName);
imggray = rgb2gray(I);%灰度化图像
imwrite(imggray,strcat(num2str(i),'huidu.jpg'),'jpg');% 保存帧
i2=im2bw(I);% i2是二值图像,不需要求阈值
imwrite(i2,strcat(num2str(i),'erzhi.jpg'),'jpg');% 保存帧
end
背景差分法
filename = '103.jpg';%读原图
I = imread(filename);
X = rgb2gray(I);%读,灰度原图
filename = 'YCBJ.jpg';%读取背景图
M = imread(filename);
Y = rgb2gray(M);%读,灰度背景图
Z = imabsdiff(X,Y);%两图相减
level = graythresh(Z);
Z = im2bw(Z,level);%二值化图
% 膨胀腐蚀算子,相当于闭操作
se = strel('disk',2);
Q=imerode(Z,se);%腐蚀
Q=imdilate(Q,se);%膨胀
lab1='原图';
lab2='背景';
lab3='差分二值化后';
lab4='腐蚀膨胀后';
subplot(221);imshow(I);title(lab1);
subplot(222);imshow(M);title(lab2);
subplot(223);imshow(Z);title(lab3);
subplot(224);imshow(Q);title(lab4);
三帧差分法
filename1='110.jpg';%读取前一帧
I1 = imread(filename1);
O = rgb2gray(I1);%读,灰度前一帧
filename2='115.jpg';%读取中间帧图像
I2 = imread(filename2);
P = rgb2gray(I2);%读,灰度当前帧
filename3='120.jpg';%读取后一帧图像
I3 = imread(filename3);
Q = rgb2gray(I3);%读,灰度后一帧
A = imabsdiff(P,O);
level1 = graythresh(A);
A = im2bw(A,level1);%二值化前两帧差图
subplot(131);imshow(A);
B = imabsdiff(Q,P);
level = graythresh(B);
B = im2bw(B,level);%二值化后两帧差图
subplot(132);imshow(B);
for i=1:480
for j=1:720
C(i,j)=A(i,j)*B(i,j);
end
end
subplot(133);imshow(C);%二AB两图相与
帧差分循环读写
for i=1:numberofframe%numberofframe为帧数
filename=strcat(num2str(i),'.jpg');
I = imread(filename);
X = rgb2gray(I);%读,灰度原图
filename = 'YCBJ.jpg';
M = imread(filename);
Y = rgb2gray(M);%读,灰度背景图
Z = imsubtract(Y,X);%两图相减
level = graythresh(Z);
Z = im2bw(Z,level);%二值化图
% 膨胀腐蚀算子,相当于闭操作
se = strel('disk',3);
Z=imerode(Z,se);%腐蚀
Z=imdilate(Z,se);%膨胀
imwrite(Z,strcat(num2str(i),'Chafenghou.jpg'),'jpg');% 保存帧
end
掩模处理
D = imread('zhan.jpg');
%掩模处理
for j=1:720
for i=1:480
if(j<-2.39*i+765)
D(i,j)=0;
end
if(j>0.8*i+460)
D(i,j)=0;
end
if(i<140)
D(i,j)=0;
end
end
end
图像对称翻转
AA=imread('b.jpg');%文件名是你自己的哦
for k=1:3
B(:,:,k)=fliplr(AA(:,:,k));%左右翻转
end
imwrite(B,'obj.jpg','jpg');% 保存帧
简单的判断摔倒
BJ=imread('YCBJ.jpg');% 读取有物体彩色图片
fileName = '6.avi';
obj = VideoReader(fileName);
numFrames = obj.NumberOfFrames;% 帧的总数
for k = 1 :numFrames% 读取数据
T = read(obj,k);
A=imsubtract(BJ,T);
level = graythresh(A);
B = im2bw(A,level);%二值
for j=1:720
for i=1:480
if(j<-2.39*i+765)
B(i,j)=0;
end
if(j>0.8*i+460)
B(i,j)=0;
end
if(i<140)
B(i,j)=0;
end
end
end
% imwrite(B,strcat(num2str(k),'.jpg'),'jpg');% 保存帧
figure(1);
imshow(B);
[bwl,ln]=bwlabel(B,8);
STATS=regionprops(bwl,'Area');
a=0;
for n=1:ln
if(STATS(n).Area>500)
abc=(bwl==n);
[c,r]=find(abc==1);
a=a+1;
xbegin=min(r);
ybegin=min(c);
xlength=max(r)-xbegin;
ylength=max(c)-ybegin;
p=ylength/xlength;
if(p<=1)
hold on
rectangle('Position',[xbegin,ybegin,xlength,ylength],'EdgeColor','R','linewidth',3);
hold off
end
end
end
end
改善后的判断摔倒
BJ=imread('YCBJ.jpg');% 读取有物体彩色图片
fileName = '13.wmv';
obj = VideoReader(fileName);
numFrames = obj.NumberOfFrames;% 帧的总数
H=zeros(1,1);
S=zeros(1,1);
for k = 1:numFrames% 读取数据
T = read(obj,k);
A=imsubtract(BJ,T);
level = graythresh(A);
B = im2bw(A,level);%二值
for j=1:720
for i=1:480
if(j<-2.39*i+765)
B(i,j)=0;
end
if(j>0.8*i+460)
B(i,j)=0;
end
if(i<140)
B(i,j)=0;
end
end
end
% imwrite(B,strcat(num2str(k),'.jpg'),'jpg');% 保存帧
figure(1);
imshow(T);
[bwl,ln]=bwlabel(B,8);
STATS=regionprops(bwl,'Area');
a=0;
for n=1:ln
if(STATS(n).Area>50)
abc=(bwl==n);
[c,r]=find(abc==1);
xbegin=min(r);
ybegin=min(c);
xlength=max(r)-xbegin;
ylength=max(c)-ybegin;
p=ylength/xlength;
if(p<=1)
x=max(c);
y = 39.916*x-10881;
y1=y*0.8566;
y2=y*1.1434;
if(STATS(n).Area<y2&&STATS(n).Area>y1)
a=a+1;
H(k,a)=max(c);
S(k,a)=STATS(n).Area;
hold on
rectangle('Position',[xbegin,ybegin,xlength,ylength],'EdgeColor','R','linewidth',3);
hold off
end
end
end
end
End
将目标区域值存入矩阵数据分析
BJ=imread('YCBJ.jpg');% 读取有物体彩色图片
fileName = '1.avi';
obj = VideoReader(fileName);
numFrames = obj.NumberOfFrames;% 帧的总数
H=zeros(1,1);
S=zeros(1,1);
for k = 1:numFrames% 读取数据
T = read(obj,k);
A=imsubtract(BJ,T);
level = graythresh(A);
B = im2bw(A,level);%二值
imshow(B);
% imwrite(B,strcat(num2str(k),'.jpg'),'jpg');% 保存帧
[bwl,ln]=bwlabel(B,8);
STATS=regionprops(bwl,'Area');
a=0;
for n=1:ln
if(STATS(n).Area>400)
abc=(bwl==n);
[c,r]=find(abc==1);
a=a+1;
H(k,a)=max(c);%将联通区域底部坐标放到矩阵H中
S(k,a)=STATS(n).Area;%将联通区域面积坐标放到矩阵S中
end
end
end