exponenta event banner

Алгоритм видения MATLAB для работы с аппаратной моделью Simulink

В этом примере показано, как создать аппаратно ориентированную конструкцию в Simulink ®, которая реализует то же поведение, что и эталонная конструкция MATLAB ®.

Технологический процесс

Функции обработки изображений Toolbox™ и Computer Vision Toolbox™ работают на кадрированных, с плавающей запятой и целочисленных данных и обеспечивают превосходные ссылки на поведение. Аппаратные решения должны использовать потоковые логические данные или данные с фиксированной точкой.

В этом примере показано, как выполнить операцию обработки изображения с кадрами в MATLAB, а затем реализовать эту операцию в модели Simulink с использованием потоковых данных. Модель Simulink преобразует входное видео в поток пикселей для аппаратного проектирования. Одни и те же данные применяются как к аппаратному алгоритму в Simulink, так и к поведенческому алгоритму в MATLAB. Модель Simulink преобразует выходной поток пикселей в кадры и экспортирует эти кадры в MATLAB для сравнения с поведенческими результатами.

Часть этого примера MATLAB загружает входное видео, запускает поведенческий код, запускает модель Simulink для импорта видеокадров и экспорта измененных видеокадров и сравнивает поведенческие результаты MATLAB с выходными кадрами Simulink.

Источник видео

Создайте объект чтения видеофайлов для импорта видеофайла в рабочую область MATLAB. Исходный видеофайл имеет формат 240p. Создайте объект видеопроигрывателя для отображения входного кадра, отфильтрованного кадра Simulink и опорного кадра MATLAB.

videoIn = vision.VideoFileReader(...
        'Filename','rhinos.avi',...
        'ImageColorSpace','Intensity',...
        'VideoOutputDataType','uint8');

numFrm = 10;
% active frame dimensions
actPixelsPerLine = 320;
actLines = 240;
% dimensions including blanking
totalPixelsPerLine = 402;
totalLines = 324;

% viewer for results
viewer = vision.DeployableVideoPlayer(...
        'Size','Custom',...
        'CustomSize',[3*actPixelsPerLine actLines]);

Обнаружение кромок и наложение

Определите края в видеокадрах, а затем наложите эти края на исходный кадр. При вычислении наложения используется alpha значение для смешивания двух значений пикселей. Модель Simulink также использует edgeThreshold и alpha параметры, указанные здесь.

MATLAB edge функция интерпретирует порог как значение двойной точности от 0 до 1. Поэтому выражайте порог как часть диапазона uint8 тип данных, от 0 до 255. Значения пикселов, возвращенные edge функции logical тип данных. Чтобы преобразовать эти значения пикселов в uint8 введите для наложения, умножьте на 255. Эта операция масштабирования преобразует логические единицы в 255, а логические нули остаются равными 0.

edgeThreshold = 8;
alpha = 0.75;
frmFull = uint8(zeros(actLines,actPixelsPerLine,numFrm));
frmRef = frmFull;
for f = 1:numFrm
    frmFull(:,:,f) = videoIn();
    edges = edge(frmFull(:,:,f),'Sobel',edgeThreshold/255,'nothinning');
    edges8 = 255*uint8(edges)*(1-alpha);
    frmRef(:,:,f) = alpha*frmFull(:,:,f) + edges8;
    viewer([edges edges8 frmRef(:,:,f)]);
end

Настройка моделирования Simulink

Модель Simulink загружает входное видео в модель с помощью блока «Источник видео». Сконфигурируйте время образца модели с помощью totPixPerFrame переменная. Это значение включает в себя неактивные пиксельные области вокруг кадров 240 на 320. Время выборки источника видео составляет 1 шаг времени на кадр, а скорость в секциях пикселя потоковой передачи модели составляет 1/ totPixPerFrame . Задайте длину моделирования с помощью simTime переменная.

totPixPerFrame = totalPixelsPerLine*totalLines;
simTime = (numFrm+1)*totPixPerFrame;

modelname = 'VerifySLDesignAgainstMLReference';
open_system(modelname);
set_param(modelname,'SampleTimeColors','on');
set_param(modelname,'SimulationCommand','Update');
set_param(modelname,'Open','on');

