Ich habe zwei Instanzen von cv :: Mat: m1 und m2. Sie haben denselben numerischen Typ und dieselbe Größe. Gibt es eine Funktion in OpenCV, die zurückgibt, ob die Matrizen identisch sind (haben alle die gleichen Werte)?wie überprüft man, ob zwei Matrizen in OpenCV identisch sind
Antwort
Verwenden Sie cv::compare kombiniert mit cv::countNonZero.
Eine SO Frage, die Ihnen weiterhelfen könnte OpenCV compare two images and get different pixels
Wie von Acme erwähnt, können Sie cv::compare
verwenden, obwohl es nicht so sauber ist, wie Sie hoffen könnten.
Im folgende Beispiel wird cv::compare
unter Verwendung des !=
operator genannt:
// Get a matrix with non-zero values at points where the
// two matrices have different values
cv::Mat diff = a != b;
// Equal if no elements disagree
bool eq = cv::countNonZero(diff) == 0;
Vermutlich wäre es schneller, wenn die Elemente im Vergleich zu nur durchlaufen? Wenn Sie den Typ wissen, könnten Sie die STL equal Funktion:
bool eq = std::equal(a.begin<uchar>(), a.end<uchar>(), b.begin<uchar>());
'bool eq = cv :: countNonZero (a! = B) == 0;'. Ich denke, das ist einigermaßen sauber. Am ärgerlichsten ist, dass Sie den Vergleichsoperator mit dem vergleichen müssen, was Sie eigentlich wissen wollen ('! =' Anstelle von '=='), da es keine 'countZero()' -Funktion gibt. – nobar
Die cv :: Mat kann oder kann nicht kontinuierlich, ich bin nicht sicher, dass die Bytes Auffüllen von jeder Zeile den gleichen Wert hat. – StereoMatching
Ja, aber ich glaube, dass die Mat-Iteratoren sich darum kümmern? http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-begin –
Wie von Acme und Tim erwähnt, können Sie cv::compare
verwenden. Dies ist der Code, den ich vergleichen verwenden, um meine cv::Mat
:
bool matIsEqual(const cv::Mat mat1, const cv::Mat mat2){
// treat two empty mat as identical as well
if (mat1.empty() && mat2.empty()) {
return true;
}
// if dimensionality of two mat is not identical, these two mat is not identical
if (mat1.cols != mat2.cols || mat1.rows != mat2.rows || mat1.dims != mat2.dims) {
return false;
}
cv::Mat diff;
cv::compare(mat1, mat2, diff, cv::CMP_NE);
int nz = cv::countNonZero(diff);
return nz==0;
}
Es ist wichtig, dass die Funktion stehen cv::countNonZero
only works with cv::Mat
of one channel, also wenn Sie benötigen zwei cv::Mat
Bilder vergleichen zu können, müssen Sie zuerst Ihre cv::Mat
auf diese Weise konvertieren:
Mat gray1, gray2;
cvtColor(InputMat1, gray1, CV_BGR2GRAY);
cvtColor(InputMat2, gray2, CV_BGR2GRAY);
wo InputMat1
und InputMat2
sind die cv::Mat
Sie vergleichen möchten. Danach können Sie die Funktion aufrufen kann:
bool equal = matsEqual(gray1, gray2);
ich diesen Code dieser Seite nahm: OpenCV: compare whether two Mat is identical
hoffe, dass ich diese Hilfe Sie.
Durch die Umwandlung der Bilder in Graustufen verlieren Sie Informationen und möglicherweise machen Sie identische 2-farbige Bilder ursprünglich unterschiedlich. – Antonio
Dies ist der Code, den ich Generika vergleichen verwenden (nicht auf Abmessungen oder Typ von Elementen abhängig) cv::Mat
Instanzen:
bool matIsEqual(const cv::Mat Mat1, const cv::Mat Mat2)
{
if(Mat1.dims == Mat2.dims &&
Mat1.size == Mat2.size &&
Mat1.elemSize() == Mat2.elemSize())
{
if(Mat1.isContinuous() && Mat2.isContinuous())
{
return 0==memcmp(Mat1.ptr(), Mat2.ptr(), Mat1.total()*Mat1.elemSize());
}
else
{
const cv::Mat* arrays[] = {&Mat1, &Mat2, 0};
uchar* ptrs[2];
cv::NAryMatIterator it(arrays, ptrs, 2);
for(unsigned int p = 0; p < it.nplanes; p++, ++it)
if(0!=memcmp(it.ptrs[0], it.ptrs[1], it.size*Mat1.elemSize()))
return false;
return true;
}
}
return false;
}
Ich verstehe nicht, warum cv::Mat
kein Betreiber dieses ==
nach hat Implementierung.
Ich benutze diese:
bool areEqual(const cv::Mat& a, const cv::Mat& b) {
cv::Mat temp;
cv::bitwise_xor(a,b,temp); //It vectorizes well with SSE/NEON
return !(cv::countNonZero(temp));
}
Wenn Sie diesen Vorgang mehrmals zu tun haben, können Sie diese in eine Klasse machen, müssen temp
als Mitglied und verhindern, dass das Bild jedes Mal zugeordnet werden. Detail: Machen Sie temp
veränderbar, so dass areEqual
eine const
Methode sein kann.
Beachten Sie jedoch, dass cv::countNonZero
only works with cv::Mat
of one channel. Es ist Overkill, aber in diesem Fall könnte man cv::split
verwenden, um jeden Kanal in separate Bilder zu teilen und cv::countNonZero
auf ihnen zu tun.
Die folgende auch für Mehrkanal-Matrizen arbeiten:
bool isEqual = (sum(img1 != img2) == Scalar(0,0,0,0));
Da sum Matrizen mit 1 bis 4 Kanälen annehmen, und gibt ein Scalar
, wo das Element auf [0] das Ergebnis der Summe ist, für den ersten Kanal und so weiter.
Eine weitere Möglichkeit, eine einzelne Funktion zu verwenden, wäre mit:
bool areIdentical = !cv::norm(img1,img2,NORM_L1);
Da L1-Norm wird als ∑I|img1(I)−img2(I)|
berechnet
Referenz: OpenCV norm
- 1. Wie überprüft man, ob alle Werte im Array identisch sind?
- 2. Wie überprüft man, ob zwei Datenrahmen gleich sind
- 3. Wie überprüft man, ob zwei Torch-Tensoren oder Matrizen gleich sind?
- 4. Wie überprüft man, ob zwei Pfade in Bash gleich sind?
- 5. Wie überprüft man, ob zwei Bilder in Java mit openCV vergleichbar sind oder nicht?
- 6. Wie zu beurteilen, ob zwei Schriftarten in GDI identisch sind +
- 7. Wie überprüft man, ob zwei Wörter Anagramme sind Python
- 8. Wie überprüft man, ob zwei Formatzeichenfolgen kompatibel sind?
- 9. sage mathematik: wie überprüft man, ob zwei Ausdrücke äquivalent sind?
- 10. Wie überprüft man, ob Konturen gleich sind?
- 11. Wie überprüft man, ob zwei Knoten verbunden sind?
- 12. Wie man überprüft, ob zwei NSDates vom selben Tag sind
- 13. Wie kann ich überprüfen, ob zwei reguläre Ausdrücke identisch sind?
- 14. Wie kann ich feststellen, ob zwei .NET-DLLs identisch sind?
- 15. Wie überprüft man, ob alle Werte in den Spalten einer Matrix identisch sind?
- 16. Python, wie man zwei Matrizen in numpy
- 17. Wie verkettet man zwei Matrizen in Python?
- 18. Wie überprüft man, ob in PHP nur Leerzeichen enthalten sind?
- 19. Wie überprüft man, ob alle Felder in Oracle eindeutig sind?
- 20. wie überprüft man, ob 3 Zeichen in alphabetischer Reihenfolge sind
- 21. Wie überprüft man, ob zwei Arrays die gleichen Werte enthalten?
- 22. Wie überprüft man, ob sich zwei Zeitbereiche überschneiden?
- 23. Wie überprüft man, ob in Actionscript zwei Objekte vom selben Typ sind?
- 24. Wie überprüft man, ob iPhone und Apple Watch verbunden sind
- 25. Wie überprüft man, ob Formularelemente nicht leer sind?
- 26. Wie überprüft man, ob Attribute mit RelaxNG eindeutig sind?
- 27. Wie überprüft man, ob 2 Dateien mit .NET gleich sind?
- 28. Wie überprüft man, ob POST-Formulardaten leer sind?
- 29. Wie überprüft man, ob Cookies leer sind oder nicht
- 30. Wie überprüft man, ob localhost
Ich war derjenige, der die Antwort bearbeiten, weil es unvollständig, aber ich muss sagen, dass 'cv :: countNonZero' nicht für Mehrkanalbilder funktioniert. – Antonio