2014-07-12 6 views

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 
+0

Super, danke! – eagle34

+1

warum benutzt du nicht 'std :: set'? – Shai

+2

@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

2

Sie könnten versuchen, ein Histogramm mit einer Anzahl von Bins zu erstellen, die der Anzahl der möglichen Pixelwerte entspricht.