-
Notifications
You must be signed in to change notification settings - Fork 2
blob_colours
- blob_colours
- transformada_HSV
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.
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 c
indicam 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.
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.
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
.
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;
.
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