YUV视频到图像.找到视频的结尾



我正在使用此函数将YUV视频转换为图像。它一帧一帧地读取视频,效果很好
我正在循环浏览所有的帧,当所有的帧都被读取时,我必须在末尾停止。问题是,它不会告诉我已经到达终点,并继续以循环的方式显示帧,即在最后一帧之后出现第一帧,依此类推。如果我能以某种方式知道帧的总数,我就可以打破循环

function[intensity_array] = roi()
intensity_array = [];
for i=1:1000000000
    try
        image = loadFileYuv('D:test_datatest_ardu_2sec_short.yuv',320,240,i);
        roi = image.cdata([37:52],[278:290],1);  % y,x row, column
        max_red_intensity = max(max(roi));
        intensity_array(end+1) = max_red_intensity;
    catch
        intensity_array(end+1) = 0;
        break
    end    
    disp(['iter:', num2str(i)]);
end
end

我看到,一旦到达最后一帧,就会出现一些错误(如下),然后循环再次开始。那么我可以在那里休息吗?

Error using reshape
To RESHAPE the number of elements must not change.
Error in loadFileYuv (line 18)
    imgYuv(:, :, 1) = reshape(buf, width, height).'; % reshape

p.S:这不是一个内置的matlab函数,而是一个开源函数,所以可能没有多少人知道它是如何操作的。但你肯定可以从它的代码中得到一个想法。

对于任何有效的输入,loadFileYuv返回正确的输出。因此,请修复您的代码,不要传递任何无效的帧索引。您的循环应在以下位置结束:

s=dir('D:test_datatest_ardu_2sec_short.yuv')
num_of_frames=s.bytes/1.5/320/240

如果分辨率为320*240,则会有320*240个Y像素。对于每个定义的U和V,分辨率降低了4倍至160*120。因此,您有1.5*320*240像素,每个像素有1个字节。

对于大帧索引,函数总是返回第一帧。这是因为未检查fseek的返回值。

为了使功能更加强大,将第15行替换为:

assert(0==fseek(fileId, (idxFrame(f) - 1) * sizeFrame, 'bof'),'fseek failed, probably end of file is reached');

最新更新