В этом примере показано, как разработать комплексный алгоритм обработки видео в пиксельном потоке, ускорить его симуляцию с помощью MATLAB Coder™ и сгенерировать HDL-код из проекта. Алгоритм улучшает обнаружение ребра от шумного цветного видео.
Для запуска этого примера необходимо иметь лицензию MATLAB Coder.
Этот пример основан на Pixel-Streaming Design в MATLAB и Accelerate a Pixel-Streaming Design с использованием примеров MATLAB Coder.
В EnhancedEdgeDetectionHDLTestBench.m
файл videoIn считывает каждую систему координат из источника цветного видео и imnoise
функция добавляет соль и перец шум. Это шумное цветное изображение передается объекту frm2pix, который преобразует полную систему координат изображения в поток пикселей и структур управления. Функция EnhancedEdgeDetectionHDLDesign.m
затем вызывается, чтобы обработать один пиксель (и связанную с ним структуру управления) за раз. После того, как мы обработаем весь поток пикселей и собираем выходной поток, объект pix2frm преобразует выходной поток в полнокадровое видео. Полнокадровый исходный проект EnhancedEdgeDetectionHDLReference.m
вызывается также для обработки шумного цветного изображения. Его выход сравнивается с выходом проекта пиксельного потока. Функция EnhancedEdgeDetectionHDLViewer.m
вызывается для отображения видео выходов.
Рабочий процесс выше реализован в следующих линиях EnhancedEdgeDetectionHDLTestBench.m
.
... frmIn = zeros(actLine,actPixPerLine,3,'uint8'); for f = 1:numFrm frmFull = step(videoIn); % Get a new frame frmIn = imnoise(frmFull,'salt & pepper'); % Add noise
% Call the pixel-stream design [pixInVec,ctrlInVec] = step(frm2pix,frmIn); for p = 1:numPixPerFrm [pixOutVec(p),ctrlOutVec(p)] = EnhancedEdgeDetectionHDLDesign(pixInVec(p,:),ctrlInVec(p)); end frmOut = step(pix2frm,pixOutVec,ctrlOutVec);
% Call the full-frame reference design [frmGray,frmDenoise,frmEdge,frmRef] = visionhdlenhancededge_reference(frmIn);
% Compare the results if nnz(imabsdiff(frmRef,frmOut))>20 fprintf('frame %d: reference and design output differ in more than 20 pixels.\n',f); return; end
% Display the results EnhancedEdgeDetectionHDLViewer(actPixPerLine,actLine,[frmGray frmDenoise uint8(255*[frmEdge frmOut])],[frmFull frmIn]); end ...
Поскольку frmGray и frmDenoise являются типами данных uint8, в то время как frmEdge и frmOut являются логическими, uint8 (255x [frmEdge frmOut]) сопоставляет логические ложные и true с uint8 (0) и uint8 (255), соответственно, так что матрицы могут быть конкатенированы.
И frm2pix, и pix2frm используются для преобразования между полным кадром и пиксельным потоком областей. Внутренний цикл for-loop выполняет обработку потока пикселей. Остальная часть испытательного стенда выполняет полную обработку кадра.
Перед завершением испытательного стенда отображается частота систем координат, чтобы проиллюстрировать скорость симуляции.
Для функций, которые не поддерживают генерацию кода C, таких как tic
, toc
, imnoise
, и fprintf
в этом примере используйте coder.extrinsic, чтобы объявить их внешними функциями. Внешние функции исключены из генерации MEX. Симуляция выполняет их в регулярном интерпретированном режиме. Начиная с imnoise
не включен в процесс генерации кода C, компилятор не может определить тип данных и размер frmIn. Чтобы заполнить эту отсутствующую часть, мы добавляем оператор frmIn = нули (actLine, actPixPerLine, 3, 'uint8') перед внешним циклом for-loop.
Функция, заданная в EnhancedEdgeDetectionHDLDesign.m
принимает поток пикселей и структуру, состоящую из пяти управляющих сигналов, и возвращает измененный поток пикселей и структуру управления. Дополнительные сведения о протоколе потокового пикселя, используемом системными объектами из Vision HDL Toolbox, см. в разделе Интерфейс потокового пикселя.
В этом примере объект rgb2grey преобразует цветное изображение в полутоновое, медфил удаляет шум соли и перца. собель подсвечивает ребро. Наконец, объект mclose выполняет морфологическое закрытие, чтобы улучшить выход ребра. Код показан ниже.
[pixGray,ctrlGray] = step(rgb2gray,pixIn,ctrlIn); % Convert RGB to grayscale [pixDenoise,ctrlDenoise] = step(medfil,pixGray,ctrlGray); % Remove noise [pixEdge,ctrlEdge] = step(sobel,pixDenoise,ctrlDenoise); % Detect edges [pixClose,ctrlClose] = step(mclose,pixEdge,ctrlEdge); % Apply closing
При разработке комплексного алгоритма обработки видео в пиксельном потоке рекомендуется разработать параллельный исходный проект с использованием функций из Image Processing Toolbox™. Эти функции обрабатывают полные системы координат изображения. Такой исходный проект помогает проверить реализацию проекта пиксельного потока путем сравнения выходного изображения из исходного проекта полного кадра с выходом проекта пиксельного потока.
Функция EnhancedEdgeDetectionHDLReference.m
содержит аналогичный набор четырех функций, как в EnhancedEdgeDetectionHDLDesign.m
. Ключевым различием является то, что функции из Image Processing Toolbox обрабатывают данные полного кадра.
Из-за различия в реализации между edge
функции и visionhdl.EdgeDetector
Системный объект, ссылка и выходы проекта считаются совпадающими, если frmOut и frmRef отличаются не более чем на 20 пикселей.
Сгенерируйте и выполните файл MEX.
codegen('EnhancedEdgeDetectionHDLTestBench');
Code generation successful.
EnhancedEdgeDetectionHDLTestBench_mex;
frame 1: reference and design output differ in more than 20 pixels.
Верхний видеоплеер отображает оригинальное цветное видео слева, а его шумную версию после добавления соли и перца шум справа. Нижний видеоплеер слева направо представляет: полутоновое изображение после преобразования цветового пространства, дешумированную версию после медианного фильтра, выход ребра после обнаружения ребра и улучшенный выход ребра после морфологической операции закрытия.
Обратите внимание, что в более низкой цепи видео только усиленный выход ребра (самое правое видео) генерируется из проекта потока пикселей. Остальные три являются промежуточными видео из полнокадрового исходного проекта. Чтобы отобразить все четыре видео из проекта pixel-stream, вы бы написали файл проекта, чтобы вывести четыре набора пикселей и управляющих сигналов, и создали экземпляр еще трех visionhdl. Объекты PixelsToFrame для преобразования трех промежуточных пиксельных потоков назад в системы координат. Ради скорости симуляции и ясности кода этот пример не реализует промежуточные пиксельные отображения.
Чтобы создать новый проект, введите следующую команду во временной папке
coder -hdlcoder -new EnhancedEdgeDetectionProject
Затем добавьте файл 'EnhancedEdgeDetectionHDLDesign.m' к проекту в качестве функции MATLAB и 'EnhancedEdgeDetectionHDLTestBench.m' в качестве испытательного стенда MATLAB.
Руководство по созданию и заполнению проектов MATLAB HDL Coder см. в разделе Начало работы с MATLAB в HDL-процессе (HDL Coder).
Запустите советник по рабочим процессам. В Workflow Advisor щелкните правой кнопкой мыши шаг 'Генерация Кода'. Выберите опцию «Run to selected task», чтобы выполнить все шаги от начала до генерации HDL-кода.
Просмотрите сгенерированный HDL-код, щелкнув по ссылкам в окне журнала.