Christen Fihl wrote:
> Du skulle nok vise lidt kode her også. Ellers er det ikke til at
> se hvad forskellen på byte og word arrayet er.
Hum... Det er lidt svært, da det meste er pseudokode lige nu. Men jeg
skal gerne prøve at beskrive lidt nøjere:
Jeg skal lave realtime analyse af videobilleder. Små dyr i petriskåle
filmes og jeg skal lokalisere dem og følge deres bevægelser. Dyrene
klassificeres på farve og på form.
Først gennemløbes billedet og alle pixels der opfylder farvekravene
markeres med en værdi.
1) Hvis en kravsopfyldende pixel (KP) befinder sig nedenfor eller til
højre for en anden KP, får den samme værdi som denne.
2) Hvis en KP ikke optræder nedenfor eller til højre for en anden KP,
får den en ny værdi.
3) Hvis der både er en KP ovenfor og til venstre for den aktuelle KP og
disse to pixels har forskellig værdi, huskes der på at disse to værdier
er ækvivalente.
4) Efter første gennemløb laves et nyt gennemløb, hvor ækvivalente KP
slåes sammen.
Ved at benytte bytes, kan der logisk nok kun være 255 forskellige
områder. I praksis går det nok, selvom jeg nok ville foretrække et par
tusinde.
> Men hvis du laver en array med statisk størrelse, og så allokerer
> den senere, så bruger du igen en pointer, altså en ekstra
> operation.
Til min test lavede jeg en simpel form, hvor jeg definerede de
forskellige arrays under public:
public
ar: TMyArray;
ar2: TMyFixedArray;
ar3: TMyWordArray;
De forskellige arrays var så defoneret under type:
TMyArray = array of array of byte;
TMyFixedArray = array[0..767] of array[0..1023] of byte;
TMyWordArray = array[0..767] of array[0..1023] of word;
Det må næsten betyde en dynamisk allokering, da Formen jo er et objekt
der skabes? Burde hastigheden for det dynamiske array og det statiske
så ikke være den samme?
Jeg prøvede at definere et array som var udenfor objektet og det var
ca. et millisekund hurtigere end det statiske array definerer under
Form. Desværre er det ikke umiddelbart brugbart i praksis, da jeg gerne
vil kunne anvende et vilkårligt antal arrays (svarende til et
vilkårligt antal petriskåle).
> Hvis det laver meget beregning på de samme data, kunne du fx
> kopiere en klump af gangen (fx en hel scanline eller flere) til en
> statisk allokeret buffer, og så arbejde deri.
Mnaeh, som det måske fremgår af min beskrivelse er de lokale
beregninger meget simple, men der kræves hastig gennemløb af alle data.
Foreløbig tak for hjælpen. Jeg kunne selvfølgelig overveje en
allokering under var af et (forhåbentligt fornuftigt sat) vist antal af
arrays...
--
Toke Eskildsen -
http://ekot.dk/