2014-09-04 8 views
3

J'ai 2 cv tableau :: Mat (avec la même taille), et quand je veux les comparer (si identique), je cv :: comparerComparer 2 cv :: Mat

cv::compare(mat1,mat2,dst,cv::CMP_EQ); 

est-il toute fonction qui renvoie vrai/faux?

+0

vous obtenez plein de vrai/faux tout un tapis;) – berak

+0

Je veux juste obtenir vrai/faux comme valeur de retour. –

+0

"Je veux les comparer" - c'est probablement le point faible de votre question. Cherchez-vous la similarité? identité pixel-sage? même objet montré dans les deux images? tout cela nécessiterait des mesures différentes. – berak

Répondre

7

Si vous devez comparer 2 cv :: Mat par la taille, vous pouvez vérifier

if(mat1.size() == mat2.size()) 
    //do stuff 
else 
    //do other stuff 

Si vous avez besoin pour vérifier si 2 cv :: Mat sont égaux, vous pouvez effectuer l'opérateur ANDXOR et vérifier si le résultat est un cv :: Mat plein de zéros:

cv::bitwise_xor(mat1, mat2, dst);   
if(cv::countNonZero(dst) > 0) //check non-0 pixels 
    //do stuff in case cv::Mat are not the same 
else 
    //do stuff in case they are equal 
+1

pas sûr de savoir lequel est le plus rapide, mais 'dst = mat1-mat2;' suivi par le countNonZero ferait la même chose (résultat inversé). – Micka

+1

les opérateurs bit effectuent un peu plus vite que la différence, c'est pourquoi j'ai proposé bitwose_and – madduci

+1

Voir la réponse par J. Roy: bitwise_xor devrait être utilisé plutôt que bitwise_and. – sircolinton

0

Cette fonction retourne true/false basée sur la similitude (non testé)

bool MyCompare(Mat img1, Mat img2) 
{ 
    int threshold = (double)(img1.rows * img1.cols) * 0.7; 

    cv::compare(img1 , img2 , result , cv::CMP_EQ); 
    int similarPixels = countNonZero(result); 

    if (similarPixels > threshold) { 
     return true; 
    } 
    return false; 
} 
+0

ici vous les comparez en fonction d'un seuil. Si vous voulez comprendre si elles sont entièrement égales, vous devez comparer les bits simples ou définir le seuil à – madduci

3

Si vous devez vérifier si 2 cv :: Mat sont égaux, vous pouvez effectuer l'opérateur et vérifier si le résultat est un cv :: Mat complet de zéros:

Le ET l'opérateur n'est pas le bon pour cette tâche. Si une matrice est tout 0, elle retournera toujours vrai, même si l'autre matrice est tous 0 ou non.

Le XOR doit être utilisé dans ce cas.

Voici la version modifiée de blackibiza code:

cv::bitwise_xor(mat1, mat2, dst);   
if(cv::countNonZero(dst) > 0) //check non-0 pixels 
    //do stuff in case cv::Mat are not the same 
else 
    //do stuff in case they are equal