YUV视频到图像。找到视频的结尾?

时间:2015-03-25 09:23:57

标签: matlab image-processing yuv

我正在使用此Function将YUV视频转换为图片。它逐帧读取视频并且工作正常。
我循环遍历所有帧,并且必须在读取所有帧时停止。问题是它没有告诉我到达终点并继续以循环方式显示帧,即在最后一帧到达第一帧之后,依此类推。如果我能以某种方式知道我可以打破循环的总帧数。

function[intensity_array] = roi()
intensity_array = [];
for i=1:1000000000
    try
        image = loadFileYuv('D:\test_data\test_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内置函数,而是一个开源函数,所以可能没有多少人知道它是如何运作的。但是你可以从它的代码中获得一个想法。

1 个答案:

答案 0 :(得分:2)

对于任何有效输入loadFileYuv,返回正确的输出。所以修复你的代码,而不是传递任何无效的帧索引。你的循环应该结束于:

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

分辨率为320 * 240,你有320 * 240 Y-Pixes。对于每个定义的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');