В этом примере показано, как создать предназначенный на оборудование проект в Simulink®, который реализует то же поведение как исходный проект MATLAB®.
Image Processing Toolbox™ и функции Computer Vision Toolbox™ работают с обрамленными, и целочисленными данными с плавающей точкой и обеспечивают превосходные поведенческие ссылки. Аппаратные проекты должны использовать булевскую переменную потоковой передачи или данные фиксированной точки.
В этом примере показано, как выполнить обрамленную операцию обработки изображений в MATLAB, и затем реализовать ту же операцию в данных о потоковой передаче использования модели Simulink. Модель Simulink преобразует входное видео в пиксельный поток для благоприятного для оборудования проекта. Те же данные применяются и к аппаратному алгоритму в Simulink и к поведенческому алгоритму в MATLAB. Модель Simulink преобразует поток выходного пикселя в системы координат и экспортирует те системы координат в MATLAB для сравнения с поведенческими результатами.
Фрагмент MATLAB этого примера загружает входное видео, запускает поведенческий код, запускает модель Simulink, чтобы импортировать видеокадры, и экспорт изменил видеокадры и сравнивает MATLAB поведенческие результаты с Simulink системы координат выхода.
Создайте объект читателя видеофайла импортировать видеофайл в рабочее пространство MATLAB. Файл источника видеосигнала является форматом на 240 пунктов. Создайте объект видеоплеера отобразить входной кадр, 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
параметры заданы здесь.
edge
MATLAB функция интерпретирует порог как значение с двойной точностью от 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 загружает входное видео в модель с помощью блока Video Source. Сконфигурируйте шаг расчета модели с помощью 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-кода.
Подсистема использует блок Edge Detector, чтобы найти ребра. Выход блока является потоком boolean
пиксельные значения. Модель масштабирует эти значения к uint8
значения типа данных для наложения.
Блок возвращает пиксельный поток обнаруженных ребер после нескольких линий задержки, из-за внутренних буферов линии и логики фильтра. Прежде, чем выполнить наложение, модель должна задержать входной поток, чтобы совпадать с потоком ребра. Блок Pixel Stream Aligner выполняет это выравнивание с помощью управляющих сигналов выходного потока ребра как ссылка. Этот блок хранит входной поток в FIFO, пока обнаруженные ребра не доступны.
Подсистема Наложения Изображений масштабирует оба потока alpha
отношение и добавляет их вместе. С аппаратной реализацией в памяти, подсистема Наложения Изображений включает настройки канала связи вокруг каждого множителя и после сумматора.
Для получения дополнительной информации этого проекта детектора ребра, смотрите пример Наложения Обнаружения и Изображения Ребра.
open_system([modelname '/HDL Algorithm']);
Запустите модель Simulink, чтобы возвратить десять систем координат, наложенных с обнаруженными ребрами.
sim('VerifySLDesignAgainstMLReference');
Сравните каждый видеокадр, возвращенный в 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.
makehdl([modelname '/HDL Algorithm']) % Generate HDL code makehdltb([modelname '/HDL Algorithm']) % Generate HDL Test bench
Edge Detector | Pixel Stream Aligner