如何在simulink中处理视频帧

时间:2012-09-28 11:39:30

标签: simulink

我正在研究simulink中的视频。我们知道多媒体文件块一次读取一帧,所以当我用matlab功能块附加它时,它应该用imread命令一次读取一帧。如果我双击matlab功能块(如http://tinypic.com/view.php?pic=dggujd&s=6所示),那么你将看到我必须在matlab mfile中输入函数的名称和输入;在这种情况下是视频(命名为convid.avi)。我一次只读一帧,但我把整个视频作为matlab函数的参数。这是问题我该如何解决它。应该在matlab函数块中作为参数给出,而不是整个视频。我还在http://tinypic.com/view.php?pic=55jggw&s=6上传了我的模型。我用于vidfunc的代码是:

function h=vidfunc(u)
a=imread(u); % read frame
BW = edge(a,'sobel'); %sobel edge detection
[H,thetaa,rhoo]=hough(BW); % Hough Transform
P = houghpeaks(H,6,'threshold',ceil(0.5*max(H(:))));
lines=houghlines(BW,thetaa,rhoo,P,'FillGap',15,'Minlength',15)
figure,imshow(I),hold on
for k = 1:length(lines) % Draw lines
 xy = [lines(k).point1; lines(k).point2];
 z(k)=lines(k).point2(2);
 plot(xy(:,1),xy(:,2),'LineWidth',1,'Color','green');
 end
 h=z(k)

1 个答案:

答案 0 :(得分:1)

看起来在这个“Simulink”模型中完成的工作实际上是由MATLAB函数执行的。所以这个问题的答案很大程度上取决于该功能实际上在做什么。具体来说,vidfunc的预期输入是什么,这个函数的输出是什么?我怀疑可能需要修改此功能以适合您的模型。

要调试模型,考虑每个块的信号输出是有用的。在每个时间步,您的From Multimedia File块将输出单个图像帧,根据doc看起来要构造为

  

M-by-N-by-P​​彩色视频信号,其中P是彩色平面的数量。

向下游移动,接下来我们来到Color Space Conversion块,在这种情况下看起来它很可能以M-by-N矩阵的形式输出图像帧(其中矩阵的每个元素)对应于该像素处的图像强度。)

现在我们来到有趣的部分 - MATLAB Fcn块。正如我们刚刚看到的,该块的输入将是表示单个图像帧的M×N矩阵。当您查看MATLAB Fcn块的参数对话框时,此块的输入由变量u表示。因此,要在输入到此块的图像帧上执行vidfunc功能,只需为 MATLAB函数输入vidfunc(u)

现在,根据转到MATLAB Fcn块的输入,以及将视频查看器块连接到输出的事实,vidfunc的结构应使其在单个图像上运行帧作为其输入并输出另一个单个图像帧。如果vidfunc没有以这种方式构建,则需要对其进行编辑(或者仅使用Simulink块重新实现相同的功能)。

也就是说,我们假设vidfunc也返回表示已处理图像帧的M×N矩阵。您需要将MATLAB Fcn块的输出维度参数设置为-1,以指示输出与输入的尺寸相同。此外,(如doc所示)您需要确保折叠2-D结果为1-D 未选中,否则您的图像输出将是一个长向量而不是M-by-N矩阵的形式。

如果vidfunc结构正确,这可以解决您的问题。

注意:为了让您的生活更轻松,我强烈建议您在Simulink模型中显示信号数据类型和尺寸。这有助于避免很多混乱。这个doc详细描述了如何执行此操作。

<强> - UPDATE -

在查看您的代码之后,这证实了我怀疑vidfunc的输入/输出与您的Simulink模型所期望的不一致。您继续进行的方式在很大程度上取决于您自己的设计约束以及您实际需要的系统。基本上,你的Simulink模型和MATLAB函数不一致......哪一个是对的?我将根据你对目标的最佳猜测给出一些一般性的想法。

首先,Simulink将图像(以M-by-N矩阵的形式)传递到vidfunc。这意味着vidfunc不再需要在代码的开头加载图像。所以我相信你可以更新前几行代码:

function h=vidfunc(a)
BW = edge(a,'sobel'); %sobel edge detection

现在看到vidfunc正在将实际图像(不是包含图像的文件名)作为输入。基本上,您要删除a=imread(u);行并直接跳转到处理a

另一个问题是vidfunc的输出。 Simulink期望输出是图像,但事实并非如此。我不是100%肯定在这段代码中h应该是什么(当我第一眼看到你的代码时,我认为这些是行对象的句柄,但似乎并非如此)。它看起来可能是其中一条houghlines的端点的y坐标。然而,这不是您的Simulink模型所期望的。这个问题不是那么简单。可能您可以尝试使用getframe从线条图中抓取图像。

我实际上觉得我能给你的最好建议是 废弃MATLAB函数并在Simulink中实现所有内容 。我认为这比让vidfunc与你的模型很好地搭配要容易得多。 vidfunc实际上并没有包含那么多代码,所以这对你来说不是一件很难的事。另一个好处是,在这个过程结束时,你将有一个很好的Simulink模型,它明确地显示了你正在采取的所有图像处理步骤。

我相信您使用MATLAB函数执行的所有图像处理也可以使用Simulink块完成(请参阅此doc Simulink Blocks 部分)。

祝你好运。