2016-05-05 12 views
4

Ich weiß, dass opencv in Mat-Objekten als ein großes Array darstellt. Also, wenn ich 3 Kanäle Matte der Dimension 200x200 habe, dann im Speicher wird es diese Matte in einem Array der Größe 3x200x200 speichern. Oder allgemeiner: Jede Matte im Speicher wird als channels*rows*cols gespeichert. Wir können solche Anordnung erhalten, wieOpencv im Speicher Mat-Darstellung

double *array = (double)mat.data; 

unter der Annahme, dass Matrix vom Typ Doppel

Nun meine Frage ist, was die Art und Weise zu indizieren ist dieses Array zum Beispiel, wenn ich Element auf Kanal ch zugreifen möchten, Zeile r und Spalte c wird folgende gilt Indexierungs

array[ch*rows*cols + c * rows + r] 

oder

array[ch*rows*cols + r * cols + c] 

Grüße Ahsan

+0

so Ich nehme an mit (chcols) du meinst ch multipliziert mit cols, aber es verwendet niemals den Zeilen- und Spaltenindex, der r und c –

+0

at() Funktion sollte bevorzugt werden, anstatt tief zu tauchen. –

Antwort

2

Wie Sie im Datenlayout auf dem documentation berichtet sehen können, können Sie die Werte wie Zugang:

for(int r=0; r<rows; ++r){ 
    for(int c=0; c<cols; ++c){ 
     for(int ch=0; ch<nchannels; ++ch){ 
      double val = array[(nchannels*cols*r) + (nchannels*c) + ch]; 
     } 
    } 
} 
0

Sie können wie folgt in Array erhalten Werte:

double val = array+ (r*mat.step)+c*mat.channels()+ch;