Этот пример демонстрирует, как разработать комплексный алгоритм обработки видеоданных пиксельного потока, ускорить его симуляцию с помощью MATLAB Coder™ и сгенерировать HDL-код из проекта. Алгоритм улучшает обнаружение ребра от шумного цветного видео. У вас должна быть лицензия MATLAB Coder, чтобы запустить этот пример.
Это выгодно, чтобы пробежаться и через Передающий потоком пиксель Проект в MATLAB и Ускорить Передающий потоком пиксель Проект Используя примеры 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]) сопоставляет логический ложный и верный для uint8 (0) и uint8 (255), соответственно, так, чтобы матрицы могли быть конкатенированы.
И frm2pix и pix2frm используются, чтобы преобразовать между областями пиксельного потока и полным кадром. Внутренний цикл for выполняет обработку пиксельного потока. Остальная часть испытательного стенда выполняет обработку полного кадра.
Прежде чем испытательный стенд останавливается, частота кадров отображена, чтобы проиллюстрировать скорость симуляции.
Для функций, которые не поддерживают генерацию кода C, такую как tic
, toc
, imnoise
и fprintf
в этом примере, используют coder.extrinsic, чтобы объявить их как внешние функции. Внешние функции исключены из генерации MEX. Симуляция выполняет их в регулярном интерпретированном режиме. Поскольку imnoise
не включен в процесс генерации кода C, компилятор не может вывести тип данных и размер frmIn. Чтобы заполнить эту недостающую часть, мы добавляем оператор frmIn = нули (actLine, actPixPerLine, 3, 'uint8') перед внешним циклом for.
Функция, определяемая в EnhancedEdgeDetectionHDLDesign.m принимает пиксельный поток и структуру, состоящую из пяти управляющих сигналов, и возвращает измененный пиксельный поток и управляющую структуру. Для получения дополнительной информации о пиксельном протоколе потоковой передачи, используемом Системными объектами от Vision HDL Toolbox, смотрите Пиксельный Интерфейс Потоковой передачи.
В этом примере rgb2gray объект преобразовывает цветное изображение в шкалу полутонов, medfil удаляет перечный шум и соль. sobel подсвечивает ребро. Наконец, объект 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.
fprintf('Generating the MEX file, please wait ..\n'); codegen('EnhancedEdgeDetectionHDLTestBench'); fprintf('Executing the MEX file ..\n'); EnhancedEdgeDetectionHDLTestBench_mex;
Generating the MEX file, please wait .. Executing the MEX file .. frame 1: reference and design output differ in more than 20 pixels.
Верхний видеоплеер отображает видео исходного цвета слева и его шумную версию после добавляющей соли и перечного шума справа. Более низкий видеоплеер, слева направо, представляет: полутоновое изображение после преобразования цветового пространства, de-noised версия после среднего фильтра, ребро вывод после обнаружения ребра и расширенного ребра вывод после морфологической заключительной операции.
Обратите внимание на то, что в более низкой видео цепочке, только расширенное ребро вывод (самое правое видео) сгенерирован из проекта пиксельного потока. Другие три являются промежуточными видео от исходного проекта полного кадра. Чтобы отобразить все эти четыре видео из проекта пиксельного потока, вы записали бы файл проекта, чтобы вывести четыре набора пикселей и управляющих сигналов, и инстанцировали бы еще трех visionhdl. PixelsToFrame возражает, чтобы преобразовать три промежуточных пиксельных потока назад в кадры. Ради скорости симуляции и ясности кода, этот пример не реализует промежуточные отображения пиксельного потока.
Чтобы создать новый проект, введите следующую команду во временную папку
coder -hdlcoder -new EnhancedEdgeDetectionProject
Затем добавьте файл 'EnhancedEdgeDetectionHDLDesign.m' в проект как функция MATLAB и 'EnhancedEdgeDetectionHDLTestBench.m' как Испытательный стенд MATLAB.
Обратитесь к (HDL Coder) для примера при создании и заполнении проектов HDL Coder MATLAB.
Запустите Советника по вопросам Рабочего процесса. В Советнике по вопросам Рабочего процесса щелкните правой кнопкой по шагу 'Code Generation'. Выберите опцию, 'Запущенную к выбранной задаче', чтобы запустить все шаги с начала через генерацию HDL-кода.
Исследуйте сгенерированный HDL-код путем щелчка по ссылкам в логарифмическом окне.