Skip to content

associateeuclid

Mateus de Assis Silva edited this page May 8, 2020 · 7 revisions

Funções encontradas nesse arquivo:

O arquivo associateeuclid só possui a função homônima.

Introdução

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).

Como usar

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.

Como funciona

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)>.