2016-07-07 1 views
0

Déclaration de l'image du tapis et attribution de valeurs.Single Channel OpenCV Mat.at <> donne des valeurs erronées

Mat magnitude = Mat(gradient_columns.cols, gradient_columns.rows, CV_64FC1); 
for(int i = 0; i < gradient_columns.cols; i++) 
{ 
    for(int j = 0; j < gradient_columns.rows; j++) 
    { 
     magnitude.at<double>(Point(i,j)) = (double)hypot(gradient_columns.at<double>(Point(i,j)), gradient_rows.at<double>(Point(i,j))); 
    } 
} 

Impression du tapis ci-dessus:

cout << "M = " << magnitude << endl; 

Résultat:

M = [0, 0, 0.1257399049164523, 12.36316814720732, 12.50461780753356, 0.2674320707434279, 10.39230484541326, 12.03299037437945, 5.430256687374658, 
12.03299037437945, 4.684492386402418, 4.72934192083521, 12.16431633381293, 5.397674732957373, 12.30042244512288, 10.25834261322606, 0.3944487245360109, 
12.16431633381293, 11.84297951775486, 12.44187210544911, 12.10132213098092, 
0.4088817310696626, 10.15078660267586, 12.09573607646389, 2.076275433221507, 0, 0.1257399049164523, 0, 0.1257399049164523, 0; 
..... 
.....] 

Le résultat ci-dessus est tout à fait correct et comme prévu.

Cependant, si je tente d'imprimer des valeurs individuelles j'obtenir des résultats erronés:

cout.precision(20); 
cout << "CHANNELS: " << magnitude.channels() << endl; 
cout << magnitude.at<double>(Point(0, 2)) << endl; 
cout << magnitude.at<double>(Point(0, 3)) << endl; 
cout << magnitude.at<double>(Point(0, 4)) << endl; 
cout << magnitude.at<double>(Point(0, 5)) << endl; 

Result | Actual Value: 
CHANNELS: 1 
0.062870 | 0.1257399049164523, 
0.000000 | 12.36316814720732, 
0.031404 | 12.50461780753356, 
0.000000 | 0.2674320707434279 

Je comprends son une question de conversion de type de données, mais si quelqu'un peut suggérer une solution?

Merci.

+0

Pas une réponse à votre question mais au lieu de 'Mat.at (Point (i, j))', je trouve généralement plus clair d'écrire 'Mat.at (j, i)' – Sunreef

+0

une remarque supplémentaire: Pour de meilleures performances, vous devriez échanger les deux pour les boucles (itérer sur les lignes dans la boucle externe) – Micka

Répondre

0

Je crois qu'il n'y a rien de mal avec votre matrice. Vous n'imprimez simplement pas ce que vous pensez être. Lorsque vous écrivez magnitude.at<double>(Point(0,2)), vous n'imprimez pas le nombre dans la ligne 0 et la colonne 2 comme prévu, mais le nombre dans la ligne 2 et la colonne 0. Essayez d'écrire magnitude.at<double>(0,2) à la place.

+0

C'est correct, maintenant je comprends! Merci! –