CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

function

Vision.Matching.RGBDPatchTracking.SmoothBinomial

Public declarations

Explicit source declarations; dimensions, modifications and defaults are shown as written, without evaluation.

RoleNameTypeDimensions / attributes / defaultDescription
inputgrayReal[:,:]
outputfilteredReal[size(gray,1),size(gray,2)]-1 where complete valid support is unavailable
outputvalidBoolean[size(gray,1),size(gray,2)]

Modelica declarations and implementation

Show parameters, interfaces and source

Parameters, inputs, outputs, defaults and equations from the source file.

function SmoothBinomial
    input Real gray[:,:];
    output Real filtered[size(gray,1),size(gray,2)] "-1 where complete valid support is unavailable";
    output Boolean valid[size(gray,1),size(gray,2)];
  protected
    constant Integer tapCount = 5;
    constant Real weights[tapCount] = {1,4,6,4,1};
    constant Real weightSum = 16;
    Real horizontal[size(gray,1),size(gray,2)]; Real values[tapCount]; Boolean supportValid;
  algorithm
    filtered := fill(-1.0,size(gray,1),size(gray,2));
    valid := fill(false,size(gray,1),size(gray,2));
    horizontal := fill(-1.0,size(gray,1),size(gray,2));
    // All taps have positive weight: invalid samples are never renormalized away.
    // The outer two-pixel border has no complete support; no padding is invented.
    if size(gray,1) < tapCount or size(gray,2) < tapCount then return; end if;
    for row in 1:size(gray,1) loop
      for column in 3:size(gray,2)-2 loop
        supportValid := true;
        for tap in 1:tapCount loop
          values[tap] := gray[row,column+tap-3];
          supportValid := supportValid and values[tap] >= 0 and values[tap] <= 1;
        end for;
        if supportValid then horizontal[row,column] := weights*values/weightSum; end if;
      end for;
    end for;
    for row in 3:size(gray,1)-2 loop
      for column in 3:size(gray,2)-2 loop
        supportValid := true;
        for tap in 1:tapCount loop
          values[tap] := horizontal[row+tap-3,column];
          supportValid := supportValid and values[tap] >= 0 and values[tap] <= 1;
        end for;
        if supportValid then
          filtered[row,column] := weights*values/weightSum; valid[row,column] := true;
        end if;
      end for;
    end for;
  end SmoothBinomial;