Autor Beitrag
shainsen
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 19.02.09 17:14 
Für ein Schulprojekt möchten wir ein Programm schreiben, dass zwei Punkte via Webcam erkennt und zwischen den beiden den Abstand misst. Da das Programm realtime laufen und ziemlich schnell reagieren soll, gibt es ein Problem. Die CPU macht nach ca. 5 Sekunden nicht mehr mit (Auslastung 100% und das Programm friert ein).

Die Verbindung zur Webcam funktioniert ohne Probleme und ein Bitmap kann ausgelesen werden. Nun soll das Bitmap 20x pro Sekunde geprüft werden, jeweils jeder 5. Pixel in der Horizontalen und in der Vertikalen. Bei unserem Bild von 320x240 Pixel macht das ca 3100 Berechnungen, was doch nicht alzu viel sein sollte. Dies wird aber noch 20x multipliziert, da wir ja 20 Bilder/sec wollen.

Jeder Pixel wird durch eine Klasse gejagt, die viel schneller als die normalen getPixel/setPixel sein soll. Einziges Problem bei dieser Klasse: Jedes Mal muss ein neues Objekt erstellt werden mit dem Bild der Webcam. Ich weiss nicht, ob dies auf die Dauer CPU-Auslastung kostet oder ob die alten Objekte überschrieben/gelöscht werden. Auf jeden Fall ist nach 5 Sekunden Schluss, da die CPU-Auslastung von anfänglich 50% auf 100% steigt und das Programm einfriert.

Woran könnte dies liegen?

Danke und Gruss
shainsen
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 19.02.09 20:39 
:welcome:
user profile iconshainsen hat folgendes geschrieben Zum zitierten Posting springen:
Die CPU macht nach ca. 5 Sekunden nicht mehr mit (Auslastung 100% und das Programm friert ein).
Eine CPU macht normalerweise nicht einfach schlapp, und wenn dann eher mit einem Bluescreen. Wenn das Programm einfriert, muss ein Bug drin sein.
Wird die ganze Zeit im GUI-Thread gearbeitet, Timer oder Schleife? Wenn du nach diesen 5 Sekunden einfach mal im Debugger das Programm unterbrichst, wo landest du/geht es dort weiter?

_________________
>λ=
mr tobo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Fr 20.02.09 00:08 
ich vermute mal, dass du deine befehle einfach in eine while(true) schleife oder etwas ähnliches gesetzt hast?
dann solltest du irgendwo noch ein schlichtes:
ausblenden C#-Quelltext
1:
application.DoEvents()					

einfügen, allerdings kommst du so vllt nicht ganz auf die gewünschten 60kHz je nachdem halt, was sonst noch für Prozesse laufen...
shainsen Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 06.03.09 22:54 
Hallo! Danke für die Tipps, war doch irgendwo eine verhockte While-Schleife :-) Nun habe ich aber ein anderes Problem: Ich erhalte zwischen 8 und 11 Bildern, möchte jedoch 20. Ich weiss nicht an was das liegt, aber an der CPU kanns nicht sein, habe die Auslastung auf ca. 25% drücken können! Den Timer des Captures habe ich auf 50ms gestellt und die Frames des Captures auf 20! Also sollte der mir doch theoretisch 20 Bilder liefern? Die Webcam sollte bis zu 50 FPS vertragen! Habt ihr eine Idee, an was das liegen könnte?

Wäre es sinnvoll, die Anwendung irgendwie in 2 Threads zu unterteilen damit dann jedes 2. Bild von einem Thread bearbeitet wird?

Gruss shainsen
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 06.03.09 23:06 
Zu den 50 Millisekunden kommt aber noch die Verarbeitungszeit und die Ungenauigkeit von Timern hinzu. Windows ist kein Echtzeitbetriebssystem, die 50 Millisekunden sind also ein ungenauer Wert.
shainsen Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 06.03.09 23:11 
Jop da hast du natürlich recht! Was ich aber nicht verstehe ist, dass ich mit 25% CPU-Auslastung gerade mal auf sowenig Bilder komme. Angenommen ich stelle alles ein wenig höher (Timer 10ms, 50 FPS), dann erhalte ich genau gleich viele Bilder. Entweder dauert irgendwas ewig lange, dass es nicht mehr Bilder bringt oder irgendwo gibts noch nen Timer, der das ganze verlangsamt. Kanns sein, dass das Programm von Windows weniger CPU-Zeit erhält oder dass die CPU diese Berechnungen nur in einem gewissen Tempo ausführen kann? Oder steigt bei mehr Berechnungen einfach die Auslastung (was ich annehme)?

Gruss shainsen
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 06.03.09 23:14 
Das könnte auch am Auslesen des Bildes liegen, ich weiß ja nicht wie du das jetzt machst.

Aber weniger als 50 Millisekunden geht mit einem Timer ohnehin nicht so gut, auch wenn es mit 10 eigentlich auch noch klappen sollte.
shainsen Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 06.03.09 23:20 
Danke für den Tipp! Ich habe nun einmal ein Projekt erstellt, dass nur die Bilder ausliest und siehe da: Es liefert ebenfalls nicht mehr Bilder. Nun kanns einerseits doch an diesem Timer liegen, oder an was anderem innerhalb der Webcam_Capture Klasse. Ich muss mir das mal genauer ansehen.

Danke für die Tipps

Gruss shainsen


Edit: Da mein momentanes Webcam Capture extrem langsam ist, bin ich auf der Suche nach einem neuen! Kennt ihr ein gutes, welches schnell ist und aus dem ich ein Image oder besser Bitmap auslesen kann?
Bin dankbar für alle Tipps!