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?
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?
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
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
les opérateurs bit effectuent un peu plus vite que la différence, c'est pourquoi j'ai proposé bitwose_and – madduci
Voir la réponse par J. Roy: bitwise_xor devrait être utilisé plutôt que bitwise_and. – sircolinton
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;
}
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
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
vous obtenez plein de vrai/faux tout un tapis;) – berak
Je veux juste obtenir vrai/faux comme valeur de retour. –
"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