Bitmap Farbe auslesen

  • C#
  • .NET (FX) 4.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Switcherlapp97.

    Bitmap Farbe auslesen

    Hallo,

    Ich habe angefangen meinen RubiksCubeSolver etwas zu erweitern und möchte gerne einen Webcam-Input von verdrehten Würfeln implementieren.

    Mein Ansatz (mit Screenshot etwas verständlicher):

    - Transparentes Raster für die fehlenden Farben über den Webcaminput legen (das graue im Hintergrund ist das Bild von der Webcam (wenn auch von einem Blatt abgedeckt :D ))
    - Mit dem Klick auf den Snapshot-Button wird das aktuelle Webcambild in eine Bitmap geladen

    - Für jedes Feld wird dann folgendes gemacht:
    - Punkte des Webcamfelds durchgehen und herausfinden, ob ein Punkt im Quadrat liegt
    - falls ja die Farbe des Punktes mit myBitmap.GetPixel(myPoint.X, myPoint.Y)
    - die Farbe mit den bereits vordefinierten Würfelfarben vergleichen und herausfinden zu welcher die Ähnlichkeit am größten ist (Farben des RubikCubes)
    - diese in einer Liste zwischenspeichern, wo auch die Farben der anderen Punkte im Quadrat hinzugefügt werden
    - das Feld mit der Farbe, die am häufigsten in der Liste aufscheint, füllen

    Die Ermittlung, ob ein Punkt in einem der vordefinierten Felder liegt, funktioniert bereits einwandfrei (grünes Polygon im Screenshot). Wenn ich aber die Pixel der selben Koordinaten setzte (mit myBitmap.SetPixel), befinden sich diese nicht im Feld, in dem sie sein müssten (rote Punkte).

    Das wäre meine erste Frage: Wieso sind die einzelnen Punkte an unterschiedlichen Positionen, obwohl sie die identischen Koordinaten haben?

    Meine zweite Frage: Wie vergleiche ich am effektivsten eine Farbe mit vordefinierten Farben, um zu ermitteln zu welcher die größte Ähnlichkeit besteht?

    Ich hoffe ich konnte es einigermaßen verständlich erklären ^^

    Danke
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    Set- und GetPixel sind leider sehr langsam, hier wäre es besser, LockBits bei VB oder unsafe bei C# zu verwenden. Bei der Farberkennung würde ich einen Bereich auswählen, dort alle Farben auslesen und den Durchschnitt berechnen. Danach die Farben vergleichen, da würde ich am ehesten auf den H-Wert (HSV- oder HSL-Farbraum) setzen.
    Da ich sowas schonmal gemacht hab, kann ich auch gerne mit konkretem Code weiterhelfen, das dann aber lieber privat als hier öffentlich.