【问题标题】:YUV video to Images. Find the end of the video?YUV 视频到图像。找到视频的结尾?
【发布时间】:2015-03-25 20:17:44
【问题描述】:

我正在使用这个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 使用fseek 带绝对值跳转到文件中的特定帧,不能重复帧。您的代码中可能有错误。
  • 用代码编辑了问题。请检查
  • 我无法重现您描述的行为,它没有显示任何框架。
  • image = loadFileYuv('D:\test_data\test_ardu_2sec_short.yuv',320,240,i); 上面代码中的i 表示帧号。如果它超过了总帧数,仍然会返回一些值。检查任意i 那是什么?

标签: matlab image-processing yuv


【解决方案1】:

对于任何有效输入,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 像素。对于每个定义的 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');

【讨论】:

  • 计算总帧数(按每个像素的大小)的方法是近似值还是精确的?但它确实在该帧号之后失败,因此它会验证这一点。
  • 我在回答中添加了一些解释。
猜你喜欢
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多