最近查了好多资料做图像的读取操作,早期的matlab版本中的avifile,addframe等函数都已经删除了,需要用videowriter来做,所以先总结一下最近在处理的事情,剩下的慢慢更新。
这个的作用是把一帧图像写入到视频文件OBJ,frame通常通过getframe函数返回值,cdata和colormap,如f.cata;f,colormap.而且对于写入的文件来说,高度和宽度是始终不变的量,在相应的配置文件中定义着一些方法。
二维的cdata(height×width)
选用的配置 | 操作 |
---|---|
索引灰度avi文件 | 使用提供的帧 |
其他配置 | 使用colormap创建RGB图片帧 |
三维的cdata(height×width×3)
选用的配置 | 操作 |
---|---|
索引灰度avi文件 | 提示错误 |
其他配置 | 不使用colormap,使用cdata创建RGB图片帧 |
如`
backProjectionFrame = zeros(M.Height,M.Width,3);`
backProjectionFrame(:,:,3) = probabilityMap;
writeVideo(OBJ,MOV)
它将一个视频文件中写入视频(帧结构序列),每一个帧包含cdata和colormap。
writeVideo(OBJ,IMAGE)
它将图像写入到视频文件。IMAGE是数组,里面的数据包括single,double或者unsigned int,包含灰度或者RGB的图片。在所有帧中高度和宽度必须是一样的。
当写入这些文件的时候数据必须在0~1之间。
writeVideo(OBJ,IMAGES)
和上面那个相比,它是把一序列的图像写进去,
格式是(高度×宽度×3×帧数)
结合一个例子理解一下如何向视频写入图片,官方的文件里有这样一句话:
Write image frames to the file.
Convert the input frames into a format that is required
for writing to the file. This involves both colorspace
and datatype conversion
翻译过来就是先把帧的信息变成规定的格式,参照上面的配置来写入,格式中要包含color和data信息。
比如今天再做视频,处理目标跟踪,想加入目标跟踪框,那么我先创建一个框的图片。对于一个图片而言,可以用数组的形式表示,一个像素点间隔就是一,比如说我定义一个矩阵
首先我们要画一个框,包含row和column信息,那么容易知道他们的长宽,rmax-rmin和cmax-cmin,定义个二维矩阵即
thisFrame=zeros(rmax-rmin,cmax-cmin)
此时我们先考虑灰度图,灰度图的话相应的参数给[0,1]即可。比如代码如下
- 初始化r和c的信息
rmin=50; rmax=180; cmin=37; cmax=216;
thisFrame=zeros(rmax-rmin,cmax-cmin);
thisFrame(rmin:rmax, cmin:cmin+1)=0.5;
thisFrame(rmin:rmax, cmax-1:cmax)=0.5 ;
thisFrame(rmin:rmin+1, cmin:cmax)=0.5 ;
thisFrame(rmax-1:rmax, cmin:cmax)=0.5;
imshow(thisFrame);
可以得到这样的,由于设置位0.5说明是灰色。
这里设计的时候cmin:cmin+1想加粗一圈。
很直观的可以看出来多了一行和一列。
上面是针对二维的情况,也就是灰度图,那么如果想使用RGB的话怎么办?
RGB中是三维的,因此我们要定义这个图片时候需要多一个维度,即thisFrame=zeros(rmax-rmin,cmax-cmin,3);
写入RBG的值
R=0.933;
G=0.375;
B=0.375;
thisFrame(rmin:rmax, cmin:cmin+1,1)=R;
thisFrame(rmin:rmax, cmax-1:cmax,1)=R;
thisFrame(rmin:rmin+1, cmin:cmax,1)=R;
thisFrame(rmax-1:rmax, cmin:cmax,1)=R;
thisFrame(rmin:rmax, cmin:cmin+1,2)=G;
thisFrame(rmin:rmax, cmax-1:cmax,2)=G;
thisFrame(rmin:rmin+1, cmin:cmax,2)=G;
thisFrame(rmax-1:rmax, cmin:cmax,2)=G;
thisFrame(rmin:rmax, cmin:cmin+1,3)=B;
thisFrame(rmin:rmax, cmax-1:cmax,3)=B ;
thisFrame(rmin:rmin+1, cmin:cmax,3)=B ;
thisFrame(rmax-1:rmax, cmin:cmax,3)=B;
imshow(thisFrame);
那么操作的时候只需写
open(avi_trackingVideo);
writeVideo(avi_trackingVideo,thisFrame);
就可以在视频中显示结果了,默认是存在matlab的bin文件夹中。类似的,如果你想写入其他图像,也需要图像的位置信息和色彩信息进行操作。