图像显示和视频拆分与视频合并
%imread函数可以读取标准图像文件(TIFF、FPEG、PNG等).imread返回的数据类型取决于读取的图像类型
% 使用imwrite函数可以将matlab数据写入到各种标准图像格式
mimg=imread("C:\Users\Administrator\Desktop\matlab博客园\图片\1.jpg");
% 函数rgb2gray将彩色图像转换为灰度图像
mimg=rgb2gray(mimg);
% figure显示一个空白窗口
figure;
% imshow在窗口上显示一张图片
imshow(mimg);
% 其中mimg中存储的是0-255的整数矩阵,可以将整数矩阵转换为0-1的双精度矩阵
mimg=im2double(mimg);
% mat2gray函数实现矩阵的归一化,就是将矩阵的每个元素都变为0-1之间的小数
mimg=mat2gray(mimg);
%读取一个视频,显示每一帧图像
filename1='C:\Users\Administrator\Desktop\matlab博客园\03_VideoMatlab (1)\cba.avi';
obj1=VideoReader(filename1);
% VideoReader从名为filename1的文件中读取视频,并将数据复制给结构体变量obj1
% 结构体的成员:
% Name 视频文件名
% Path 视频文件路径
% Duration 视频的总时长(秒)
% FrameRate 视频帧速(帧/秒)
% NumberOfFrames 视频的总帧数
% Height 视频帧的高度
% Width 视频帧的宽度
% BitsPerPixel 视频帧每个像素的数据长度(比特)
% VideoFormat 视频的类型,如‘RGB24’
% Tag 视频对象的标识符,默认为空字符串
% Type 视频对象的类名,默认为VideoReader
% UserData 用户定义的数据,指定为任意数据类型的值,一般默认为[]
numframes=obj1.NumberOfFrames; %帧的总数
% read(obj) 获取该视频对象的所有帧
% read(obj,index) 获取该视频对象第index帧
% read(obj,[1 10]) 获取该视频的前十帧
% read(obj,inf) 获取最后一帧
for k=1:numframes %顺序读取数据
frame1=read(obj1,k);
imshow(frame1);
end
% 将一个文件夹下面的图像写入avi文件
sdirpath='C:\Users\Administrator\Desktop\matlab博客园\03_VideoMatlab (1)\Gait\';%图像所在的文件夹
savipath='C:\Users\Administrator\Desktop\matlab博客园\03_VideoMatlab (1)\abc1.avi';
WriteImgsToAVI(sdirpath,savipath);%自定义函数,将sdirpath下的图像合成视频,视频的存放地址为savipath
%合并两个avi视频文件
obj1=VideoReader("C:\Users\Administrator\Desktop\matlab博客园\03_VideoMatlab (1)\abc1.avi");%视频长度较小的视频
numframes=obj1.NumberOfFrames;
obj2=VideoReader("C:\Users\Administrator\Desktop\matlab博客园\03_VideoMatlab (1)\cba.avi");
for k=1:numframes
frame1=read(obj1,k);
frame2=read(obj2,k);
%find函数返回矩阵的索引,而且是单下标索引,按照列优先的方式返回
ind=find(frame1>100);%只要其中白色的部分
%因为这是彩色图片,所以对于每个像素点有三个值,也就是说对于每个像素点是个一维数组(含3个元素)
[rows,cols,clrs]=ind2sub(size(frame1),ind);%将单下标转换为多维形式
rowsnew=rows+200;
colsnew=cols+200;
indnew=sub2ind(size(frame2),rowsnew,colsnew,clrs);
frame2(indnew)=frame1(ind);
imshow(frame2);
end
自定义函数
function[]=WriteImgsToAVI(sdirpath,savipath)
myobj=VideoWriter(savipath);%创建一个视频对象
myobj.FrameRate=20;%修改myobj视频对象的帧速为20帧/s
open(myobj); %打开这个视频对象
%a1=strcat(s1,s2)将字符串s1,s2水平连接并赋值给a1
[files]=dir(strcat(sdirpath,'*.png'));%作用是列出该目录下所有后缀为.png的文件
numfiles=length(files)
for i=1:numfiles %图像序列的个数
fname=strcat(sdirpath,files(i).name);
frame=imread(fname);%读取该图像
writeVideo(myobj,frame);
end
close(myobj);
end
作者:孙建钊
出处:http://www.cnblogs.com/sunjianzhao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。