boost library matrix
-
hi ich wollte pixel grauwerte eines Bildes(OpenCV format) in ein Boostarray laden(Bild 640*480)
einfach mit zwei forschleifenboost::numeric::ublas::matrix<unsigned int> grauwert(height,width); for(int r=0;r<height;r++) { for(int c=0;c<width;c++) { grauwert(r,c)=int(data->r*step+c) } }
das problem ist das nur der vorgang die werte in die matrix zu laden um die 120 ms dauert. und ich gerne minimal 20 bilder pro sekunde hätte. kann mir jemand veraten warum das so lange dauert? was ich besser machen kann? Nach möglichkeit mit kurzem codebeispiel wenns komplizierter wird da ich nur ein hobbyprogrammierer bin.
vielen dank
-
IIRC kannst du bei uBLAS doch das Storage-Konzept der Klassen (Matrizen, Vektoren) ändern. Warum definierst du nicht einfach ein Storage-Konzept auf Basis des OpenCV-Formats, anstelle zu kopieren?
-
Für solche Späße ist eigentlich Boost.GIL da.
Abgesehen davon solltest du vermutlich besser den Speicher der Matrix direkt mit den Daten initialisieren, gegebenenfalls per Templateargument column- oder row-major (also die Art der Speicherung des zweidimensionalen Dings im linearen Speicher) aussuchen. Und die "data->r * step + c" kann so glaub ich nicht stimmen.
/edit: rüdigers Version ist natürlich noch besser.
-
Ups sry es muss natürlich heißen:
uchar *data = (uchar *)img->imageData;
und dann in der schleife data[r*step+c]
so aber zu euren antworten ich habe kaum was davon verstanden.IIRC kannst du bei uBLAS doch das Storage-Konzept der Klassen (Matrizen, Vektoren) ändern.
was ist damit gemeint ich habe keine ahnung was IIRC bedeuten soll und was du mit Storage konzept meinst ist mir auch noch nicht so ganz klar.
Und dann die dritte frage dazu wie realisiere ich es?
Abgesehen davon solltest du vermutlich besser den Speicher der Matrix direkt mit den Daten initialisieren, gegebenenfalls per Templateargument column- oder row-major (also die Art der Speicherung des zweidimensionalen Dings im linearen Speicher)
Wie mache ich das?
vielen dank für eure hilfe
-
Ein bisschen mehr Einsatz bitte
http://de.wikipedia.org/wiki/IIRC
http://www.boost.org/doc/libs/1_35_0/libs/numeric/ublas/doc/matrix.htm
http://www.boost.org/doc/libs/1_35_0/libs/numeric/ublas/doc/storage_concept.htm
-
Ich habe den fehler gefunden die Boost matrix hat beim debug modus gigantische debug infos im release modus kostet es so gut wie garkeine zeit.
-
Das ist jetzt aber nicht dein ernst, oder? Du machst hier einen Thread auf und alles bevor du einmal auf die Idee kommst mal im Release-Build die Zeit zu messen?
Hat dir noch nie jemand gesagt, dass man Performance ausschließlich in Release-Builds misst, da sie sonst absolut keine Aussagekraft hat?
-
Nein das war mein erster release build^^ das es 150ms dauert die Debug infos rauszuhauen hätte ich aber nicht gedacht.
-
Wenn ich mich recht erinnere benutzt uBLAS nur im Releasemodus Expression Templates. Die machen wohl das meiste aus.