我正在使用此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内置函数,而是一个开源函数,所以可能没有多少人知道它是如何运作的。但是你可以从它的代码中获得一个想法。
答案 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');