function
Vision.Features.FastCircleScore
Public declarations
Explicit source declarations; dimensions, modifications and defaults are shown as written, without evaluation.
| Role | Name | Type | Dimensions / attributes / default | Description |
|---|---|---|---|---|
| input | differences | Real | [FastCircleStencil.sampleCount] | |
| output | score | Real | |
Modelica declarations and implementation
Show parameters, interfaces and source
Parameters, inputs, outputs, defaults and equations from the source file.
function FastCircleScore
import FastCircleStencil = Vision.Features.FastCircleStencil;
input Real differences[FastCircleStencil.sampleCount];
output Real score;
protected
constant Integer circleSize = FastCircleStencil.sampleCount;
constant Integer arcLength = 9;
Real extended[circleSize+arcLength-1];
Real low2[circleSize+arcLength-3];
Real high2[circleSize+arcLength-3];
Real low4[circleSize+arcLength-5];
Real high4[circleSize+arcLength-5];
Real low8;
Real high8;
Real bright;
Real dark;
Real response;
algorithm
// Reuse ordered minima/maxima for windows of 2, 4, 8, then 9 samples.
for i in 1:circleSize loop
extended[i] := differences[i];
end for;
for i in 1:arcLength-1 loop
extended[i+circleSize] := differences[i];
end for;
for i in 1:size(low2,1) loop
low2[i] := if noEvent(extended[i] < extended[i+1]) then extended[i] else extended[i+1];
high2[i] := if noEvent(extended[i] > extended[i+1]) then extended[i] else extended[i+1];
end for;
for i in 1:size(low4,1) loop
low4[i] := if noEvent(low2[i] < low2[i+2]) then low2[i] else low2[i+2];
high4[i] := if noEvent(high2[i] > high2[i+2]) then high2[i] else high2[i+2];
end for;
// Final arc stages need no intermediate arrays.
score := 0.0;
for arc in 1:circleSize loop
low8 := if noEvent(low4[arc] < low4[arc+4]) then low4[arc] else low4[arc+4];
high8 := if noEvent(high4[arc] > high4[arc+4]) then high4[arc] else high4[arc+4];
bright := if noEvent(low8 < extended[arc+8]) then low8 else extended[arc+8];
dark := -(if noEvent(high8 > extended[arc+8]) then high8 else extended[arc+8]);
response := if noEvent(bright > dark) then bright else dark;
score := if noEvent(score > response) then score else response;
end for;
end FastCircleScore;