vector-problem
-
HALL0.
ich habe folgende 2 codeschnipsel, wobei der erste teil a.) funktioniert, der zweite teil b.) macht nicht das, was er soll. und zwar geht es darum, dass in pbImgData jeweils immer ein bild meiner kamera gespeichert wird. dieses lege ich dann in dem vector RECORD ab, damit das nächste bild gelesen werden kann. am ende sollen dann alle bilder aus RECORD in BMP-files gespeichert werden. das problem ist aber nun, dass die bilder nur ordentlich in dem BMP-files angezeigt werden, wenn ich direkt nachdem ich ein bild in RECORD ablege, dieses auch auslese (fall a.). wenn ich erst alle bilder ablege und anschliessen auslese (fall b.), dann werden alle bilder wie das zuerst aufgezeichnete bild aussehen. woran kann das liegen?
DANKE!
STICK.hier der code:
struct RGB24Pixel //hier die struktur, um ein pixel zu speichern { BYTE b; BYTE g; BYTE r; }; struct DATA //diese pixel sollen dann hier gespeichert werden { RGB24Pixel *BILD; }; int main () { DATA pbImgData; vector <DATA> RECORD; //und dieser vector speichert alle meine bilder ... //a.) NUM=0; while (!(kbhit())) { ... pbImgData.BILD = (RGB24Pixel*) pActiveBuf->getPtr(); //hier bekomme ich meine pixelwerte RECORD.push_back(pbImgData); //und lege sie dann im vector RECORD ab /* NUM++; } for (NUM=0;NUM<(int)RECORD.size();NUM++) { //*/ // jetzt lese ich diesen bild sofort aus BMP Image; Image.SetSize(DIM[1],DIM[0]); n=0; m=DIM[0]-1; for (i=0;i<786432;i++) { BILD[m][n].itsRED = Image(n,m)->Red = (int)RECORD[NUM].BILD[i].r; BILD[m][n].itsGREEN = Image(n,m)->Green = (int)RECORD[NUM].BILD[i].g; BILD[m][n].itsBLUE = Image(n,m)->Blue = (int)RECORD[NUM].BILD[i].b; n++; if (n==DIM[1]) { n=0; m--; } if (m==-1) break; } Image.WriteToFile("BILD.bmp"); filename.str(""); filename.clear(); NUM++; } //b.) NUM=0; while (!(kbhit())) { ... pbImgData.BILD = (RGB24Pixel*) pActiveBuf->getPtr(); RECORD.push_back(pbImgData); NUM++; } // wenn ich die bilder erst am ende auslese, klappts leider nicht for (NUM=0;NUM<(int)RECORD.size();NUM++) { BMP Image; Image.SetSize(DIM[1],DIM[0]); n=0; m=DIM[0]-1; for (i=0;i<786432;i++) { BILD[m][n].itsRED = Image(n,m)->Red = (int)RECORD[NUM].BILD[i].r; BILD[m][n].itsGREEN = Image(n,m)->Green = (int)RECORD[NUM].BILD[i].g; BILD[m][n].itsBLUE = Image(n,m)->Blue = (int)RECORD[NUM].BILD[i].b; n++; if (n==DIM[1]) { n=0; m--; } if (m==-1) break; } Image.WriteToFile("BILD.bmp"); filename.str(""); filename.clear(); }
-
Du befüllst deine Bilddaten per
pbImgData.BILD = (RGB24Pixel*) pActiveBuf->getPtr();und das dürfte das Problem sein. Offenbar verwendet dein Bildgeber nur einen Speicherbereich, um die aktuellen Bilder abzulegen und gibt immer die selbe Adresse mit getPtr() zurück - also zeigen alle deine Vector-Elemente auf das selbe Bild. Zur Lösung müsstest du jeweils einen neuen Speicherbereich par new anlegen und über memcpy() mit den aktuellen Bilddaten füllen.
(aber das könnte möglicherweise an die Kapazitätsgrenze deines Rechners geraten, wenn du längere Sequenzen aufzeichnen willst)
-
heisst das, dass ich nicht die bilddaten in RECORD ablege, sondern nur eine adresse?
wenn ich dann demzufolge die bilder jedes mal in BILD ablegen muss, bevor ein neues bild aufgezeichnet werden kann, macht das die aufnahme ja ziemlich langsam.STICK.
-
stick_thai schrieb:
heisst das, dass ich nicht die bilddaten in RECORD ablege, sondern nur eine adresse?
Im Moment ja (schließlich besteht deine Struktur nur aus einem Pointer auf die Bilddaten).
wenn ich dann demzufolge die bilder jedes mal in BILD ablegen muss, bevor ein neues bild aufgezeichnet werden kann, macht das die aufnahme ja ziemlich langsam.
Ja, das mußt du aber sowieso, wenn du die Bilddaten weiterverarbeiten willst. (btw, woher stammt eigentlich das globale BILD?)
Du könntest ja auch Variante (a) verwenden, die offenbar funktioniert und (wenn dir die Dateiverarbeitung zu langsam ist) die ausgelesenen BMP's in einem vector zwischenlagern.
-
stick_thai schrieb:
wenn ich dann demzufolge die bilder jedes mal in BILD ablegen muss, bevor ein neues bild aufgezeichnet werden kann, macht das die aufnahme ja ziemlich langsam.
Ja stimmt.
Es gibt eine C variante, welche es schneller macht.Pseudocode:
Bin datei anlegen und oeffnen.
Einen Buffer erstellen.
Bild in Buffer und Buffer in bin datei (mit write).Zum auslesen musst du nur wieder den Buffer oeffnen
und mit read auslesen.Am besten machst du dir einen Hader am anfang.
somit du weisst wieviele bilder du darin hast, ect...Gg
-
HALL0.
ich habe gerade zum problem der langsamen bildaufnahme eine schnellere lösung gefunden. und zwar nutze ich
saveToFileBMP (*pActiveBuf,filename.str().c_str());um die bilder als BMP abzulegen, für die weiterverarbeitung öffne ich dann später die einzelnen bilder.
CStoll schrieb:
woher stammt eigentlich das globale BILD?)
du meinst sicher, welche kamera ich benutze? die ist von THE IMAGING SOURCE (http://www.theimagingsource.com/de/welcome/) und kann nur wärmstens empfohlen werden.
STICK.