Open mtxslv opened 4 years ago
Eu notei que o cálculo dos centróides está atrelado aos sliders do tempo de processamento de vídeo. Isso altera os centróides esperados pelos testes separados, visto que lá o tempo usado (frame_inicial
e frame_final
) é diferente.
Um dos centróides está sempre vindo nulo ([0 0 0]). Não entendo o porquê.
Uma hora é interessante plotar as cores encontradas. Supondo uma cor qualquer:
>> imaje = [72.8047 22.3412 30.9006]
Dá pra usar:
>>image(reshape(uint8(imaje),[1,1,3]))
Estou testando o calcula_centroids_cov_rgb
. Alterei a função e rodei o comando (após pôr no Workspace as variáveis do variaveis_calculaMediaCovarianciaHSV
):
>> [media,variancia] = calcula_centroids_cov_rgb(video, 4220, 4225, wbackg,Vrm, nanimais, mascara, minpix, maxpix, threshold, aviobj2, criavideodiff, tipsubfundo, colorida, 0.15,0.5,5)
depois, para plotar as cores:
>> image(reshape(uint8(media(1,:)),[1,1,3]))
>> image(reshape(uint8(media(2,:)),[1,1,3]))
Alcancei os valores:
media =
19.6208 21.1455 48.5104
74.2650 22.1734 24.9002
variancia =
[3x3 double] [3x3 double]
> > variancia{1}
ans =
79.4257 81.3291 183.4570
81.3291 89.8574 198.5089
183.4570 198.5089 466.9247
> > variancia{2}
ans =
25.3628 10.2520 10.4282
10.2520 23.5695 10.6866
10.4282 10.6866 6.5847
Após pegar as variáveis de teste corretas, rodei o seguinte teste:
>> [media,variancia] = calcula_centroids_cov_rgb(video, 4220, 4350, wbackg,Vrm, nanimais, mascara, minpix, maxpix, threshold, aviobj2, criavideodiff, tipsubfundo, colorida, 0.15,0.5,5)
o que retornou o seguinte resultado:
media =
43.8112 26.8470 41.7825
0 0 0
variancia =
[3x3 double] [3x3 double]
>> variancia{1}
ans =
454.3204 0.1983 -295.1956
0.1983 12.1296 17.0885
-295.1956 17.0885 270.2891
>> variancia{2}
ans =
0 0 0
0 0 0
0 0 0
O que é bizarro. Note que eu adicionei mais frames (o tempo final pulou de 4225 pra 4350). Ou seja, se os frames "adicionais" não contribuem com nada, por que eles levam o resultado pra um vetor (e uma matriz) nulos?
Eu tentei colocar o (cor==1)
, mas deu um erro na dimensão da matriz (o wframe
estaria com dimensões erradas, pelo jeito).
@mtxslv , cheque isso depois.
Note que, em teoria, sempre que cor
fosse igual a 3, colorida
deveria ser igual a 1. Nas variáveis de teste que salvei, tenho uma cor
igual 3, enquanto que colorida
é igual a 0. Estranho... mas por que estou me preocupando com isso? Bem... na teoria, quando eu testasse o calcula_centroids_cov_rgb
, os centroides deveriam ser iguais (as covariâncias também, mas nem chequei) com os centroides que eu calculei quando estava desenvolvendo a função. Por que estão diferentes? Bem, Marcelo também tirou o (cor==1)
. Será que não é isso?
Hoje eu testei a função pondo o cor
de volta (usei a cor
salva nas variáveis de teste). Rodei a função e consegui os mesmos centróides:
media =
19.6208 21.1455 48.5104
74.2650 22.1734 24.9002
Eu coloquei o calcula_centroids_cov_rgb.m
no ponto em que estava quando deixei ele funcional. Ou seja, resgatei uma versão antiga. Testei a função sozinha (talvez seja psicológico), e ela tá ok: resgatei a versão correta. Vou tentar integrá-la ao código.
Agora eu testei a função calcula_centroids_cov_rgb.m
sozinha e integrada ao Zebtrack.
Eu adicionei um display pra ver os parâmetros de entrada, e notei o seguinte.
[media,variancia] = calcula_centroids_cov_rgb(video, 130, 131, wbackg,Vrm, nanimais, mascara, minpix, maxpix, threshold, aviobj2, criavideodiff, tipsubfundo, colorida, cor, 0.15,0.5,5)
), o display avisou o seguinte:
tempo_inicial = 130; tempo_final= 131
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
media =
16.8551 17.5273 46.9518 68.4715 21.8971 22.6197
variancia =
[3x3 double] [3x3 double]
* Anteriormente eu havia executado a função dentro do Zebtrack e obtive o seguinte resultado:
tempo_inicial = 130; tempo_final= 131 no valid pixels found no valid pixels found no valid pixels found
centroids =
22.4838 20.1587 55.7201 0 0 0
Rodei a calcula_centroids_cov_rgb
sozinha. Eis os resultados:
[media,variancia] = calcula_centroids_cov_rgb(video, tempo_inicial, tempo_final, wbackg,Vrm, nanimais, mascara, minpix, maxpix, threshold, aviobj2, criavideodiff, tipsubfundo, colorida, cor, 0.15,0.5,5)
tempo_inicial = 168; tempo_final= 169
FILE0001_x264.mp4 , nanimais= 2 , maxpix = 0, minpix= 2
tol=10, avi= 0criavideo=0tipsubfundo= 1
colorida= 0 cor= 3
no valid pixels found
media =
23.3055 25.0995 57.2719
72.8047 22.3412 30.9006
variancia =
[3x3 double] [3x3 double]
>> variancia{1}
ans =
25.5100 27.2358 56.3421
27.2358 34.3325 63.7181
56.3421 63.7181 143.4295
>> variancia{2}
ans =
24.3727 -0.4904 3.7522
-0.4904 22.9286 20.8271
3.7522 20.8271 39.1767
rodando com o Zebtrack
:
tempo_inicial = 168; tempo_final= 169
FILE0001_x264.mp4 , nanimais= 2 , maxpix = 0, minpix= 2
tol=10, avi= 0criavideo=0tipsubfundo= 1
colorida= 0 cor= 3
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
centroids =
25.2385 26.7002 56.9348
0 0 0
variancia{1} =
variancia{2} =
Como visto devidos aos imshow()
e disp()
, a diferença mais notável que houve foi na variável mascara
. Acontece que a variável mascara
define quais áreas da imagem são processáveis ou não, segundo o que o professor Marcelo indicou. Eu me lembro que , quando eu salvei as variáveis, eu realmente defini áreas não processáveis. Daí a diferença nas máscaras. Entretanto, como comentei com o professor, não acho que isso implique tamanha diferença nos resultados.
Rodei o Zebtrack pra salvar as variáveis V
e mascara
. Eis o resultado:
>> zebtrack
tempo_inicial = 168; tempo_final= 169
FILE0001_x264.mp4 , nanimais= 2 , maxpix = 0, minpix= 2
tol=10, avi= 0criavideo=0tipsubfundo= 1
colorida= 0 cor= 3
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
centroids =
0 0 0
25.2385 26.7002 56.9348
variancia{1} =
variancia{2} =
Rodei a função calcula_centroids_cov_rgb
sozinha, com a máscara usada no trackGUI
. Tudo o mais permanece o mesmo. Eis o resultado do processamento:
>> [media,variancia] = calcula_centroids_cov_rgb(video, tempo_inicial, tempo_final, wbackg,Vrm, nanimais, mascara, minpix, maxpix, threshold, aviobj2, criavideodiff, tipsubfundo, colorida, cor, 0.15,0.5,5)
tempo_inicial = 168; tempo_final= 169
FILE0001_x264.mp4 , nanimais= 2 , maxpix = 0, minpix= 2
tol=10, avi= 0criavideo=0tipsubfundo= 1
colorida= 0 cor= 3
no valid pixels found
media =
23.3055 25.0995 57.2719
72.8047 22.3412 30.9006
variancia =
[3x3 double] [3x3 double]
Rodei a função calcula_centroids_cov_rgb
sozinha, com o V
usado no trackGUI. Tudo o mais permanece o mesmo. Eis o resultado do processamento:
[media, variancia] = calcula_centroids_cov_rgb(video, tempo_inicial, tempo_final, wbackg,Vzin, nanimais, mascara, minpix, maxpix, threshold, aviobj2, criavideodiff, tipsubfundo, colorida, cor, 0.15,0.5,5)
tempo_inicial = 168; tempo_final= 169
FILE0001_x264.mp4 , nanimais= 2 , maxpix = 0, minpix= 2
tol=10, avi= 0criavideo=0tipsubfundo= 1
colorida= 0 cor= 3
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
media =
0 0 0
25.2385 26.7002 56.9348
variancia =
[3x3 double] [3x3 double]
Apagar, na pasta raiz, os resultados do processamento relativos ao vídeo teste. Isso porque, quando abrir o Zebtrack de novo, tudo será reprocessado. Um novo V poderá indicar se o V que usei pra fazer a função tá muito específico e só funciona para aquele caso, ou terá um bom resultado.
Caso recaia na mesma coisa, é possível que minha função tá muuuuuito específica pra os parâmetros vídeo teste. Assim sendo, os parâmetros (thresholds e tals) devem escolhidos pelo usuário no GUI.
Também preciso ajeitar pro zebtrack mostrar no GUI o rastreamento do peixe (onde está a cor que ele encontrou, no handles.axis
)
Apaguei o material da pasta raiz. Não mudou muita coisa:
tempo_inicial = 168; tempo_final= 169
FILE0001_x264.mp4 , nanimais= 2 , maxpix = 0, minpix= 2
tol=10, avi= 0criavideo=0tipsubfundo= 1
colorida= 0 cor= 3
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
no valid pixels found
centroids =
25.2385 26.7002 56.9348
0 0 0
variancia{1} =
variancia{2} =
O V utilizado pelo Zebtrack é aquele oriundo das variáveis que utilizei para escrever a função calcula_centroids_cov_rgb
. Após gerar o dataset, viu-se que os centróides coincidiram com aqueles gerados quando a função é testada sozinha.
Após gerado o dataset
, clico no "Start" (tracking) e recebo o seguinte erro:
Undefined function or variable "centroids".
Error in trackGUI>run_Callback (line 822)
[handles.e.t,handles.e.posicao,handles.e.velocidade,handles.e.parado,handles.e.dormindo,handles.e.tempoareas,handles.e.distperc,handles.e.comportamento]=...
Error in gui_mainfcn (line 95)
feval(varargin{:});
Error in trackGUI (line 50)
gui_mainfcn(gui_State, varargin{:});
Error in
@(hObject,eventdata)trackGUI('run_Callback',hObject,eventdata,guidata(hObject))
Error using waitfor
Error while evaluating UIControl Callback
Após gerado o
dataset
, clico no "Start" (tracking) e recebo o seguinte erro:Undefined function or variable "centroids". Error in trackGUI>run_Callback (line 822) [handles.e.t,handles.e.posicao,handles.e.velocidade,handles.e.parado,handles.e.dormindo,handles.e.tempoareas,handles.e.distperc,handles.e.comportamento]=... Error in gui_mainfcn (line 95) feval(varargin{:}); Error in trackGUI (line 50) gui_mainfcn(gui_State, varargin{:}); Error in @(hObject,eventdata)trackGUI('run_Callback',hObject,eventdata,guidata(hObject)) Error using waitfor Error while evaluating UIControl Callback
Pra consertar esse erro (e um que surgirá logo depois), eu troquei a mencionada linha 822 por:
track(visu,fini,ffim,handles.directoryname,handles.video,pxcm,np,procf,handles.areaproc,handles.areaint,handles.areaexc,criavideores,mostradiff,thresh,filt,handles,fundodina,tipfilt,tipsubfundo,velmin,tempmin,tempminparado,subcor,camlent,trackmouse,liveTracking,trackindividuals, handles.centroids, handles.cov_matrices, actions);
No caso, isso significa trocar "centroids" por handles.centroids e "cov_matrices" por handles.cov_matrices.
Enquanto eu substituía
associatefudera
porassociate_soma_matrizes
, notei que os retornos envolvem as variáveis detectado e caixa. Minha função não retorna isso. Depois preciso checar isso.