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.
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! –
@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