Этот пример демонстрирует, как разработать комплексный алгоритм обработки видеоданных пиксельного потока, ускорить его симуляцию с помощью MATLAB Coder™ и сгенерировать HDL-код из проекта. Алгоритм улучшает обнаружение ребра от шумного цветного видео. У вас должна быть лицензия MATLAB Coder, чтобы запустить этот пример.
В mlhdlc_vht_enhancededge_tb файле объект videoIn читает каждую систему координат из цветного источника видеосигнала и imnoise
функция добавляет перечный шум и соль. Это шумное цветное изображение передается объекту frm2pix, который преобразует систему координат полного образа в поток пикселей и управляющих структур. Функция mlhdlc_vht_enhancededge затем вызвана, чтобы обработать один пиксель (и его связанная управляющая структура) за один раз. После того, как мы обработаем целый пиксельный поток и соберем поток вывода, pix2frm объект преобразует поток вывода в видео полной системы координат. Исходный проект полной системы координат mlhdlc_vht_enhancededge_ref также называется, чтобы обработать шумное цветное изображение. Его выход по сравнению с тем из проекта пиксельного потока. Функция mlhdlc_vht_enhancededge_viewer вызвана, чтобы отобразить видеовыходы.
Рабочий процесс выше реализован в следующих линиях mlhdlc_vht_enhancededge_tb.
... 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)] = mlhdlc_vht_enhancededge(pixInVec(p,:),ctrlInVec(p)); end frmOut = step(pix2frm,pixOutVec,ctrlOutVec);
% Call the full-frame reference design [frmGray,frmDenoise,frmEdge,frmRef] = mlhdlc_vht_enhancededge_ref(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 mlhdlc_vht_enhancededge_viewer(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.
Функция mlhdlc_vht_enhancededge принимает пиксельный поток и структуру, состоящую из пяти управляющих сигналов, и возвращает модифицированный пиксельный поток и управляющую структуру. Для получения дополнительной информации о пиксельном протоколе потоковой передачи, используемом Системными объектами от 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™. Эти функции обрабатывают кадры полного образа. Такой исходный проект помогает проверить реализацию проекта пиксельного потока путем сравнения выходного изображения от исходного проекта полной системы координат до выхода проекта пиксельного потока.
Функция mlhdlc_vht_enhancededge_ref содержит подобный набор четырех функций как в mlhdlc_vht_enhancededge. Основное отличие - то, что функции из Image Processing Toolbox обрабатывают данные полной системы координат.
Из-за различия в реализации между edge
функция и visionhdl. Системный объект EdgeDetector, ссылка и проектная мощность рассматриваются, соответствуя, если frmOut и frmRef отличаются по не больше, чем 20 пикселей.
Чтобы не загрязнить вашу текущую рабочую папку, выполните следующие строки кода, чтобы скопировать необходимые файлы в качестве примера во временную папку.
currDir = pwd; tempDir = tempname; % Create a temporary folder and copy the MATLAB files. mkdir(tempDir); demoDir = fullfile(matlabroot,'toolbox','hdlcoder','hdlcoderdemos','matlabhdlcoderdemos'); copyfile(fullfile(demoDir,'mlhdlc_vht_enhancededge_tb.m'),tempDir); copyfile(fullfile(demoDir,'mlhdlc_vht_enhancededge.m'),tempDir); copyfile(fullfile(demoDir,'mlhdlc_vht_enhancededge_ref.m'),tempDir); copyfile(fullfile(demoDir,'mlhdlc_vht_enhancededge_viewer.m'),tempDir); cd(tempDir);
Сгенерируйте и выполните файл MEX.
fprintf('Generating the MEX file, please wait ..\n'); codegen('mlhdlc_vht_enhancededge_tb'); fprintf('Executing the MEX file ..\n'); mlhdlc_vht_enhancededge_tb_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.
Обратитесь к Началу работы с MATLAB к Рабочему процессу HDL для примера при создании и заполнении проектов HDL Coder MATLAB.
Запустите Советника по вопросам Рабочего процесса. В Советнике по вопросам Рабочего процесса щелкните правой кнопкой по шагу 'Code Generation'. Выберите опцию, 'Запущенную к выбранной задаче', чтобы запустить все шаги с начала через генерацию HDL-кода.
Исследуйте сгенерированный HDL-код путем щелчка по ссылкам в логарифмическом окне.
Запустите следующие команды, чтобы очистить временную папку проекта.
clear mlhdlc_vht_enhancededge_tb_mex; cd(currDir); rmdir(tempDir,'s'); clear currDir tempDir demoDir;