Преобразуйте сигналы управления камерой в формат pixelcontrol

Этот пример преобразовывает сигналы Camera Link® в структуру pixelcontrol, инвертирует пиксели с объектом Vision HDL Toolbox и преобразовывает управляющие сигналы назад в формат Ссылки Камеры.

Блоки Vision HDL Toolbox™ и объекты используют пользовательский формат потокового видео. Если ваша система работает с данными о потоковом видео из камеры, необходимо преобразовать сигналы управления камерой в этот пользовательский формат. Также, если вы интегрируете алгоритмы Vision HDL Toolbox в существующий проект и код подтверждения, который действует в формате камеры, необходимо также преобразовать выходные сигналы проекта Vision HDL Toolbox назад к формату камеры.

Можно сгенерировать HDL-код от трех функций в этом примере.

Создайте входные данные, при закрытых дверях соединяют формат

Формат Ссылки Камеры состоит из трех управляющих сигналов: F указывает, что допустимый кадр, L указывает на каждую допустимую строку, и D указывает на каждый допустимый пиксель. В данном примере создайте входные векторы в формате Ссылки Камеры, чтобы представлять основной заполненный кадр видео. Векторы описывают это 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 Toolbox

Создайте функцию, чтобы инвертировать изображение с помощью алгоритмов Vision HDL Toolbox. Функция содержит Системный объект, который поддерживает генерацию HDL-кода. Эта функция ожидает и возвращает пиксель и сопоставленные управляющие сигналы в формате Vision HDL Toolbox.

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

Запишите пользовательский Системный объект, чтобы преобразовать сигналы Ссылки Камеры в формат управляющего сигнала Vision HDL Toolbox. Объект преобразовывает управляющие сигналы, и затем вызывает функцию pixelcontrolstruct, чтобы создать структуру, ожидаемую Системными объектами Vision HDL Toolbox. Этот фрагмент кода показывает логику, чтобы преобразовать сигналы.

  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 каждый раз, когда вы вызываете его.

Эта обработка добавляет два цикла задержки с управляющими сигналами. Объект проходит через пиксельное значение после соответствия с циклами задержки. Для полного кода для Системного объекта см. CAMERALINKtoVHT_Adapter.m.

Преобразуйте pixelcontrol в ссылку камеры

Запишите пользовательский Системный объект, чтобы преобразовать сигналы Vision HDL Toolbox назад в формат Ссылки Камеры. Вызовы объектов pixelcontrolsignals функционируют, чтобы сгладить управляющую структуру в ее сигналы компонента. Затем это вычисляет эквивалентные сигналы Ссылки Камеры. Этот фрагмент кода показывает логику, чтобы преобразовать сигналы.

  [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 каждый раз, когда вы вызываете его.

Эта обработка добавляет один цикл задержки с управляющими сигналами. Объект проходит через пиксельное значение после соответствующего цикла задержки. Для полного кода для Системного объекта см. VHTtoCAMERALINKAdapter.m.

Создайте функции преобразования та генерация HDL-кода поддержки

Перенесите Системные объекты конвертера в функции, подобные 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.

Запишите испытательный стенд

Чтобы инвертировать пиксельный поток Ссылки Камеры с помощью этих компонентов, запишите скрипт испытательного стенда что:

  1. Предварительно выделяет выходные векторы, чтобы уменьшать время симуляции

  2. Преобразовывает управляющие сигналы Ссылки Камеры для каждого пикселя к формату Vision HDL Toolbox

  3. Вызывает функцию Invert, чтобы инвертировать каждое пиксельное значение

  4. Преобразовывает управляющие сигналы для того пикселя назад к формату Ссылки Камеры

[~,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™, можно просмотреть векторы как сигналы в зависимости от времени с помощью Logic Analyzer. Эта форма волны показывает pixelcontrol и управляющие сигналы Ссылки Камеры, стартовые пиксельные значения и задержанные пиксельные значения после каждой операции.

Смотрите также

|

Похожие темы