0

我正在处理 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)
4

1 回答 1

1

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

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

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

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

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

现在,基于到MATLAB Fcn块的输入,以及您有一个连接到输出的视频查看器块的事实,vidfunc应该构建这样的结构,使其对单个图像帧作为其输入进行操作并输出另一个单个图像帧。如果vidfunc不是以这种方式构建的,您将需要对其进行编辑(或者只是使用 Simulink 模块重新实现相同的功能)。

也就是说,让我们假设vidfunc它还返回一个表示处理后的图像帧的 M×N 矩阵。您需要为您的模块设置Output Dimensions参数以指示输出将具有与输入相同的维度。此外,(如文档中所示)您需要确保未选中将二维结果折叠为一维,否则您的图像输出将采用一个长向量而不是 M×N 矩阵的形式。MATLAB Fcn-1

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

注意:为了让您的生活更轻松,我强烈建议您在 Simulink 模型中显示信号数据类型和维度。这可以帮助避免很多混乱。该文档准确描述了如何执行此操作。

- 更新 -

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

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

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

看到现在vidfunc将实际图像(而不是包含图像的文件名)作为其输入。基本上,您正在删除a=imread(u);线路并直接进入 processing a

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

实际上,我觉得我能给你的最好建议就是废弃 MATLAB 函数并在 Simulink 中实现所有内容vidfunc我认为这比尝试与您的模型很好地配合要容易得多。vidfunc实际上并没有包含那么多代码,所以这对你来说应该不是太难的任务。另一个好处是,在此过程结束时,您将拥有一个很好的 Simulink 模型,该模型明确显示您正在执行的所有图像处理步骤。

我相信您使用 MATLAB 函数进行的所有图像处理也可以使用 Simulink 模块完成(请参阅本文档的Simulink 模块部分)。

祝你好运。

于 2012-09-29T06:50:13.683 回答