Buffer für Bilder (c++)

OP #3229236
Lesenswert?
• ▲
▼
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 ...
Gast #3229238
Lesenswert?
• ▲
▼
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.
#3229263
Lesenswert?
• ▲
▼
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
OP #3229267
Lesenswert?
• ▲
▼
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...
OP #3229279
Lesenswert?
• ▲
▼
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
Gast #3229281
Lesenswert?
• ▲
▼
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?
Gast #3229330
Lesenswert?
• ▲
▼
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?
Gast #3229355
Lesenswert?
• ▲
▼
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.
Gast #3229640
Lesenswert?
• ▲
▼
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.
Gast #3229992
Lesenswert?
• ▲
▼
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...
Gast #3229994
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren