В этом примере показано, как ускорить алгоритм обработки видео в пиксельном потоке в MATLAB ® с помощью MATLAB Coder™.
Для запуска этого примера необходимо иметь лицензию MATLAB Coder.
Ускорение с помощью MATLAB Coder позволяет моделировать большие форматы кадра, такие как видео 1080p, на практичных скоростях. Используйте этот рабочий процесс ускорения после отладки алгоритма с использованием небольшого формата кадра. Тестирование проекта с небольшим изображением продемонстрировано в Проект Pixel-Streaming в примере MATLAB.
MATLAB Coder генерирует код С из кода MATLAB. Генерация кода ускоряет симуляцию путем блокировки размеров и типов данных переменных. Этот процесс удаляет накладные расходы на проверку интерпретированного языка на размер и тип данных в каждой строке кода. Этот пример компилирует оба файла испытательного стенда DesignAccelerationHDLTestBench.m
и файл проекта DesignAccelerationHDLDesign.m
в MEX-функцию и использует полученный файл MEX для ускорения симуляции.
Директива (или прагма)% # codegen под сигнатурой функции указывает, что вы намерены сгенерировать код для алгоритма MATLAB. Добавление этой директивы предписывает анализатору кода MATLAB помочь вам диагностировать и исправить нарушения, которые привели бы к ошибкам во время генерации кода. Директива% # codegen не влияет на интерпретированную симуляцию.
Симуляции отладки с большими форматами кадра непрактичны в интерпретированном режиме из-за длительного времени симуляции. Однако отладка симуляции MEX сложна из-за отсутствия отладочного доступа в код.
Чтобы избежать этих сценариев, лучшая практика состоит в том, чтобы разработать и проверить алгоритм и испытательный стенд с помощью формата кадра. В большинстве случаев HDL-целевой проект может быть реализован без зависимости от формата кадра. Как только вы уверены, что проект и испытательный стенд работают правильно, то увеличьте формат кадра в испытательном стенде, и используйте MATLAB Coder, чтобы ускорить симуляцию. Чтобы увеличить формат кадра, испытательный стенд требует только незначительных изменений, что можно увидеть, сравнивая DesignAccelerationHDLTestBench.m
с PixelStreamingDesignHDLTestBench.m
в Pixel-Streaming Design в MATLAB.
На испытательном стенде DesignAccelerationHDLTestBench.m
объект videoIn считывает каждую систему координат из источника видео, и объект скалера интерполирует эту систему координат с 240p до 1080p. Это изображение 1080p передается объекту frm2pix, который преобразует полную систему координат изображения в поток пикселей и структур управления. Функция DesignAccelerationHDLDesign
затем вызывается, чтобы обработать один пиксель (и связанную с ним структуру управления) за раз. После того, как мы обработаем весь поток пикселей и собираем выходной поток, объект pix2frm преобразует выходной поток в полнокадровое видео. Функция DesignAccelerationHDLViewer отображает выходные и оригинальные изображения один за другим.
Рабочий процесс выше реализован в следующих линиях DesignAccelerationHDLTestBench.m
.
... for f = 1:numFrm frmFull = step(videoIn); % Get a new frame frmIn = step(scaler,frmFull); % Enlarge the frame
[pixInVec,ctrlInVec] = step(frm2pix,frmIn); for p = 1:numPixPerFrm [pixOutVec(p),ctrlOutVec(p)] =... visionhdlsobel_design(pixInVec(p),ctrlInVec(p)); end frmOut = step(pix2frm,pixOutVec,ctrlOutVec);
DesignAccelerationHDLViewer(actPixPerLine,actLine,[frmIn uint8(255*frmOut)]); end ...
Тип данных frmIn является uint8, в то время как тип данных frmOut, ребро выхода обнаружения, является логическим. Матрицы различных типов данных не могут быть конкатенированы, поэтому uint8 (255 * frmOut) преобразует логические false и true в uint8 (0) и uint8 (255), соответственно.
И frm2pix, и pix2frm используются для преобразования между полным кадром и пиксельным потоком областей. Внутренний цикл for-loop выполняет обработку потока пикселей. Остальная часть испытательного стенда выполняет обработку полного кадра (т.е. videoIn, скалер и средство просмотра внутри функции DesignAccelerationHDLViewer).
Перед завершением испытательного стенда отображается частота систем координат, чтобы проиллюстрировать скорость симуляции.
Не все функции, используемые в испытательном стенде, поддерживают генерацию кода C. Для тех, кто этого не делает, таких как tic
, toc
, fprintf
, используйте coder.extrinsic, чтобы объявить их внешними функциями. Внешние функции исключены из генерации MEX. Симуляция выполняет их в регулярном интерпретированном режиме.
Функция, заданная в DesignAccelerationHDLDesign.m
принимает поток пикселей и пять управляющих сигналов и возвращает измененный поток пикселей и сигналы управления. Дополнительные сведения о протоколе потокового пикселя, используемом системными объектами из Toolbox™ Vision HDL, см. в разделе Интерфейс потокового пикселя.
В этом примере функция содержит объект Edge Detector System.
В особом внимании этого примера находится рабочий процесс, а не сам проект алгоритма. Поэтому проект кода довольно прост. Как только вы знакомы с рабочим процессом, легко реализовать расширенные алгоритмы видео, используя возможности, предоставляемые системными объектами из Vision HDL Toolbox.
Сгенерируйте и выполните файл MEX.
codegen('DesignAccelerationHDLTestBench');
DesignAccelerationHDLTestBench_mex;
Code generation successful. 10 frames have been processed in 12.92 seconds. Average frame rate is 0.77 frames/second.
Средство просмотра отображает оригинальное видео слева, а выход справа.
Введите следующую команду, чтобы создать новый проект HDL- Coder™ во временной папке
coder -hdlcoder -new DesignAccelerationProject
Затем добавьте файл DesignAccelerationHDLDesign.m
к проекту в качестве функции MATLAB и DesignAccelerationHDLTestBench.m
в качестве испытательного стенда MATLAB.
Руководство по созданию и заполнению проектов MATLAB HDL Coder см. в разделе Начало работы с MATLAB в HDL-процессе (HDL Coder).
Запустите советник по рабочим процессам. В Workflow Advisor щелкните правой кнопкой мыши шаг 'Генерация Кода'. Выберите опцию «Run to selected task», чтобы выполнить все шаги от начала до генерации HDL-кода.
Просмотрите сгенерированный HDL-код, щелкнув по ссылкам в окне журнала.