Flackern in der WM_Paint
-
Hallo,
hier ein Ausschnitt meines Codes:
COLORREF cr; for (pixel_erkennung_y=irand; pixel_erkennung_y <120+irand; pixel_erkennung_y++) { for (pixel_erkennung_x=irand; pixel_erkennung_x <160+irand; pixel_erkennung_x++) { cr = GetPixel(hdc, pixel_erkennung_x, pixel_erkennung_y); double red=GetRValue(cr); double green=GetGValue(cr); double blue=GetBValue(cr); if(red>r_ref-((r_ref/100)*18) && green<g_ref+((g_ref/100)*18) && blue<b_ref+((b_ref/100)*18)){ SetPixel(hdc, pixel_erkennung_x, pixel_erkennung_y, RGB(0,255,255) );} } } }Das gesamte Projekt sieht so aus, dass ich über VFW nen WebCam-Stream in ne Win32 Anwendung eingebunden habe und nun einen Farbwertbereich aus dem Bild erkennen und makieren lasse.
Das Problem besteht darin, dass der Rechner permanent 19.200 Pixel (160*120) überprüft und diese gegebenenfalls ja auch noch farbig Übermalt (wenn sie im Toleranzbereich sind)
Das Resultat ist,dass die Erkennung zwar wunderbar funktioniert, das Bild aber flackert.
- Aus meine Java Zeit hatte ich an Doppelpufferung gedacht allerdings noch nichts passendes für c++ gefunden.
- Außerdem kam mir die Idee Multithreading zu benutzen und dann 160 Threads jeweils eine Spalte überprüfen zu lassen, wobei ich dieses allerdings noch nicht realisieren konnte.
Könnte ich mein Problem mit einem dieser Wege lösen bzw. habt ihr andere Ansätze für mich ???
Sollte einer der Wege gehen dann beschreibt mir doch bitte etwas wie ich genauer vorgehen muss.
Danke
Michael
-
Double-/Backbuffering verhindert schon das Flackern, aber dass bei deine Vorgehensweise die Geschwindigkeit ausreicht um Bereiche in Echtzeit zu maskieren bezweifle ich doch sehr stark

-
Könntest du vielleicht noch 2 - 3 Takte dazu sagen.
Weshalb bzw. was würdest du anders machen?Hast du nen TUT zum Backbuffering ???
Danke
Michael
-
Ich würde denken, dass es (falls das bzgl. des wohl verwendeten Overlay-Modus überhaupt geht) mit GetDIBits schneller geht - aber sicher bin ich mir da auch nicht

Zu Back-/Double-Buffering:
- http://www.c-plusplus.net/forum/viewtopic.php?t=14713
- http://www.klangwerker.de/php/show.php?path=developer/german&doc=g_double_buf1&update=1
-
flenders schrieb:
Zu Back-/Double-Buffering:
- http://www.c-plusplus.net/forum/viewtopic.php?t=14713
- http://www.klangwerker.de/php/show.php?path=developer/german&doc=g_double_buf1&update=1Zum Beispiel von Klangwerker mal eine dumme Frage: Wie muss ich denn den Konstruktor und CopyBufferToDisplay im WM_PAINT aufrufen? Übergebe ich da ein Bitmap oder das Objekt (z.B. ein Rechteck) and die Prozedur? Hätte da jemand einen kleinen Code-Schnipsel?
-
Du scheinst dich offenbar mit der WinAPI bisher noch gar nicht auszukennen - evtl. solltest du dir erst mal ein wenig die Grundlagen aneignen

KGrafixBuffer(HINSTANCE hInstance, HWND hwnd);Da steht doch eigentlich drin, was du übergeben sollst - wobei ich das mit hInstance nicht verstehe, da es nachher gar nicht verwendet wird

Ein Objekt dieser Klasse erzeugst du entweder in WM_CREATE oder global, allerdings musst du auch Größenänderungen entsprechend abfangen (neu erzeugen), damit Buffer auch in der Größe der neuen Fenstergröße angepasst wird.Und CopyBufferToDisplay übergibst du dann einfach dein Fenster-Handle. Wobei ich den ganzen Klassenaufbau nicht so ideal finde - aber zumindest die zu verwendenden Funktionen und die Reihenfolge, in der du diese Aufrufen musst siehst du dort ganz gut

-
flenders schrieb:
Du scheinst dich offenbar mit der WinAPI bisher noch gar nicht auszukennen - evtl. solltest du dir erst mal ein wenig die Grundlagen aneignen

Jupp, du bringst es auf den Punkt. Bin Umsteiger und habe deshalb noch so meine Probleme mit C++.
-