RoboticsLabURJC / 2017-tfm-jorge_vela

1 stars 2 forks source link

Añadir extractor de canales del gradiente: ChannelsExtractorGradMag #8

Closed jmbuena closed 4 years ago

jmbuena commented 5 years ago

Aquí añadiríamos lo que se hace en el siguiente código Matlab de chnsCompute.m:

p=pChns.pGradMag; nm='gradient magnitude';
full=0; if(isfield(p,'full')), full=p.full; end
if( pChns.pGradHist.enabled)
  [M,O]=gradientMag(I,p.colorChn,p.normRad,p.normConst,full);
elseif( p.enabled )
  M=gradientMag(I,p.colorChn,p.normRad,p.normConst,full);
end
if(p.enabled), chns=addChn(chns,M,nm,p,0,h,w); end

Así que necesitaríamos llamar a gradientMag.m que a su vez llama a gradientMex.cpp.

jorgevelap commented 4 years ago

He cambiado tanto esta clase como ChannelsExtractorGradHist a partir del anterior ChannelsExtractorMex que había. De aquí he subido los test, cogiendo los valores que se obtenían del código en Matlab y viendo que los resultados eran los mismos. Todavía quiero hacer alguna modificación en los test pero ya se obtienen resultados correctos. He subido al repositorio los cambios realizados.

Estoy teniendo un problema al hacer un include de un .hpp en ambas clases, al añadirlo me aparece un error como que ya esta previamente definida, y no consigo solucionar este error, por lo que de momento estoy probando las clases por separado.

jmbuena commented 4 years ago

Me parece bien. A ver si tengo tiempo de echarle un vistazo al código.

jorgevelap commented 4 years ago

He continuando realizando cambios. Hasta ahora para trabajar utilizaba los arrays creandolos. Estoy ya en el paso en el que paso la imagen, se encarga de convertirla a un array y ya lo llama a la función. Estaba teniendo problemas y parece que convirtiendolo del siguiente modo trabaja bien, Siendo la image un cv::Mat e I0 un float array: for ( int j = 0; j < image.rows; j ++ ) { for ( int i = 0; i < image.cols; i ++ ) { I0[i+j] = (float)image.at(i,j)/255; } }

No se si existe un modo mas rápido para hacer esta conversión, me queda terminar los test para las comprobaciones.

jorgevelap commented 4 years ago

Con respecto a lo anteriormente comentado, pasándole directamente la imagen a la función ya obtengo los mismos resultados que en matlab. He corregido un error que había cometido en el bucle, lo que no se si este proceso de utilizar dos bucle for se notara mas adelante con respecto la velocidad. Adjunto dos imagenes de resultados obtenidos con una imagen real. M_GradMag_Realimg O_GradMag_Realimg

jmbuena commented 4 years ago

Tenemos dos opciones para ganar velocidad: 1) Hacer más rápida la copia: https://stackoverflow.com/questions/18869487/fast-image-or-matrix-transpose-implementation-in-c 2) Modificar las funciones que tenemos de P. Dollar para que todo funcione a pesar de que el buffer de imagen de OpenCV almacene la imagen recorriendo por filas en lugar de por columnas como en Matlab.

Creo que lo suyo es que vayamos a 2).

jorgevelap commented 4 years ago

Vale, el bucle lo hacia también porque no conseguía pasar de otra forma de cv::Mat a un array de float. Al final haciendo los siguientes pasos: cv::Mat dst; image.convertTo(dst, CV_32F); float *data = dst.ptr();

Tengo el resultado con la matriz traspuesta, voy a intentar cambiar las funciones de P.Dollar para recorrer la imagen por filas. De momento, he encontrado que llamando a la función transpose se obtiene el resultado correcto: transpose(dst, dst);

jorgevelap commented 4 years ago

La clase ChannelsExtractorGradMag esta finalizada por el momento, los test funcionan y en la funcion ChannelsCompute retorna el valor correcto, por tanto se da por cerrado este hilo.