В этом примере показано, как разработать сложный алгоритм обработки видео в виде пиксельного потока, ускорить его моделирование с использованием MATLAB Coder™ и генерировать код HDL из проекта. Алгоритм усиливает обнаружение краев из шумного цветного видео.
Для выполнения этого примера необходимо иметь лицензию MATLAB Coder.
Этот пример основан на Pixel-Streaming Design в MATLAB и Accelerate a Pixel-Streaming Design с использованием примеров кодера MATLAB.
В EnhancedEdgeDetectionHDLTestBench.m объект videyIn считывает каждый кадр из источника цветного видео и 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]) отображает логическое значение false и true на uint8 (0) и uint8 (255) соответственно, так что матрицы могут быть объединены.
Как frm2pix, так и pix2frm используются для преобразования между доменами полного кадра и потока пикселей. Внутренний for-loop выполняет обработку потока пикселей. Остальная часть испытательного стенда выполняет полнокадровую обработку.
Перед завершением тестового стенда отображается частота кадров, иллюстрирующая скорость моделирования.
Для функций, не поддерживающих генерацию кода C, таких как tic, toc, imnoise, и fprintf в этом примере используйте coder.extrinsic, чтобы объявить их как внешние функции. Внешние функции исключаются из генерации MEX. Моделирование выполняет их в обычном интерпретируемом режиме. С тех пор imnoise не входит в процесс генерации кода C, компилятор не может определить тип данных и размер frmIn. Чтобы заполнить эту недостающую часть, мы добавим оператор frmIn = нули (actLine, actPeyPerLine, 3, 'uint8') перед внешним for-loop.
Функция, определенная в EnhancedEdgeDetectionHDLDesign.m принимает поток пикселей и структуру, состоящую из пяти сигналов управления, и возвращает модифицированный поток пикселей и структуру управления. Дополнительные сведения о потоковом пиксельном протоколе, используемом системными объектами на панели инструментов Vision HDL, см. в разделе Потоковый пиксельный интерфейс.
В этом примере объект rgb2gray преобразует цветное изображение в градации серого, medfil удаляет шум соли и перца. Собель подсвечивает край. Наконец, объект 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
При разработке сложного алгоритма обработки видео пиксельного потока рекомендуется разработать параллельный эталонный дизайн с использованием функций из Toolbox™ обработки изображений. Эти функции обрабатывают полные кадры изображения. Такая эталонная конструкция помогает проверить реализацию схемы пиксельного потока путем сравнения выходного изображения из схемы отсчета полного кадра с выходом схемы пиксельного потока.
Функция EnhancedEdgeDetectionHDLReference.m содержит такой же набор из четырех функций, как в EnhancedEdgeDetectionHDLDesign.m. Ключевое отличие заключается в том, что функции панели инструментов обработки изображений обрабатывают полнокадровые данные.
Из-за разницы в реализации 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.

Верхний видеопроигрыватель отображает оригинальное цветное видео слева, а его шумную версию после добавления соли и перцового шума справа. Нижний видеопроигрыватель слева направо представляет: изображение в градациях серого после преобразования цветового пространства, версию с пониженным шумом после медианного фильтра, краевой выходной сигнал после обнаружения краев и расширенный краевой выходной сигнал после операции морфологического закрытия.
Следует отметить, что в нижней цепочке видеосигналов только улучшенный краевой выходной сигнал (самый правый видеосигнал) генерируется из структуры пиксельного потока. Остальные три являются промежуточными видео из полнокадрового эталонного дизайна. Чтобы отобразить все четыре видео из проекта пиксельного потока, вы бы написали файл дизайна, чтобы вывести четыре набора пикселей и управляющих сигналов, и создали экземпляр еще трех visionhdl. Чтобы преобразовать три промежуточных потока пикселей обратно в кадры, используйте объекты ToFrame. Для скорости моделирования и ясности кода этот пример не реализует промежуточные дисплеи пиксельного потока.
Чтобы создать новый проект, введите следующую команду во временную папку
coder -hdlcoder -new EnhancedEdgeDetectionProject
Затем добавьте файл «EnhancededEdgeDetection HDLDesign.m» в проект в качестве функции MATLAB и «EnhancedEdgeDetection HDLTestBench.m» в качестве тестового стенда MATLAB.
Руководство по созданию и заполнению проектов кодера MATLAB HDL см. в разделе Начало работы с MATLAB в Workflow-процессе HDL (HDL Coder).
Запустите помощник по рабочим процессам. В помощнике по рабочим процессам щелкните правой кнопкой мыши шаг «Создание кода». Выберите опцию «Run to selected task» для выполнения всех шагов от начала до создания кода HDL.
Проверьте сгенерированный код HDL, щелкнув ссылки в окне журнала.