Аппаратно-целевой алгоритм

Подсистема алгоритма HDL предназначена для поддержки генерации кода HDL.

Подсистема использует блок «Детектор кромок» для поиска кромок. Выходной сигнал блока представляет собой поток boolean значения пикселей. Модель масштабирует эти значения до uint8 значения типов данных для наложения.

Блок возвращает поток пикселей обнаруженных краев после нескольких строк задержки из-за внутренних буферов строк и логики фильтра. Перед наложением модель должна задержать входной поток, чтобы он соответствовал граничному потоку. Блок выравнивания пиксельного потока выполняет это выравнивание с использованием управляющих сигналов выходного граничного потока в качестве опорного сигнала. Этот блок сохраняет входной поток в FIFO до тех пор, пока обнаруженные края не станут доступны.

Подсистема наложения изображений масштабирует оба потока по alpha и добавляет их вместе. С учетом аппаратной реализации подсистема наложения изображений включает в себя этапы конвейера вокруг каждого множителя и после сумматора.

Дополнительные сведения об этой конструкции детектора кромок см. в примерах «Обнаружение кромок» и «Наложение изображений».

open_system([modelname '/HDL Algorithm']);

Запустить модель Simulink

Запустите модель Simulink, чтобы вернуть десять кадров, наложенных на обнаруженные кромки.

sim('VerifySLDesignAgainstMLReference');

Сравнение результатов Simulink с результатами MATLAB

Сравните каждый видеокадр, возвращенный Simulink, с результатом, возвращенным поведенческим кодом MATLAB. Изображения выглядят очень похожими, но имеют небольшие различия в значениях пикселей из-за смешения наложения. Смешение наложения MATLAB выполняется с использованием значений с плавающей запятой, а смешение наложения Simulink - с использованием значений с фиксированной запятой. Это сравнение подсчитывает пиксели в каждом кадре, значения которого отличаются более чем на 2, и вычисляет отношение пикового сигнала к шуму (PSNR) между кадрами. Для просмотра подробных различий в каждом кадре раскомментируйте последние две строки цикла.

 for f = 1:numFrm
    frmResult = frmOut.signals.values(:,:,f);
    viewer([frmFull(:,:,f) frmResult frmRef(:,:,f)]);
    diff = frmRef(:,:,f) - frmResult;
    errcnt = sum(diff(:) > 2);
    noisecheck = psnr(frmRef(:,:,f),frmResult);
    fprintf(['\nFrame #%d has %d pixels that differ from behavioral result (by more than 2). PSNR = %2.2f\n'],f,errcnt,noisecheck);
    %bar3(diff);
    %viewer([frmResult frmRef(:,:,f) diff]);
 end
Frame #1 has 2 pixels that differ from behavioral result (by more than 2). PSNR = 48.33

Frame #2 has 1 pixels that differ from behavioral result (by more than 2). PSNR = 48.72

Frame #3 has 1 pixels that differ from behavioral result (by more than 2). PSNR = 48.80

Frame #4 has 2 pixels that differ from behavioral result (by more than 2). PSNR = 48.66

Frame #5 has 2 pixels that differ from behavioral result (by more than 2). PSNR = 48.70

Frame #6 has 4 pixels that differ from behavioral result (by more than 2). PSNR = 48.27

Frame #7 has 2 pixels that differ from behavioral result (by more than 2). PSNR = 48.88

Frame #8 has 3 pixels that differ from behavioral result (by more than 2). PSNR = 48.58

Frame #9 has 3 pixels that differ from behavioral result (by more than 2). PSNR = 48.55

Frame #10 has 3 pixels that differ from behavioral result (by more than 2). PSNR = 48.53

Создание кода HDL и проверка его поведения

После выполнения моделирования можно использовать Coder™ HDL для генерации кода HDL и тестовый стенд для подсистемы алгоритма HDL.

makehdl([modelname '/HDL Algorithm'])   % Generate HDL code
makehdltb([modelname '/HDL Algorithm']) % Generate HDL Test bench

См. также

|

Связанные темы