# Bildunterschiede erkennen



## meilon (1. April 2005)

Hi,

   Ich bin gerade dabei, für meine Webcam ein Programm zu schreiben, welches auf bewegungen reagiert.

 Bild bekomm ich rein in das Programm. Auch eine ehere unzuverlässige Übereinstimmungsprüfung habe ich auch schon gebacken bekommen.

   Aber jetzt möchte ich, dass mein Programm erkennt, ob eine Bildänderung stattgefunden hat, und zwar zuverlässig!

 Ich arbeite z.zt. mit 2 Bitmap Dateien, wo ich im Prinzip durch acr() der einzelnen Zeichen eine Summe Bilde und diese miteinander Vergleiche. Aber wegen der Farben kann eine übereinstimmung von 1 bis 10000% möglich sein .

 Hat einer eine Idee oder einen Ansatz, wie ich die Bildunterschiede besser erkennen kann und vll. es sogar graphisch darstellen kann (Siehe Anhang: Blau = Ändernderbereich IST, Rot = Ändernderbereich WAR)? Mit Pixelangaben des sich geänderten Pixel etc.?

  mfg


----------



## Shakie (2. April 2005)

Man könnte mittels der API-Funktion "GetPixel" alle Pixel der Reihe nach auslesen und miteinander vergleichen (Also Pixel an Position x/y von Bild1 mit Pixel an Position x/y von Bild2 vergleichen). Dauert bei großen Bildern aber recht lange, die API-Funktion scheint da nicht so wahnsinnig schnell zu sein. Alternativ kann man auch die Point-Methode einer PictureBox verwenden, ist aber noch langsamer...
Möglich wäre auch, dass man nur jeden 2. oder 4. Pixel vergleicht, dann geht das ganze etwas schneller und für Raumüberwachungen dürfte es auch noch ausreichen.


----------



## meilon (2. April 2005)

Danke. Ich nehm die API für alle 2 Pixel. Das wären dann insgesammt 160*120 = 19200 Pixel zu überprüfen. Und da bei einer Raumüberwachung nicht 25 fps überprüft werden müssen, wird das wohl reichen.

Dann werde ich jetzt mal die API Definition raussuchen und rumspielen 

mfg


----------



## meilon (2. April 2005)

Okay, habe jetzt die API besorgt und bekomme auch erfolgreich Werte zurück. Nur das Problem, ich komm mit den Rückgabewerten nicht klar.

Return Values
If the function succeeds, the return value is an RGB value. If the pixel is outside of the current clipping region, the return value is CLR_INVALID.

Hier eine Liste von ein paar Pixeln:
3089964
2694447
2891052
2891825

Kann mir einer sagen, wie ich die Werte zu deuten habe und ich den Unterschied zweier Farben erkennen kann?

mfg


----------



## Shakie (3. April 2005)

Die Werte bestimmten exakt die Farbe eines Pixels, nur dass eben nicht der Rot- Grün- und Blauanteil zurückgegeben wird sondern eine Zahl für alle drei Werte zusammen. Diese Zahl entspricht dem Ergebnis der VB-Funktion RGB. Die RGB-Funktion wandelt drei Zahlen (Rot-, Grün- und Blauanteil einer Farbe) in eine Zahl, welche dann eine Farbe darstellt.
Wenn man Beispielsweise RGB(100,100,100) aufruft, dann erhält man als Ergebnis 6579300.

Zwei Pixel haben also nur dann die gleiche Farbe, wenn die Werte der API-Funktion exakt identisch sind.

Hilft dir das ein bisschen?


----------



## meilon (3. April 2005)

Ja, und wie geht dass andersrum? Will prüfen, ob der Pixel einen unterschied von ca. 10% Farbabweichung hat. Geht das mit den GetPixel Farben oder sollte ich RGB oder HEX oder oder verwenden?

mfg


----------



## Shakie (3. April 2005)

Soweit ich das weiß:
Wenn man eine Farbzahl als Hex-Wert betrachtet, dann stellen die letzten Beiden Ziffern den Blauanteil da, die mittleren beiden den Grünanteil und die linken beiden den Rotanteil.
Beispiel: Die API GetPixel liefert den Wert 11189196, was in Hex AABBCC ist. Somit ist der Blauanteil CC (=204), der Grünanteil BB (=187) und der Rotanteil AA (=170).

FF0000 entspricht dann komplett der Farbe rot,
00FF00 = Grün (bzw. ohne die Nuller am Anfang der Zahl)
0000FF = Blau


----------



## meilon (3. April 2005)

Das weiß ich ja schon. Ich wollte einen Tipp, wie man am besten die Pixel miteinander Vergleichen kann. RGB wäre wegen den Zahlen wohl am besten, oder?

Wie würdest du errechnen, wie nun die Farben hellblau und dunkelrot voneinander abwechen?

mfg


----------



## meilon (4. April 2005)

Okay, habs gebacken bekommen 

Alle 500ms lass ich das Bild überprüfen. Funktioniert super. Muss jetzt nur noch Feintuning machen was die Farbunterschiede angeht. Eindeutig zu erkennen beim Finger, dass das Programm keinen Unterschied zum Poster erkennt 

Für alle Leute die sich dafür interessieren, habe ich ein Capture meiner sehr unaufgeäumten Oberfläche (Wie mein Schreibtisch ) sowie den Quelltext für die Farbüberprüfung und des "malen" der Änderungserkennung angehängt. Vielleicht mach ich auch noch eine Bewegungserkennung rein, was aber bestimmt speicherlastiger wird. Bin jetzt schon bei 40-50% Auslastung bei einem AMD 3000+ 400MHz FSB und der Speicher wird mit 11 MB  während des Testbetriebes gefüllt.

Wenn jemand Codeoptimierungen hat, dann bitte Posten.

mfg


----------

