clc close all clear all addpath('TOOLS'); %基础函数对应的文件夹 addpath('sample'); %测试视频序列对应的文件夹 videoname = 'rhinos.avi'; %测试视频序列文件名 video = VideoReader(videoname); mbSize = 16; p =15; frames = 45 %测试视频帧数 for i = 1:frames % frame = readframe(video,i); % 读取每一帧 imgINumber = i; imgPNumber = i+2; videoI = read(video,imgINumber); videoP = read(video,imgPNumber); imgI = double(rgb2gray(videoI)); imgP = double(rgb2gray(videoP)); [row,col] = size(imgI); % Exhaustive Search 基于块的全搜索算法 [BlockCenter, motionVect, computations] = motionEstES(imgP,imgI,mbSize,p); %P帧重构图像 imgPComp = motionComp(imgI, motionVect, mbSize); ESpsnr(i+1) = imgPSNR(imgP, imgPComp, 255); EScomputations(i+1) = computations; %P帧重构误差图像 imagePDiff = imgP - imgPComp; if i ==4 figure; imageI = uint8(imgI); imageP = uint8(imgP); imagePComp = uint8(imgPComp); imagePDiff = uint8(imagePDiff); subplot(221);imshow(imageI); title('I帧参考图像') subplot(222);imshow(imageP); title('P帧当前图像') subplot(223);imshow(imagePComp); title('P帧当前重构图像') subplot(224);imshow(imagePDiff); title('P帧当前重构误差图像') %-------------画出运动矢量图-------------------------------- figure; quiver( BlockCenter(2,:),BlockCenter(1,:), motionVect(2,:), motionVect(1,:), .2,'r'); axis([0 320 0 240]); for i=mbSize:mbSize:col-mbSize x = [i,i]; y = [0,row]; line(x,y,'LineStyle','-','Marker','none'); end for j=mbSize:mbSize:row-mbSize x = [0,col]; y = [j,j]; line(x,y,'LineStyle','-','Marker','none'); end xlabel('X'); ylabel('Y'); end end
时间: 2024-04-09 21:30:39 浏览: 86
matlab中常见函数功用.pdf
这段代码是一个视频序列处理的示例代码。首先,它通过`VideoReader`读取了一个视频文件,并设置了一些参数,如`mbSize`(块的大小)和`p`(搜索窗口大小)。然后,通过循环遍历每一帧图像,对每一帧进行运动估计和重构。
在每一帧中,它将当前帧和参考帧转换为灰度图像。然后,使用基于块的全搜索算法(`motionEstES`)进行运动估计,得到运动矢量。接下来,使用运动矢量对参考帧进行运动补偿(`motionComp`),得到重构的P帧图像(`imgPComp`)。计算P帧图像与原始P帧之间的峰值信噪比(`imgPSNR`)和计算量。
接着,它绘制了四个子图:原始I帧图像、原始P帧图像、重构的P帧图像和重构误差图像。然后,通过使用`quiver`函数绘制了运动矢量图,并在图像上绘制了水平和垂直的分割线。
最后,请注意代码中的`clear all`命令会清除所有已定义的变量,这可能会影响后续代码的执行。此外,`addpath`命令用于添加文件夹路径,以便在代码中使用对应的函数或数据文件。
这段代码可以作为视频序列处理的一个示例,你可以根据实际需求进行修改和扩展。
阅读全文