pixelcontrol ФорматВ этом примере показано, как преобразовывать сигналы Camera Link ® в pixelcontrol инвертировать пикселы с помощью объекта Vision HDL Toolbox™ и преобразовать управляющие сигналы обратно в формат Camera Link.
Блоки и объекты панели инструментов Vision HDL используют пользовательский формат потокового видео. Если система работает на потоковой передаче видеоданных с камеры, необходимо преобразовать управляющие сигналы камеры в этот пользовательский формат. Кроме того, если алгоритмы панели инструментов Vision HDL интегрированы в существующий код проектирования и проверки, который работает в формате камеры, необходимо также преобразовать выходные сигналы из конструкции панели инструментов Vision HDL обратно в формат камеры.
В этом примере можно создать код HDL из трех функций. Чтобы создать локальные копии всех файлов в этом примере, чтобы их можно было просматривать и редактировать, нажмите кнопку «Открыть сценарий».
Формат Camera Link состоит из трех управляющих сигналов: F указывает действительный кадр, L - каждую действительную строку и D - каждый действительный пиксель. Для этого примера создайте входные векторы в формате Camera Link для представления базового дополненного видеокадра. Векторы описывают этот кадр 2 на 3, 8-битных оттенков серого. На рисунке активная область изображения находится в пунктирном прямоугольнике, и неактивные пиксели окружают его. Пикселы помечаются значениями в градациях серого.
![]()
F = logical([0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0]); L = logical([0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0]); D = logical([0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0]); pixel = uint8([0,0,0,0,0,0,0,30,60,90,0,0,0,120,150,180,0,0,0,0,0,0,0,0]);
Создайте функцию для инвертирования изображения с помощью алгоритмов панели инструментов Vision HDL. Функция содержит системный объект, поддерживающий создание кода HDL. Эта функция ожидает и возвращает пиксель и соответствующие управляющие сигналы в формате панели инструментов Vision HDL.
function [pixOut,ctrlOut] = InvertImage(pixIn,ctrlIn) persistent invertI; if isempty(invertI) tabledata = linspace(255,0,256); invertI = visionhdl.LookupTable(uint8(tabledata)); end % *Note:* This syntax runs only in R2016b or later. If you are using an % earlier release, replace each call of an object with the equivalent |step| % syntax. For example, replace |myObject(x)| with |step(myObject,x)|. [pixOut,ctrlOut] = invertI(pixIn,ctrlIn); end
pixelcontrol ФорматСоздайте пользовательский объект System для преобразования сигналов связи с камерой в формат управляющего сигнала панели инструментов Vision HDL. Объект преобразует управляющие сигналы, а затем вызывает pixelcontrolstruct для создания структуры, ожидаемой объектами Vision HDL Toolbox System. Этот фрагмент кода показывает логику преобразования сигналов.
ctrl = pixelcontrolstruct(obj.hStartOutReg,obj.hEndOutReg,...
obj.vStartOutReg,obj.vEndOutReg,obj.validOutReg);vStart = obj.FReg && ~obj.FPrevReg; vEnd = ~F && obj.FReg; hStart = obj.LReg && ~obj.LPrevReg; hEnd = ~L && obj.LReg;
obj.vStartOutReg = vStart; obj.vEndOutReg = vEnd; obj.hStartOutReg = hStart; obj.hEndOutReg = hEnd; obj.validOutReg = obj.DReg;
Объект сохраняет значения входного и выходного управляющих сигналов в регистрах. vStart зашкаливает в течение одного цикла в начале F. vEnd зашкаливает в течение одного цикла в конце F. hStart и hEnd получаются аналогично из L. Объект возвращает текущее значение ctrl каждый раз, когда вы его называете.
Эта обработка добавляет два цикла задержки к управляющим сигналам. Объект проходит через значение пикселя после совпадающих циклов задержки. Полный код объекта System см. в разделе CAMERALINKtoVHT_Adapter.m.
pixelcontrol Связь с камеройСоздайте пользовательский объект System для преобразования сигналов панели инструментов Vision HDL в формат Camera Link. Объект вызывает pixelcontrolsignals функция сглаживания управляющей структуры в ее составляющие сигналы. Затем он вычисляет эквивалентные сигналы Camera Link. Этот фрагмент кода показывает логику преобразования сигналов.
[hStart,hEnd,vStart,vEnd,valid] = pixelcontrolsignals(ctrl);
Fnew = (~obj.FOutReg && vStart) || (obj.FPrevReg && ~obj.vEndReg); Lnew = (~obj.LOutReg && hStart) || (obj.LPrevReg && ~obj.hEndReg);
obj.FOutReg = Fnew; obj.LOutReg = Lnew; obj.DOutReg = valid;
Объект сохраняет значения входного и выходного управляющих сигналов в регистрах. F выше от vStart кому vEnd. L выше от hStart кому hEnd. Объект возвращает текущие значения FOutReg, LOutReg, и DOutReg каждый раз, когда вы его называете.
Эта обработка добавляет один цикл задержки к управляющим сигналам. Объект проходит через значение пикселя после соответствующего цикла задержки. Полный код объекта System см. в разделе VHTtoCAMERALINKAdapter.m.
Оберните объекты converter System в функции, подобные InvertImageТаким образом, можно создать код HDL для этих алгоритмов.
function [ctrl,pixelOut] = CameraLinkToVisionHDL(F,L,D,pixel) % CameraLink2VisionHDL : converts one cycle of CameraLink control signals % to Vision HDL format, using a custom System object. % Introduces two cycles of delay to both ctrl signals and pixel data. persistent CL2VHT; if isempty(CL2VHT) CL2VHT = CAMERALINKtoVHT_Adapter(); end [ctrl,pixelOut] = CL2VHT(F,L,D,pixel);
Посмотрите CameraLinkToVisionHDL.m, и VisionHDLToCameraLink.m.
Чтобы инвертировать поток пикселей Camera Link с помощью этих компонентов, напишите скрипт тестового стенда, который:
Предварительное выделение выходных векторов для сокращения времени моделирования
Преобразует управляющие сигналы Camera Link для каждого пикселя в формат панели инструментов Vision HDL
Вызывает Invert функция для разворота каждого значения пикселя
Преобразует управляющие сигналы для этого пикселя обратно в формат Camera Link
[~,numPixelsPerFrame] = size(pixel); pixOut = zeros(numPixelsPerFrame,1,'uint8'); pixel_d = zeros(numPixelsPerFrame,1,'uint8'); pixOut_d = zeros(numPixelsPerFrame,1,'uint8'); DOut = false(numPixelsPerFrame,1); FOut = false(numPixelsPerFrame,1); LOut = false(numPixelsPerFrame,1); ctrl = repmat(pixelcontrolstruct,numPixelsPerFrame,1); ctrlOut = repmat(pixelcontrolstruct,numPixelsPerFrame,1); for p = 1:numPixelsPerFrame [pixel_d(p),ctrl(p)] = CameraLinkToVisionHDL(pixel(p),F(p),L(p),D(p)); [pixOut(p),ctrlOut(p)] = Invert(pixel_d(p),ctrl(p)); [pixOut_d(p),FOut(p),LOut(p),DOut(p)] = VisionHDLToCameraLink(pixOut(p),ctrlOut(p)); end
Результирующие векторы представляют этот инвертированный кадр 2 на 3 8-битных оттенков серого. На рисунке активная область изображения находится в пунктирном прямоугольнике, и неактивные пиксели окружают его. Пикселы помечаются значениями в градациях серого.

При наличии лицензии DSP System Toolbox™ векторы можно просматривать как сигналы с течением времени с помощью логического анализатора. Этот сигнал показывает pixelcontrol и управляющие сигналы Camera Link, начальные значения пикселей и задержанные значения пикселей после каждой операции.

pixelcontrolsignals | pixelcontrolstruct