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

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

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

Можно сгенерировать HDL-код из трех функций в этом примере. Чтобы создать локальные копии всех файлов в этом примере, чтобы можно было просматривать и редактировать их, нажмите кнопку «Открыть скрипт».

Создайте входные данные в формате Camera Link

Формат Camera Link состоит из трех управляющих сигналов: F указывает на допустимую систему координат, L указывает на каждую действительную линию, и D указывает на каждый действительный пиксель. В данном примере создайте входные векторы в формате Camera Link, чтобы представлять базовый заполненный видеокадр. Векторы описывают эту 8-битную полутоновую систему координат 2 на 3. На рисунке активная область изображения находится в штриховом прямоугольнике, и неактивные пиксели окружают его. Пиксели маркируются своими значениями в градациях серого.

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 Формат

Напишите пользовательский системный объект, чтобы преобразовать сигналы Camera Link в формат управляющего сигнала Vision HDL Toolbox. Объект преобразует сигналы управления, а затем вызывает 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 каждый раз, когда вы его вызываете.

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

Преобразование pixelcontrol к ссылке на камеру

Напишите пользовательский системный объект, чтобы преобразовать сигналы Vision HDL Toolbox обратно в формат 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 каждый раз, когда вы его вызываете.

Эта обработка добавляет один цикл задержки в сигналы управления. Объект проходит через значение пикселя после совпадающего цикла задержки. Полный код для Системного объекта см. в разделе 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.

Написание Испытательного стенда

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

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

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

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

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

См. также

|

Похожие темы