Hallo, Versuch ich mal mein Problem zu erklären. Ich habe eine Kamera via USB 3.0 an meinen Computer angeschlossen und will jetzt einzelne Frames speichern. An sich funktioniert das auch wenn ich einen Frame aus dem Kamerabuffer hole, den dann Speicher und das halt wieder hole. Das ist mir jetzt aber zu langsam, also dachte ich mir ich mach mir einfach ein Array in das ich die Frames erst mal lege und dann wenn ich fertig aufgezeichnet sollen die Bilder aus dem Array gespeichert werden. das darf dann auch so lange dauern wie mein Computer lustig ist. So Problem ist jetzt das nach 10 Bildern Schluss ist... Ich vermute mal das dann irgendwas voll ist? Ich bin leider überfragt was ich noch machen könnte bzw was ich anders machen könnte das es auch so funktioniert wie ich es momentan habe. ps.: ein Frame hat ca 1,2mb das wären bei 50Hz 60mb die Sekunde. Mein Ziel wäre es erst mal 10 Sekunden aufnehmen zu können und die Bilder im nachhinein Zu speichern... 600MB sind ne menge Holz deshalb bezweifel ich irgendwie das dass in ein Array passt ...
Jan L. schrieb: > So Problem ist jetzt das nach 10 Bildern Schluss ist... warum, fehlermeldung? Was passiert dann? > 600MB sind ne menge Holz deshalb bezweifel > ich irgendwie das dass in ein Array passt ... 600MB sind nichts, wann man will kann man auch 2TB in ein array legen.
Peter II schrieb: > Jan L. schrieb: >> So Problem ist jetzt das nach 10 Bildern Schluss ist... > > warum, fehlermeldung? Was passiert dann? > >> 600MB sind ne menge Holz deshalb bezweifel >> ich irgendwie das dass in ein Array passt ... > 600MB sind nichts, wann man will kann man auch 2TB in ein array legen. Es kann durchaus sein, dass bei allem was mitgeladen, vorher alloziert etc. wurde, zwar noch genügend Speicher vorhanden wäre, aber nicht mehr am Stück. Die Frage hier ist: Wie wird der Speicher angefordert, C++Runtime (je nach Compiler auch HeapAlloc), HeapAlloc, VirtualAlloc
ich kann es leider nicht so genau sagen was da für ein Fehler kommt. Falls der interne Buffer der kamera nicht erreichbar sein sollte habe ich eine Grenze von 5 sekunden eingebaut. danach wird die meldung ausgegeben, dass der Buffer nicht erreichbar ist. und genau das Tritt nach 10 Frames ein. wo da allerdings der zusammenhang besteht ist mir momentan noch schleierhaft...
Jan L. schrieb: > ich kann es leider nicht so genau sagen was da für ein Fehler kommt. dann wird dir hier auch niemand helfen können.
ich habs ja versucht zu erklären. das Problem ist es wird weder eine exception geworfen noch sonst was... Ich habe die if die mir eigendlich den Timeout abfängt jetzt mal raus genommen und dann kommen nach den 10 ersten Frames genau alle 5 Sekunden ein neuer Frame. Wenn ich meinen Timeout auf zb 6 Sekunden stell kommen alle 6 ein neuer Frame
Jan L. schrieb: > ich habs ja versucht zu erklären. das Problem ist es wird weder eine > exception geworfen noch sonst was... dann versteht es aber keiner. Dann zeige uns wenigsten denn quellcode. > Ich habe die if die mir eigendlich den Timeout abfängt jetzt mal raus > genommen und dann kommen nach den 10 ersten Frames genau alle 5 Sekunden > ein neuer Frame. glaubst du wir haben eine Ahnung welche auswirkung ein IF irgendwo in einen unbekannten code hat?
ich dachte kurz ich hätte das Problem gelöst. Zumindest hab ichs jetzt so das auch mal eine Exception geworfen wird. Nach genau 1449 Frames (ca. 1,6 Gb) bekomm ich eine "std::bad_alloc at memory location 0x0018..." Exception.
Jan L. schrieb: > Nach genau 1449 Frames (ca. 1,6 Gb) bekomm ich eine "std::bad_alloc at > memory location 0x0018..." Exception. bei einem 32bit programm kann durchaus bei 1,6Gb schluss ein. gibst du denn den Speicher auch wieder frei? Wie ist das array aufgebaut? Werden die bilder ständig umkopiert?
zum speicher freigeben kommts noch nicht, da eigentlich erst 3000 Frames (was 1 minute entsprechen sollte) gespeichert werden sollten. das array wird so gefüllt:
1 | frame[imageCnt] = convertedImage |
Jan L. schrieb: > frame[imageCnt] = convertedImage was ist convertedImage für ein Datentype? Was ist frame für ein Datentype. Im schlimmstenfall werden hier ständig viel zu viele Daten umkopiert.
beides vom gleichen Typ "Image" aller dings bin ich mir nicht sicher ob man mit dem Format was anfangen kann...
Was für eine Kamera hast du im Einsatz und welche API benutzt du um die Bilder aus dem Buffer abzufragen? Es wäre auch interessant, deine Akquirierungsschleife oder - prozedur zu sehen. Gruß
Jan L. schrieb: > beides vom gleichen Typ "Image" aller dings bin ich mir nicht sicher ob > man mit dem Format was anfangen kann... das hilft nicht weiter. Image ist kein Datentype von C++. Wenn du also noch hilfe erwartest, dann stell uns den quellcode zur verfügung sonst wird das nichst.
Im übrigen könnte es hier vorteilhaft sein ein std::vector zu nehmen anstelle eines arrays, und auch Debugausgaben sollen schon so manchem geholfen haben...
Läubi .. schrieb: > Im übrigen könnte es hier vorteilhaft sein ein std::vector zu nehmen > anstelle eines arrays, und auch Debugausgaben sollen schon so manchem > geholfen haben... bei vector dürften noch mehr Probleme auftreten. Wenn er in dem Vektor selber Image direkt ohne Pointer ablegt, wird bei jeder Vergrößerung vom Vektor alles Images neu Kopiert. std::list oder std::deque sollte hier besser geeignet sein, dann so wie es klingt braucht ein keine direkten zugriff auf ein Images. Er will es wieder der reihe nach verarbeiten.
Peter II schrieb: > Läubi .. schrieb: >> Im übrigen könnte es hier vorteilhaft sein ein std::vector zu nehmen >> anstelle eines arrays, und auch Debugausgaben sollen schon so manchem >> geholfen haben... > > bei vector dürften noch mehr Probleme auftreten. Wenn er in dem Vektor > selber Image direkt ohne Pointer ablegt, wird bei jeder Vergrößerung vom > Vektor alles Images neu Kopiert. > > std::list oder std::deque sollte hier besser geeignet sein, dann so wie > es klingt braucht ein keine direkten zugriff auf ein Images. Er will es > wieder der reihe nach verarbeiten. Es kommt denk ich immer drauf an, wie man die gespeicherten Bilder später nutzen will. Ich kann mir, wie Peter II schon geschrieben hat, gut vorstellen, dass zur Verwaltung der Bilder eine unsortierte Liste die bessere Wahl (weil einfach übersichtlich) ist. Aber nach der Beschreibung oben würde ich ein Speicherproblem innerhalb des Programmes vorerst ausschliessen. Je nach Framegrabber/Kamera, welche er benutzt, kann es sein, dass bei jedem Bild, das akquiriert wird, ein Speicherplatz auf der Kamera belegt wird. Meistens ist einfach der interne Speicher bei solchen Kameras auf maximal 10 begrenzt, sodass entweder dieser Speicher erhöht werden muss oder der Fragesteller mal per API nach dem Bilderabruf diesen Speicherplatz auch wieder per 4711.unlock() oder so (genauer Befehl kenn ich natürlich nicht) wieder freigeben muss. Das ist natürlich auch nur ein Schuss ins Blaue, da ich die genaue Anwendung und die benutzte Hard/Software nicht kenne und der Fragesteller anscheinend keinerlei Interesse mehr an der Lösung oder sie schon gefunden hat. Dabei bin ich mir sicher, das wir ihm helfen könnten...
ZeroCool schrieb: > Meistens ist einfach > der interne Speicher bei solchen Kameras auf maximal 10 begrenzt, sodass > entweder dieser Speicher erhöht werden muss oder der Fragesteller mal > per API nach dem Bilderabruf diesen Speicherplatz auch wieder per > 4711.unlock() oder so (genauer Befehl kenn ich natürlich nicht) wieder > freigeben muss. Je nach benutzter Hard/Software bekommt man da auch keine präzise Fehlermeldung, sondern es kann auch zum anscheinend grundlosen Abstürzen des Programmes kommen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.