2012-05-02 10 views
8

Tengo problemas para imprimir los valores de la matriz de descriptores obtenida mediante el uso del método 'calcular' de cualquier extractor de descriptores de opencv. Quiero imprimir el descriptor de una característica en un archivo, uno por uno, pero siempre cuando accedo a algún elemento de la matriz de descriptores con 'at', recibo un valor diferente para ese elemento. La siguiente es una 'de' bucle I utiliza para probar el valor de salida de la matriz de descriptor cuando se utiliza 'a':Imprimir los valores de la matriz de descriptores de puntos clave opencv

for(int i=0; i<nF; i++){ 

    if(lpx != keypoints[i].pt.x && lpy != keypoints[i].pt.y){ 
     usedFeatures++; 
     cerr << descriptors.row(i) << endl << endl; // printing row of descriptor matrix 
     fileS << keypoints[i].pt.y << " " << keypoints[i].pt.x << " "; 
     fileS << keypoints[i].size << " " << keypoints[i].angle << endl; 

     if(i == nF - 2){ 
      //printing subvector of descriptor matrix made of the element at row i and col 0 
      cerr << "get row i, col 0 " << descriptors.row(i).col(0) << endl; 

      //same as before just inverting the order of access 
      cerr << "get col 0, row i: " << descriptors.col(0).row(i) << endl; 


      //printing the value of the element with 'at' 
      cerr << (int)descriptors.at<uchar>(i, 0); 

      //creating a new int and giving it the value of element (i, 0) of descriptor matrix. Should be the same 
      //value shown on the subvector before 
      int test = descriptors.at<uchar>(i, 0); 

      //printing value of element 
      cerr << "i, 0: " << test << endl; 
     } 

El segundo 'si' es una prueba 'si' que hice para ver los valores impresos al acceder a los elementos de los descriptores. Ahora, impreso por el

cerr << descriptors.row(i) << endl << endl; 

en el nF - 2 iteraction, tengo el siguiente resultado:

[20, 11, 0, 18, 51, 3, 0, 3, 133, 50, 0, 0, 0, 0, 0, 11, 133, 18, 0, 0, 0, 0, 0, 3, 
119, 2, 0, 0, 0, 0, 0, 2, 19, 5, 0, 4, 55, 27, 1, 1, 133, 25, 0, 1, 4, 1, 0, 22, 133, 
18, 0, 0, 0, 0, 0, 14, 131, 13, 1, 0, 0, 0, 0, 1, 12, 1, 0, 1, 56, 133, 25, 13, 133, 
14, 0, 0, 3, 8, 20, 80, 133, 38, 0, 0, 0, 0, 0, 51, 106, 11, 1, 0, 0, 0, 0, 23, 0, 0, 
0, 0, 19, 126, 70, 11, 23, 0, 0, 0, 0, 9, 83, 133, 53, 1, 0, 0, 0, 0, 2, 133, 26, 
3, 2, 0, 0, 0, 0, 28] 

Y como era de esperar, las dos primeras impresiones en el interior del segundo 'si':

cerr << "get row i, col 0 " << descriptors.row(i).col(0) << endl; 

cerr << "get col 0, row i: " << descriptors.col(0).row(i) << endl; 

dame [20]

Pero los otros dos impresiones

cerr << (int)descriptors.at<uchar>(i, 0); 

y

int test = descriptors.at<uchar>(i, 0); 
cerr << "i, 0: " << test << endl; 

dame 0 en lugar de 20. El resultado completo que tenía para la línea nF-2 mostré antes, cuando se accede a los elementos con 'a' e imprimirlas fue:

0 0 160 65 0 0 48 65 0 0 0 0 0 0 144 65 0 0 76 66 
0 0 64 64 0 0 0 0 0 0 64 64 0 0 5 67 0 0 72 66 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 48 65 0 0 5 67 0 0 144 65 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 64 0 0 238 66 
0 0 0 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 64 

Que es completamente diferente de lo que esperaba. Ya he intentado muchas cosas: lanzar con float, double, unsigned int en lugar de only int, y asignarle también variables de esos tipos; convirtiendo la matriz antes de imprimirla, copiando la matriz y luego convirtiéndola, creando la matriz de descriptores con un tipo diferente ... pero ninguno funcionó. Sospecho que tiene algo que ver con el tipo de matriz de descriptores, aunque estoy casi seguro de que tiene el tipo uchar (lo comprobé con elemSize)

Gracias de antemano, y disculpe mi inglés y el tamaño de la pregunta.

Respuesta

7

Encontrado la respuesta. De hecho, fue un problema de tipo. El tipo de matriz de descriptor devuelto por no es uchar como pensaba, en realidad es flotante.Obteniendo el valor con

(float)descriptors.at<float>(i, 0); 

me da el valor correcto. Lo gracioso es que podría jurar que lo intenté para flotar antes, y no funcionó. Debo haberlo intentado solo para int, double y unsigned int.

1

Esto no responde por qué ocurre su problema, pero recuerdo haber tenido problemas similares al intentar acceder a mis valores de descriptor.

Estaba tratando de escribir un fragmento de código que funcionaría con cualquier descriptor, ya que OpenCV tiene múltiples cv::DescriptorExtractor s implementadas. La cuestión es que, dado que algún día podré crear mis propias librerías independientes de OpenCV que funcionen con mis interfaces de descriptores, quería todos los descriptores en las estructuras std::vector<vector<double> >.

Aquí está mi código que convierte a cv::Mat descOldstd::vector< std::vector <double> > desc:

cv::DescriptorExtractor *descCalc; 

// initialize descCalc 

descCalc->compute(*image, feats, descOld); 

// conversion to std::vector<std::vector <double> > : 

const double *temp; 
desc.clear(); 
desc.reserve(descOld.cols); 
for (int i=0, szi = this->desc.rows; i < szi; ++i){ 
    temp = descOld.ptr<double>(i); 
    desc.push_back(std::vector<double>(temp, temp+descOld.cols)); 
} 

assert(desc.size() == descOld.rows); 
assert(desc[0].size() == descOld.cols); 

espero que ayude un poco.

+0

Gracias! Aunque no resuelve el problema que estoy teniendo en este momento, esta conversión podría ser útil para mí en el futuro, ¡así que agradezco su respuesta! –

+0

@Alberto A Sé que no responde el "por qué" de su problema, pero puede intentar acceder a las descripciones como 'doble'? En mi caso, 'temp' es solo un puntero al comienzo de la fila, pero para obtener el primer elemento de la fila usando' temp', simplemente tendría que 'double val = * temp'. Tal vez intentar así? Sé que también me costó encontrar el tipo apropiado para acceder a los descriptores. – penelope

Cuestiones relacionadas