Initialisiere eine OpenCV-Matte mit einem 2D-Array
In meiner Anwendung, ich möchte erstellen Sie eine OpenCV Mat A (2-Dimensionen) mit einigen Werten und dann übergeben es an eine weitere OpenCV-Funktion mit A als Eingabe.
Derzeit bin ich versucht:
//float data[2][5] = {{1,2,3,4,5},{7,8,9,10,11}};
//OR
float data[10] = {1,2,3,4,5,7,8,9,10,11};
//and then
// A = Mat(1, 5, CV_32FC1, &data, 2); //init from float 1D - array
//OR
A = Mat(2, 5, CV_32FC1, &data, 2);
im Falle von 1D-array, die den Wert überschreiten ist OK. Aber das funktioniert nicht für 2D-array, das ist auch mehr ein allgemeiner Fall. Wie kann ich dies lösen, in OpenCV??
InformationsquelleAutor der Frage Shawn Le | 2012-08-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Orginal, früher habe ich den Merksatz von OpenCV online-guides:
Aber ich Verstand nicht, was das Dokument bedeutet, durch "size_t Schritt=AUTO_STEP". Und das bedeutet, dass ich ommit 'Schritt' - argument, mit dem OpenCV automatisch wählt AUTO_STEP
Habe ich versucht, und das funktioniert:
für die 2D-Mat initialisiert array
InformationsquelleAutor der Antwort Shawn Le
Während Ihre Antwort ist die richtige für Ihre situation, es ist gut zu wissen, was
step
undAUTO_STEP
bedeutenNormalerweise werden Bilder gespeichert werden kontinuierliche Blöcke von Speicher. Jede Zeile folgt nach dem vorhergehenden, so daß der Zugriff auf Daten durch pointer mit einem einfachen
Wo die Breite der Zeile, Breite in bytes (nicht in Pixel!)
Aber dies ist nicht immer der Fall - manchmal hat man Zugriff auf eine submatrix, und die Daten kontinuierlich in jeder Zeile, sondern in der nächsten Zeile müssen Sie springen eine Folge von bytes.
Dies ist, wo der Schritt (auch bekannt als der Schrittlänge"). Es stellt den Abstand in bytes zwischen zwei aufeinanderfolgenden Zeilen. Im kontinuierlichen Matrizen, deren Wert ist
sizeof(pixel)*rowWidth
aber es können benutzerdefinierte Werte, die in besonderen Situationen. Wenn Sie pass AUTO_STEP auf die Matte Konstruktor ist, weiß es, dass die Daten kontinuierlich und berechnet den Schritt mit der obigen Formel. So, jetzt, die mehr der richtige Ansatz zu Lesen, die pixel-Werte istDas sich für alle Arten von Bildern.
Last, but not least, vergessen Sie nicht, dass Schritt wird gemessen in bytesnicht Pixel. Also, wenn Sie einen 3-Kanal uchar RGB-Bild, Schritt
3*number of pixels
und wenn Sie eine 3-Kanal-int Bild,step = 3(channels)*(4=sizeof(int))*(number rows)
InformationsquelleAutor der Antwort Sam
Zusätzlich zu den oben genannten Antworten, es ist eine weitere option.
Für eine kleinere Daten, würde ich Folgendes bevorzugen:
Können Sie leicht das gewünschte Ergebnis zu erhalten, ohne die Notwendigkeit zu definieren, wird eine zusätzliche variable 'Daten'.
InformationsquelleAutor der Antwort Ruchir
Seit
data
ist 2D-array - alledata
&data
*data
data[0]
&data[0]
und&data[0][0]
Punkt-zu-Basis-array. Jede der obigen Darstellung gewählt werden konnte, um richtig zu konstruieren, dasMat
im OrtX
imRuhe haben, da die Daten angenommen von OpenCV als
void*
- und Datenzugriff von OpenCV ist wie in Linie. Ich bevorzuge die gleiche syntax für die Konstruktion Matte von single-oder multi-dimensionale arrays.Zurück, um den Abfrage - Hinweis, dass Ihre Konstruktion von
Mat
sogar von 1D-array ist falsch. Der step-parameter ist wie schon erwähnt 2. Es ist einfach passiert, zu arbeiten, da OpenCV überschreibt der step-parameter zur Verfügung gestellt, wenn die Anzahl der Zeilen ist 1. Für höher-dimensionale arrays, OpenCV wirft debug Behauptung für falsche Schritt parameter, die Sie bekam.InformationsquelleAutor der Antwort Kiran