2016-02-13 1 views
0

Ma fonction print est définie comme:Matx33d produit scalaire ne fonctionne pas dans OpenCV

void print(std::string matname, cv::Matx33d A) { 
    fprintf(stdout, "%s = [\n", matname.c_str()); 
    for(int i = 0; i < 3; i++) { 
     for(int j = 0; j < 3; j++) { 
      fprintf(stdout, "%15.10lf", A(i,j)); 
     } 
     fprintf(stdout, "\n"); 
    } 
    fprintf(stdout, "];\n"); 
} 

et j'ai conçu une matrice H et utilisé dans le code suivant:

print("H", H); 
cv::Matx33d Hinv = H.inv(); 
print("H^-1", Hinv); 

cv::Matx33d HdHinv(H.ddot(Hinv)); 
print("H*H^-1", HdHinv); 

cv::Matx33d HinvdH(Hinv.ddot(H)); 
print("H^-1*H", HinvdH); 

Cependant, la sortie est la suivante:

H = [ 
    0.0386192492 0.1756336675 0.0245675072 
    0.1756336675 1.3649487597 -0.2727645303 
    0.0245675072 -0.2727645303 -0.5635269575 
]; 
H^-1 = [ 
    45.9140372920 -5.0221718200 4.4325541956 
    -5.0221718200 1.2173491959 -0.8081812555 
    4.4325541956 -0.8081812555 -1.1901116767 
]; 
H*H^-1 = [ 
    3.0000000000 0.0000000000 0.0000000000 
    0.0000000000 0.0000000000 0.0000000000 
    0.0000000000 0.0000000000 0.0000000000 
]; 
H^-1*H = [ 
    3.0000000000 0.0000000000 0.0000000000 
    0.0000000000 0.0000000000 0.0000000000 
    0.0000000000 0.0000000000 0.0000000000 
]; 

L'inverse semble fonctionner corr ectly, mais pourquoi je reçois ces valeurs du produit scalaire? Est-ce que j'utilise ddot incorrectement? J'ai testé ce produit scalaire dans Matlab et j'obtiens la matrice d'identité (jusqu'à 10 décimales de précision), donc je crois que H et Hinv sont générés correctement.

Répondre

0

"Produit de point"! = "Multiplication de matrice". En fait, cv::Matx33d::ddot() ne retourne même pas une matrice, mais un scalaire. Je n'ai pas essayé, mais probablement operator* fera ce que vous avez l'intention - comme ceci:

cv::Matx33d HdHinv = H * Hinv;