Skip to content

blob_colours

Mateus de Assis Silva edited this page Jul 1, 2020 · 16 revisions

Funções encontradas nesse arquivo

  1. blob_colours
  2. transformada_HSV

Introdução

Até antes da existência do reconhecimento via proximidade de cor, o Zebtrack reconhecia os peixes ao localizar os blobs e associá-los com os indivíduos mais próximos. De forma a refinar essa associação, utilizava-se uma "previsão" da posição dos peixes no próximo momento. Isso é passível de falha, pois os animais podem se movimentar de forma a confundir o software.

Um desses movimentos é quando os peixes se deslocam em retas concorrentes. No ponto de encontro das retas eles não prosseguem, mas se desviam. Isso faz com que o software troque as labels relativas a cada animal.

Assim se torna necessário uma forma de diferenciar os indivíduos. Dentre algumas possibilidades, utilizaremos um critério de cor.

Ao longo do monitoramento, se o usuário quiser acompanhar os indivíduos (peixes), o blob_colours irá fornecer as informações de cor para a distância de Mahalanobis, de forma a melhorar a associação blob-peixe.

Como usar

O usuário define o frame a ser analizado, além de passar algumas saídas da função extractnblobs (são essas cx, cy, radius, boundingbox, ndetect - a qual é a quantidade de blobs detectados- e wframe_log). As variáveis l e cindicam as dimensões da tela (largura e comprimento). Por fim, a variável Intensidade indica limiares para Value. Caso deseje saber mais, a página Observações Gerais trata-se do porquê limitar o Value.

A função retorna as médias das cores encontradas para cada blob no frame inserido.

Como funciona

Alocamento e inicialização de algumas variáveis

O início do código se dá com o alocamento de algumas variáveis: cor_atual, que irá receber as cores médias dos blobs e mediaFrameIndividual, a qual é auxiliar no processo de cálcula dessa média.

O frame, então representado no espaço de cores RGB, é convertido para o espaço HSV.

Loop: para cada blob

O primeiro passo é alocar-se as variáveis para serem usadas no tratamento da descontinuidade das cores no sistema HSV. São elas: amostrando, conta_amostrando, quad14, quad23, quad_usado e sizeOfBlob.

Percorrendo a bounding box

No momento de percorrer a Bounding Box, iremos adequar a variável responsável por guardar essa informação (boundingbox). Ora, trata-se de posições e dimensões (das boxes) em uma perspectiva discreta (pixels na tela). Entretanto, o processo que as geram retornam valores em ponto flutuante. Assim, temos que arredondar. Logo depois é necessário passar por uma operação max, min . Isto faz com que o iterador m = round(boundingbox(animal_k,coordenada == 2)) comece em 1.

Dado a necessidade de se tratar a descontinuidado do Hue , é necessário se realizar uma amostragem para se verificar o quadrante em que as cores recaem. Após uma dada transformada (se for necessária), soma-se o valor à média. O cerne do cômputo dos labels se encontra nesse trecho. Em outras palavras: testar o quadrante (somando número arbitrário); aplicação da transformada; somar o valor à média, se não tratar-se de um valor NaN. Ainda não entendi o que ocorre entre as linhas 51 e 134

Logo após o mencionado cálculo, tira-se o valor médio da cor encontrada: mediaFrameIndividual = mediaFrameIndividual/sizeOfBlob; e atribui esse valor a cor_atual(k) de forma que na posição k está atribuído o valor médio da cor calculada no k-ésimo blob. Por fim, prepara-se a variável auxiliar pra recomeçar o processo: mediaFrameIndividual = 0;.

Transformada Inversa

Devido à Transformada HSV, alguns valores podem se tornar negativos. Daí, dado que o valor numérico da tonalidade não pode ser negativo (lembre-se que o hue varia de 0 a 1), basta aplicar a transformada inversa: soma-se o valor atual (negativo) a 1.

atenção, o condicional precisa mudar de if cor_atual(k)>=0.25 && cor_atual(k)<=0.75 && cor_atual(k)<0 para if cor_atual(k)>=0.25 && cor_atual(k)<=0.75 || cor_atual(k)<0