Похоже, что основная часть работы, проделанной в этой модели «Simulink», на самом деле выполняется вашей функцией MATLAB. Таким образом, ответ на этот вопрос будет в значительной степени зависеть от того, что на самом деле делает эта функция. В частности, каковы ожидаемые входные данные для vidfunc
и каковы выходные данные этой функции? Я подозреваю, что эту функцию, возможно, потребуется пересмотреть, чтобы она соответствовала вашей модели.
Чтобы отладить вашу модель, полезно подумать о том, какой выходной сигнал поступает от каждого блока. На каждом временном шаге ваш блок From Multimedia File
будет выводить один кадр изображения, который в соответствии с doc выглядит как
Цветной видеосигнал M на N на P, где P — количество цветовых плоскостей.
Двигаясь вниз по течению, мы приходим к блоку Color Space Conversion
, который в данном случае выглядит так, как будто он, скорее всего, будет выводить кадр изображения в виде матрицы M×N (где каждый элемент матрицы соответствует интенсивности изображения в данный момент времени). пиксель).
Теперь мы подошли к самой интересной части — блоку MATLAB Fcn
. Как мы только что видели, входными данными для этого блока будет матрица размера M на N, представляющая один кадр изображения. Когда вы смотрите в диалоговом окне параметров для блока MATLAB Fcn
, входные данные для этого блока представлены переменной u
. Следовательно, чтобы выполнить функцию vidfunc
для кадра изображения, вводимого в этот блок, вам нужно просто ввести vidfunc(u)
для вашей функции MATLAB.
Теперь, основываясь на входных данных, поступающих в блок MATLAB Fcn
, и на том факте, что у вас есть блок Video Viewer, подключенный к выходу, vidfunc
должен быть структурирован таким образом, чтобы он работал с одним кадром изображения в качестве входного и выдавал другой одиночный кадр изображения. Если vidfunc
не структурирован таким образом, вам нужно будет отредактировать его (или просто повторно реализовать ту же функциональность, используя блоки Simulink).
Тем не менее, давайте предположим, что vidfunc
также возвращает матрицу M на N, представляющую обработанный кадр изображения. Вам нужно установить для параметра Выходные размеры для блока MATLAB Fcn
значение -1
, чтобы указать, что выходные данные будут иметь те же размеры, что и входные. Кроме того (как указано в документе), вы должны убедиться, что Сворачивать 2D-результаты в 1D флажок не установлен, в противном случае выходное изображение будет иметь форму одного длинного вектора, а не матрицы размером M на N.
При условии, что 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);
и сразу переходите к обработке a
.
Другой проблемой является вывод vidfunc
. Simulink ожидает, что на выходе будет изображение, но это не так. Я не уверен на 100%, что должно быть h
в этом коде (когда я впервые взглянул на ваш код, я подумал, что это дескрипторы для строковых объектов, но это не так). Возможно, это координата y конечной точки одной из линий пересечения. Тем не менее, это не то, что ожидает ваша модель Simulink. Это не так просто исправить. Возможно, вы могли бы попытаться использовать getframe, чтобы получить изображение из графика ваши линии.
На самом деле я считаю, что лучший совет, который я могу вам дать, это просто отменить функцию MATLAB и реализовать все в Simulink. Я думаю, это будет намного проще, чем пытаться заставить vidfunc
хорошо работать с вашей моделью. vidfunc
на самом деле не содержит столько кода, так что это не должно быть для вас слишком сложной задачей. Еще одним преимуществом является то, что в конце этого процесса у вас будет хорошая модель Simulink, которая явно показывает все шаги обработки изображения, которые вы предпринимаете.
Я полагаю, что вся обработка изображений, которую вы выполняете с помощью функций MATLAB, также может выполняться с помощью блоков Simulink (см. раздел Блоки Simulink этого документа doc).
Удачи.
person
grungetta
schedule
29.09.2012