Closed jmbuena closed 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.
Me parece bien. A ver si tengo tiempo de echarle un vistazo al código.
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
No se si existe un modo mas rápido para hacer esta conversión, me queda terminar los test para las comprobaciones.
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.
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).
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);
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.
Aquí añadiríamos lo que se hace en el siguiente código Matlab de chnsCompute.m:
Así que necesitaríamos llamar a gradientMag.m que a su vez llama a gradientMex.cpp.