Gibt es ein Äquivalent von oder bincount()
für einen OpenCV Mat
? Ich arbeite mit C++, kann also nicht einfach in ein numpy
Array konvertieren.Liste der eindeutigen Pixelwerte in OpenCV erhalten Mat
7
A
Antwort
12
Nein, gibt es nicht! obwohl Sie können Ihren eigenen Code,:
std::vector<float> unique(const cv::Mat& input, bool sort = false)
Finden Sie die einzigartigen Elemente eines einzelnen Kanals cv :: Mat.
Parameter:
Eingang: Es wird so behandelt werden, wenn es 1-D.
Sortierung: Sortiert die eindeutigen Werte (optional).
Die Implementierung einer solchen Funktion ziemlich geradlinig ist jedoch die einzige mit EinkanalCV_32F
Werke nach:
#include <algorithm>
#include <vector>
std::vector<float> unique(const cv::Mat& input, bool sort = false)
{
if (input.channels() > 1 || input.type() != CV_32F)
{
std::cerr << "unique !!! Only works with CV_32F 1-channel Mat" << std::endl;
return std::vector<float>();
}
std::vector<float> out;
for (int y = 0; y < input.rows; ++y)
{
const float* row_ptr = input.ptr<float>(y);
for (int x = 0; x < input.cols; ++x)
{
float value = row_ptr[x];
if (std::find(out.begin(), out.end(), value) == out.end())
out.push_back(value);
}
}
if (sort)
std::sort(out.begin(), out.end());
return out;
}
Beispiel:
float data[][3] = {
{ 9.0, 3.0, 7.0 },
{ 3.0, 9.0, 3.0 },
{ 1.0, 3.0, 5.0 },
{ 90.0, 30.0, 70.0 },
{ 30.0, 90.0, 50.0 }
};
cv::Mat mat(3, 5, CV_32F, &data);
std::vector<float> unik = unique(mat, true);
for (unsigned int i = 0; i < unik.size(); i++)
std::cout << unik[i] << " ";
std::cout << std::endl;
Ausgänge:
1 3 5 7 9 30 50 70 90
2
Sie könnten versuchen, ein Histogramm mit einer Anzahl von Bins zu erstellen, die der Anzahl der möglichen Pixelwerte entspricht.
Verwandte Themen
- 1. OpenCV: Die Summe der Mat-Werte erhalten
- 2. Zugriff auf Pixelwerte von CV_32F/CV_64F Mat?
- 3. Android OpenCV Liste <KeyPoint> Mat
- 4. Concatenate Mat in OpenCV
- 5. Unterschied der OpenCV Mat Typen
- 6. OpenCV Mat :: one-Funktion
- 7. OpenCV Mat Korruption
- 8. OpenCV Zugangselement von Mat
- 9. OpenCV C++ Mat MADNESS
- 10. Extra Nullen in OpenCV Mat
- 11. OpenCV Mat Bearbeitungszeit
- 12. Wie kann ich Pixelwerte eines EmguCV Mat-Bildes erhalten und einstellen?
- 13. Get Wert von OpenCV Mat
- 14. Opencv im Speicher Mat-Darstellung
- 15. Opencv C++ Lesen opencv Mat zugewiesen Eigenvektor
- 16. OpenCV: imwrite ändert die Pixelwerte der Kanäle beim Speichern
- 17. OpenCV nicht erkennen Mat Größe
- 18. Was ist der Unterschied zwischen UMat und Mat in OpenCV?
- 19. Anzeige OpenCV Mat mit JavaFX
- 20. Mat in Array/Vektor in OpenCV konvertieren
- 21. OpenCV cv :: Mat gesetzt, wenn
- 22. C++ und opencv erhalten und stellen Pixelfarbe Mat
- 23. Erhalten Sie die Liste der eindeutigen Einschränkungsspalten (in TSQL)?
- 24. Sind "InputArray" und "Mat" in opencv gleich?
- 25. Android jpeg pictureCallback in Graustufen OpenCV Mat
- 26. OpenCV - Vektor des Vektors in Mat konvertieren
- 27. python - OpenCV mat :: convertTo in python
- 28. Aktualisierung einer Submatrix von Mat in OpenCV
- 29. OpenCV Mat Konstruktor mit Parametern Rect
- 30. OpenCV Teilbild von einem Mat Bild
Super, danke! – eagle34
warum benutzt du nicht 'std :: set'? – Shai
@Shai Es scheint zunächst eine gute Idee, es ist wahrscheinlich vom Leistungspunkt her schneller, da es garantiert, einzigartige Werte zu speichern. Es macht nutzlos das 'std :: find()' Ich platzierte es im Code und es wird großartig wenn Ihr 'cv :: Mat' ist ein Kanal und Sie müssen eine ganze Zahl speichern. ** Allerdings **, wenn Sie 'cv :: Vec3b' (ein Pixel) oder andere komplexe Datentypen speichern müssen, ist' std :: vector' möglicherweise besser für den Job geeignet. 'std :: set' speichert Werte in einer bestimmten Reihenfolge, und man möchte diese Werte auf eine andere Weise reorganisieren, also' std :: vector' in der Antwort. – karlphillip