2017-05-01 5 views
0

Gibt es irgendeine Funktion in C++ oder opencv, die die gleiche Operation wie numpy flatten() Funktion tun kann ??Funktion in C++ ähnlich wie numpy flatten

Ich denke meine Frage war vage. Ich versuche zu verwenden K-Means-Segmentierung in C++ opencv Umgebung gibt es ein Beispiel in Python hier gegebenen http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_ml/py_kmeans/py_kmeans_opencv/py_kmeans_opencv.html

center = np.uint8(center) res = center[label.flatten()]

ich in der Lage gewesen, den größten Teil der Operation, bis diese abzuflachen, was in C++ Das zu tun Dimension des Labels ist 921600 X 1, die ich auch in C++ bekomme. Die mittlere Dimension ist 4X3-Matrix. Ich denke, der Trick besteht darin, den gesamten Label-Wert für den Center-Wert zu erhalten. Also wird "res" am Ende 921600 X 3.

Also meine Frage ist Wie mache ich das in C++ mit opencv?

Dank

+3

Ist 921600 X 1 Matrix nicht bereits eine flache Anordnung? – VTT

+0

'np.flatten' gibt nur ein neues Array mit demselben Datenpuffer zurück, aber eine neue 1d Form. Nun, technisch, 'ravel()' gibt eine 'view' zurück,' flatter' eine Kopie. Die Einzelheiten, wie es funktioniert, hängen von der Struktur der numpigen Arrays und ihrer Form ab. Ohne mehr über die 'C++' Matrix/Array-Struktur zu wissen, können wir keine ähnliche Antwort geben. – hpaulj

+0

@hpaulj Ich denke, meine Frage war sehr vage, ich habe meine Frage jetzt aktualisiert –

Antwort

0

So habe ich das herausgefunden, gibt es keine geraden oder 1 Zeile Lösung dieser (wenn es lassen Sie mich ist weiß, haha)

res = center[label.flatten()] 

kann mit folgenden in C durchgeführt werden ++ opencv

for(int i = 0; i<labels.rows ; i++) 
{ 
    if(labels.at<int>(i) == 0) { 
    res.push_back(centers.row(0)); 
    } else if(labels.at<int>(i) == 1) { 
     res.push_back(centers.row(1)); 
    } else if(labels.at<int>(i) == 2) { 
     res.push_back(centers.row(2)); 
    } else{ 
     res.push_back(centers.row(3)); 
    } 
} 

Vielen Dank.