Как работать с видеокадрами в simulink

Я работаю над видео в simulink. Поскольку мы знаем, что блок мультимедийных файлов считывает один кадр за раз, поэтому, когда я прикреплю его к функциональному блоку Matlab, он должен считывать один кадр за раз с помощью команды imread. Если я дважды щелкну функциональный блок Matlab (как показано на http://tinypic.com/view.php?pic=dggujd&s=6), то вы увидите, что я должен указать имя функции, как написано в mfile matlab, вместе с вводом; в данном случае это видео (названное 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)

person Shayan Ali    schedule 28.09.2012    source источник


Ответы (1)


Похоже, что основная часть работы, проделанной в этой модели «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
comment
Сэр, если я напишу «u» в качестве входного аргумента для vidfunc, я все равно получу ошибку «Входные строки должны иметь одну строку». vidfunc просто снимает кадр за кадром; затем его извлечение интересующей области, затем я применил обнаружение края Собеля, а затем, наконец, используется преобразование Хафа. На самом деле проблема заключается в том, что функциональному блоку Matlab нужен аргумент в параметре имени файла, например, в случае изображения, которое я дал как myfunction('a.jpg'). Теперь я не могу записать его как myfunction('video.avi'), потому что он принимает кадр не все видео в один момент времени. Как это написать? Это проблема или что-то другое. - person Shayan Ali; 29.09.2012
comment
Если можете, обновите свой исходный пост, включив в него код MATLAB. Судя по вашему описанию, проблема именно в этом. Вы сказали, что первое, что делает vidfunc, — загружает по одному изображению из вашего видео. Однако vidfunc больше не нужно выполнять этот шаг загрузки файла, потому что вы загружаете видео в Simulink и передаете один кадр изображения непосредственно в функцию. Итак, как обсуждалось в моем посте, вы должны удалить часть vidfunc, которая отвечает за загрузку видеофайла и перебор кадров. Просто оставьте часть, которая обрабатывает кадр. - person grungetta; 29.09.2012
comment
Сэр, я обновил свой пост, включив код. Пожалуйста, направьте меня, где я делаю ошибку. - person Shayan Ali; 29.09.2012
comment
@ShayanAli - Быстро взглянув на ваш код, я вижу две проблемы. 1) vidfunc принимает имя файла изображения в качестве входных данных и 2) возвращает массив дескрипторов для линейных объектов. В зависимости от того, как структурирована ваша модель Simulink, vidfunc необходимо переписать, чтобы использовать фактическое изображение в качестве входных данных (в вашем случае это переменная a). Кроме того, ему нужно будет вывести изображение. Так что это заставляет меня задаться вопросом, если в основном вся работа выполняется вашей функцией, почему вы пытаетесь использовать это в Simulink? Каков результат, который вы хотите получить от всего этого процесса? Это сильно повлияет на дальнейшие действия - person grungetta; 30.09.2012
comment
Я пропустил несколько блоков в своей модели. Я снова загрузил свою модель на tinypic.com/view .php?pic=1zzj3o1&s=6 . Сэр, я испробовал все советы, которые вы мне сказали, но моя модель не работает; так как он все еще не выбирает один кадр и не обрабатывает его в функции Matlab. - person Shayan Ali; 04.10.2012
comment
@ShayanAli Можете ли вы опубликовать обновленную версию вашего кода Matlab. Также вы получаете какие-либо конкретные сообщения об ошибках (напишите, если да). Также каковы настройки параметров для функционального блока Matlab сейчас. Возможно, это нужно будет изменить, поскольку форма ваших входов и выходов изменилась. - person grungetta; 04.10.2012
comment
Сэр, было бы лучше, если бы я сначала объяснил вам мою проблему, на самом деле avi-файл, который у меня есть, относится к дороге, и я пытаюсь обнаружить дорожные полосы с помощью преобразования hough. Сначала я попытался реализовать это в simulink, но это не сработало, затем Я написал для него функцию Matlab и попытался использовать ее в своей модели Simulink. Если я загружу это видео в Matlab, а затем запущу, оно работает хорошо, но мне трудно работать в Simulink. Если я использую ту же модель для изображения, она работает, но когда я запускаю ее для своего видео, она не работает. еще кое-что, сэр, как изменятся мои входные данные для обновленной модели. – - person Shayan Ali; 05.10.2012
comment
Можете ли вы опубликовать обновленную версию вашего кода MATLAB. Кроме того, когда вы говорите, что это не работает, вы получаете сообщения об ошибках (если да, опубликуйте их) или просто ваш вывод не соответствует вашим ожиданиям/предназначениям? - person grungetta; 05.10.2012
comment
У сэра simulink есть блоки для реализации преобразования hough, но когда я их использую, дорожные полосы не обнаруживаются, хотя я ограничил hh моей интересующей областью, поэтому вы можете сказать, что он не работает так, как я хочу, чтобы он работал. Я загрузил модель на tinypic.com/view.php?pic=1zb5rsw&s=6 Не подскажете, как правильно это реализовать? - person Shayan Ali; 09.10.2012
comment
Я полагаю, что вы уже рассмотрели это, но если нет, взгляните на это ссылка. Встроенный в Simulink пример ex_vision_detect_lines делает в значительной степени именно то, что вы ищете (за исключением блока ROI). Я предлагаю построить вывод Hough Lines в области видимости, чтобы увидеть, действительно ли он выводит то, что вы хотите. Возможно, ваша модель работает нормально, но линии просто плохо визуализируются (например, Draw Lines рисует белую линию на белом участке вашего изображения). - person grungetta; 10.10.2012
comment
Спасибо, сэр, за ваше руководство. Сэр, на самом деле в блоке ROI я обрезал дорожные полосы из видео, а затем применяю hough только к этим полосам, поэтому hough должен их обнаружить; но это дает мне только одну строку в области, которая даже не является частью ROI. Подскажите в чем может быть дело. Еще раз, спасибо. Я буду следовать шагам, которые вы упомянули выше, и дам вам знать, если у меня возникнут какие-то проблемы. - person Shayan Ali; 10.10.2012
comment
Хорошо, одна проблема может заключаться в том, что Hough Lines будет выводить координаты линии относительно ROI, а не исходных изображений. Вы можете убедиться в этом, используя вывод Define ROI в качестве входного изображения для Draw Shapes и посмотрев, нарисованы ли линии в правильном месте. Если это проблема, то это просто означает, что вам нужно добавить смещение к выходным данным Hough Lines для преобразования координат ROI в координаты исходного изображения. - person grungetta; 10.10.2012
comment
Чтобы найти больше строк, вам нужно увеличить параметр Maximum number of local maxima в вашем блоке Find Local Maxima. Имейте в виду, что это может потребовать от вас также изменить блоки селектора, чтобы приспособиться к новым размерам вывода Find Local Maxima, так как этот вывод теперь будет двумерным массивом. - person grungetta; 10.10.2012
comment
Спасибо, сэр, за ваше руководство и помощь, вы даже не представляете, как сильно вы мне помогли. Сэр, я прикрепил вывод «Определить ROI» в качестве входного изображения к «Нарисовать фигуры», и теперь линии находятся примерно в их положении. но, сэр, я понятия не имею, как добавить смещение к выходным данным Hough Lines для преобразования координат области интереса в исходные координаты изображений. Не могли бы вы помочь мне. - person Shayan Ali; 11.10.2012
comment
Взгляните на документацию по блоку Draw Shapes. Похоже, есть настройка, позволяющая указать интересующую область. Установите для параметра Draw shapes in этого блока значение Specify region of interest via port. Согласно документу, когда вы выбираете эту опцию, порт ROI появляется на блоке. Введите четырехэлементный вектор целочисленных значений [x y width height], где [x y] — координаты левого верхнего угла области. - person grungetta; 12.10.2012
comment
Хорошо, сэр, на самом деле у меня есть Matlab-2009, и эта функция недоступна в нем, поэтому я думаю, что мне следует сначала установить Matlab-2012, а затем попробовать. Я дам вам знать, если у меня возникнут какие-то проблемы. Спасибо - person Shayan Ali; 12.10.2012
comment
Это должно быть доступно в 2009 году, но вы должны включить его. Прочитайте этот документ для версии MATLAB 2009a блок Draw Shapes). Как я уже сказал в моем последнем комментарии, вам нужно открыть диалоговое окно параметров для блока и выбрать Specify region of interest via port для поля Draw shapes in. - person grungetta; 12.10.2012
comment
В общем, вы избавите себя от многих хлопот в будущем, если внимательно прочитаете документацию по каждому из ваших блоков. Онлайн-документация Matlab/Simulink — чрезвычайно полезный инструмент. - person grungetta; 12.10.2012
comment
хорошо, сэр, спасибо, я буду следовать за ним. Сэр, если я определю свой ROI в блоке рисования фигур, то есть ли необходимость в «определении блока ROI» в начале? - person Shayan Ali; 12.10.2012
comment
Насколько я понимаю, вам нужно использовать оба. Я считаю, что настройка области интереса в Draw Shapes просто сообщает этому блоку, что линии, которые вы будете рисовать, имеют координаты относительно указанной области интереса, а не относительно всего изображения. - person grungetta; 13.10.2012
comment
в чем может быть дело господа. Я даже пытался изменить значения, но это ничего не дало мне в конце. - person Shayan Ali; 13.10.2012
comment
Возможно, вы просто перепутали порядок ввода ROI с Draw Shapes. Согласно документу, ввод представляет собой 4-элементный вектор целых чисел [x y ширина высота], которые определяют прямоугольную область, в которой можно рисовать фигуры. Первые два элемента представляют собой координаты левого верхнего угла области с отсчетом от единицы. Вторые два элемента представляют ширину и высоту области. Итак, он ищет [x y width height], и я думаю, что вы делаете [y x height width]. - person grungetta; 13.10.2012
comment
Кроме того, я не уверен на 100%, но я думаю, что вместо создания вектора с мультиплексором вы должны просто ввести его непосредственно из блока констант. Поэтому не используйте 4 блока констант со значениями 20, 120, 290 и 60. Имейте один блок констант со значением [20, 120, 290, 60]. Константный блок не обязательно должен быть скаляром. - person grungetta; 13.10.2012
comment
В чем может быть проблема. Я также пытаюсь изменить параметры. Еще раз спасибо за ваше время, руководство и помощь. Серьезно, у меня нет слов, чтобы поблагодарить вас... - person Shayan Ali; 13.10.2012
comment
На данный момент я думаю, что ваша догадка так же хороша, как и моя. Вы, вероятно, находитесь в лучшем месте, чем я, чтобы иметь возможность отвечать на такие вопросы. Вам просто нужно пройти старую добрую отладку. Я предлагаю использовать множество областей видимости и блоки отображения, чтобы выясните, что именно происходит на каждом этапе вашей модели. Возможно, вам придется немного поэкспериментировать с этим блоком Draw Shapes, чтобы узнать, как именно он работает. Может быть, сделать новую модель, ввести некоторые известные входные данные в Draw Shapes и посмотреть, как она себя поведет. - person grungetta; 14.10.2012
comment
Сэр Simulink дает точки, оцененные посредством преобразования Хафа, как ‹4x1x251 int32›. знач(:,:,1) = 46 0 54 290 знач(:,:,2) = 46 0 54 290 ....................... I понятия не имею, как это анализировать; какую информацию он дает мне. Сначала я проанализировал преобразование hough в mfile Matlab; там я получил структуру линий, соответствующих каждой обнаруженной полосе, которую можно легко проанализировать. - person Shayan Ali; 18.10.2012