MATLAB+VideoReader+二帧间差分法
刚刚接触图像处理没多久,由于之前并没有学过C++,所以现在正在用MATLAB做仿真。
今天刚开始目标检测算法的帧间差分法,遇到了很多问题,今晚解决了一部分,记录一下心得。并将相关错误列举出来,避免小白再走弯路。
遇到的问题
(1)未定义函数或变量 ‘mmreader’。
(2)错误使用 VideoReader/read
帧范围必须为 1x2 矢量形式的帧索引,第一个值小于或等于第二个值。
帧索引必须为大于零的数值,并且小于或等于文件中的帧数。
(3)索引超出矩阵维度。
对应的解决方法
(1)以前matlab中读取视频 使用mmreader等,而现在matlab有一个专门的视频读取类 VideoReader完成视频读取的功能。
avi=VideoReader('vtest.avi')
(2)读数视频帧数,以防超出帧索引
numFrames = obj.NumberOfFrames %读取视频的帧数
(3)对于直接读取的视频,imshow等函数不支持,读取视频帧后可以解决类似的错误
shipin=read(obj,[10 150]); %读取视频帧10-150帧
特别提醒
mov(k)是一个结构体,mov(k).cdata实际上就是一个有RGB的帧。
有了这个结构体,后续处理就简便了好多!
仿真图片
第11帧
第12帧
第十三帧
11-12帧 二帧间差分
12-13帧 二帧间差分
.M文件(附较详细注释)
%%%二帧间差分法
clc;
clear all;
close all;
obj = VideoReader(‘vtest.avi’); %读取视频
numFrames = obj.NumberOfFrames %读取视频的帧数
shipin=read(obj,[10 150]); %读取视频帧
N=2; %考虑N帧的帧间差分法
start=10; %起始帧
threshold=20; %二值化的阈值
for k=1+start:N+1+start
figure(k)
imshow(shipin(:,:,:,k));
mov(k).cdata=rgb2gray(shipin(:,:,:,k)); %将彩色图像转换为灰度图像,变成二维;
% mov(k)是一个结构体,mov(k).cdata实际上就是一个有RGB的帧
end
[row,col]=size(mov(1+start).cdata); %以mov(1+start).cdata的格式生成一个矩阵
alldiff=zeros(row,col,N); %生成一个三维的矩阵alldiff用于存储最终的各个帧的差分结果
for k=1+start:N+start
diff=abs(mov(k).cdata-mov(k+1).cdata); %邻帧差分,并求行列式的值
idiff=diff>threshold; %二值化,idiff中的数据位逻辑值,diff中的数值为unit8
alldiff(:,:,k)=double(idiff);
end
i=1; %观察仿真结果
for k=1+start:N+start
figure(i);
imshow(alldiff(:,:,k))
title(strcat(num2str(k),‘帧’,’-’,num2str(k+1),‘帧’)); %strcat:横向连接字符串。
i=i+1;
end
引用相关博客网址
【1】https://blog.csdn.net/shmilymdt/article/details/48245519
【2】https://www.baidu.com/link?url=YbubYE_O9afp4qlPfYlLWU61Mg5x6FyFlFpkrZWY8pyDBd7hl_DlSBVTeMgpFCWk-Q-1DTvGfv40C8p9VAPcKK&wd=&eqid=f056b49000010724000000035c8f8581
【3】https://www.baidu.com/link?url=BvyQU6O1oX3KI6lnIa-38_p4JWex__rtX-rj6pesYCXn89sbfKqxCwq_JXMHsl0zUnC2gRhsRvxgeq7rfSYuOEIRyWp5biHD8VsUuM4_4X3&wd=&eqid=a9c9026a00000b9b000000035c8f8152
感谢
刚入坑没多久,感谢各位CSDN大神提供了很多代码。
小白很菜,希望也能尽自己小小的一份力量。愿再回首,自己会笑。
大家晚安,好梦!