Forum: PC-Programmierung Buffer für Bilder (c++)


von Jan L. (jan_l)


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 ...

von Peter II (Gast)


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.

von Arc N. (arc)


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

von Jan L. (jan_l)


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...

von Peter II (Gast)


Lesenswert?

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.

von Jan L. (jan_l)


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

von Peter II (Gast)


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?

von Jan L. (jan_l)


Lesenswert?

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.

von Peter II (Gast)


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?

von Jan L. (jan_l)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Jan L. (jan_l)


Lesenswert?

beides vom gleichen Typ "Image" aller dings bin ich mir nicht sicher ob 
man mit dem Format was anfangen kann...

von ZeroCool (Gast)


Lesenswert?

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ß

von Peter II (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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...

von Peter II (Gast)


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.

von ZeroCool (Gast)


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...

von ZeroCool (Gast)


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.

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
Noch kein Account? Hier anmelden.