-
Notifications
You must be signed in to change notification settings - Fork 2
associateeuclid
O arquivo associateeuclid
só possui a função homônima.
Se a documentação dos arquivos blob_colours
e calculaMediaVarianciaHSV
foi lida antes desses, nota-se que o propósito do cômputo de uma métrica de cor é a associação dos peixes (o que se deseja) aos blobs (o que se possui). Logo após calcular-se as métricas, utiliza-se códigos de associação (esse é um deles, junto a associatefudera
).
O código associateeuclid
associa os peixes aos blobs, para um frame apenas (o atual).
O usuário define a quantidade de blobs (ndetect
, um valor escalar) e de animais (nanimais
), além de algumas saídas importantes da função extractnblobs
(sendo essas cx
, cy
, radius
, boundingbox
).As variáveis l
e c
indicam as dimensões da tela (largura e comprimento). A(s) posição(ões) atual(is) é(são) indicada(s) nas variáveis pxa
e pya
. O vetor booleano detectado
indica se os animais foram detectados. As variáveis dicax
e dicay
são utilizadas para corrigir a posição do peixe (são definidas pelo usuário). A variável caixa
indica ainda falta. Por fim, a variável frame
é a imagem a ser analizada.
A função retorna as posições dos animais (pxn
e pyn
), a confirmação que foram detectados (vetor boleano detectado
) e as bounding boxe (através de caixa
).
O que o usuário coloca como input
e o que recebe como output
.
O primeiro passo é guardar (ao menos momentaneamente) as posições atual (pxa
e pya
) nos valores de saída pxn
e pyn
. Pense nisso como uma espécie de "memória": guardamos uma "posição antiga mais recente lembrada".
Vale notar também que, se nenhum blob for detectado, o código termina. Esse é o próximo passo.
A próxima etapa é associar as posições atuais à dica (se houver). Ora, se dicax
e dicay
não forem ambos iguais a -1, algum dica foi dada. Logo, basta iterar animal a animal, e calcular-se a distância desse ser à dica. Ora, a menor distância indica qual animal se relaciona a dica dada.
Aloca-se o vetor blobdetectado
, com valores inicialmente nulos para cada blob detectado (ndetect
). Aloca-se, também, o vetor bidimensional md
, com dimensões ndetect x nanimais.
o vetor bidimensional md
, então, recebe as distâncias euclidianas entre todos os blobs e todos animais: md( j , k ) = distancia euclidiana entre um blob j e um animal k
.
Inicia-se, logo após, um processo iterativo, que irá permanecer em execução enquanto houverem animais ou blobs sem associação. Nessa condição (de falta de associação), o centro de massa do blob será associado com a posição do animal: <pxn(animal), pyn(animal)> = <cx(blob), cy(blob)>
.