YUV 视频转图像。找到视频的结尾了吗?
YUV video to Images. Find the end of the video?
我正在使用这个 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内置函数,而是一个开源函数,所以可能没有多少人知道它是如何运行的。但是你肯定可以从它的代码中得到一个想法。
对于任何有效输入 loadFileYuv
return 正确的输出。所以修复你的代码,不要传递任何无效的帧索引。你的循环应该结束于:
s=dir('D:\test_data\test_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 个字节。
对于大帧索引,函数总是return第一帧。这是因为未检查 fseek
的 return 值。
为了使函数更健壮,将第 15 行替换为:
assert(0==fseek(fileId, (idxFrame(f) - 1) * sizeFrame, 'bof'),'fseek failed, probably end of file is reached');
我正在使用这个 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内置函数,而是一个开源函数,所以可能没有多少人知道它是如何运行的。但是你肯定可以从它的代码中得到一个想法。
对于任何有效输入 loadFileYuv
return 正确的输出。所以修复你的代码,不要传递任何无效的帧索引。你的循环应该结束于:
s=dir('D:\test_data\test_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 个字节。
对于大帧索引,函数总是return第一帧。这是因为未检查 fseek
的 return 值。
为了使函数更健壮,将第 15 行替换为:
assert(0==fseek(fileId, (idxFrame(f) - 1) * sizeFrame, 'bof'),'fseek failed, probably end of file is reached');