图像显示和视频拆分与视频合并

 

%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

 

posted @ 2020-11-04 23:06  白菜茄子  阅读(250)  评论(0编辑  收藏  举报