-         

Ergebnis 1 bis 10 von 10

Thema: HSV.hue in Image zeichnen (in C/C++)

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.08.2004
    Ort
    Verden (bei Bremen)
    Alter
    30
    Beiträge
    247

    HSV.hue in Image zeichnen (in C/C++)

    Anzeige

    Hallo,

    ich habe ein kleines Projekt wo ich von einem Gerät die LEDs überprüfen möchte. Da soll getestet werden ob alle Roten und Grünen LEDs funktionieren.

    nun habe ich von einer Webcam das Bildchen abgeholt und in ein Image gezeichnet.
    Ich habe auch bereits eine Funktion die mir aus dem RGB-Werten ein Array mit den HSV-Werten berechnet.

    So Wie kann ich nun( aus diesem BSP.Bildverarbeitung_TUT
    )mein HSV Bild zeichnen??? wenn ich den HSV einfach als RGB annehme bleibt alles schwarz^^

    das mein ich


    MFG

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von just4fun
    Registriert seit
    06.09.2004
    Ort
    Hannover
    Alter
    46
    Beiträge
    314
    Vielleicht gibt es hier:
    http://vision.cis.udel.edu/opencv/re...ecl_cvCalcHist
    bzw. hier weitere Infos für dich:
    http://opencvlibrary.sourceforge.net/Welcome

    Gruß,

    just4fun
    www.robotiklabor.de - Der Podcast rund um Robotikthemen
    www.direcs.de - Meine Robotik-Seite mit Videos, Fotos, Screenshots, Source-Codes und mehr.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.08.2004
    Ort
    Verden (bei Bremen)
    Alter
    30
    Beiträge
    247
    Hi
    danke für den Link!
    Jedoch habe ich bisher nichts gefunden was meiner meinung nach das macht was ich haben möchte...

    aber da sind immerhin andere Nette sachen bei


    €dit:

    Gibt es niemanden der mir dabei Helfen kann? ich will doch nur dieses nette Bildchen zeichnen...

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2008
    Alter
    34
    Beiträge
    17
    Hi

    So leit es mir tut aber du hast da irgendwo einen grundsätzlichen fehler drinn. Das darf nicht schwarz bleiben. Hast du den output der HSV umwandlung debugt? Vieleicht hast du da einen fehler drinn und es kommt nur (0,0,0) raus. Prüfe eventuell noch den Wertebereich des Ausgabebildes und des Engabebildes. Es muß in beiden fällen ein unsigned Char sein, sonst mußt du den Wertebereich der HSV umwandlung anpassen. Ansosten kann ich mir den fehler nicht erklären.

    Viel glück noch

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.08.2004
    Ort
    Verden (bei Bremen)
    Alter
    30
    Beiträge
    247
    Hi Tompcat

    danke für deine Antwort.
    ich habe heute mal Edit Fenster eingebaut um mir die HSV Werte aus der Mitte des ildes anzuzeigen. Und siehe da der hue WErt ist immer 0! wenn ich im RGB r und B tausche steht er immer auf 171.

    Hier Meine Funktion(kommt aussm Netz)

    Code:
    #define MIN3(x,y,z)  ((y) <= (z) ? \
                             ((x) <= (y) ? (x) : (y)) \
                         : \
                             ((x) <= (z) ? (x) : (z)))
    
    #define MAX3(x,y,z)  ((y) >= (z) ? \
                             ((x) >= (y) ? (x) : (y)) \
                         : \
                             ((x) >= (z) ? (x) : (z)))
    
    
    struct hsv_color rgb_to_hsv(struct rgb_color rgb)
    {
        struct hsv_color hsv;
        unsigned char rgb_min, rgb_max;
        rgb_min = MIN3(rgb.r, rgb.g, rgb.b);
        rgb_max = MAX3(rgb.r, rgb.g, rgb.b);
    
        hsv.val = rgb_max;
        if (hsv.val == 0) {
            hsv.hue = hsv.sat = 0;
            return hsv;
        }
    
        hsv.sat = 255*(rgb_max - rgb_min)/hsv.val;
        if (hsv.sat == 0) {
            hsv.hue = 0;
            return hsv;
        }
    
        /* Compute hue */
        if (rgb_max == rgb.r) {
            hsv.hue = 0 + 43*(rgb.g - rgb.b)/(rgb_max - rgb_min);
        } else if (rgb_max == rgb.g) {
            hsv.hue = 85 + 43*(rgb.b - rgb.r)/(rgb_max - rgb_min);
        } else /* rgb_max == rgb.b */ {
            hsv.hue = 171 + 43*(rgb.r - rgb.g)/(rgb_max - rgb_min);
        }
    
        return hsv;
    }

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2008
    Alter
    34
    Beiträge
    17
    die zeile mit dem
    "hsv.sat = 255*(rgb_max - rgb_min)/hsv.val;" sollte in ein else rein von dem if dadrüber, da sonst passieren kann das hsv.val = 0 ist. Also ich seh jetzt nur diesen einen offensichtlichen fehler, aber 0 sollte der nun wirklich nicht ausgeben. Ich hab leider auch nicht die geringste Ahnung welche programiersprache das ist. Wenn du mich fragst stimmt da was nicht mit der MAX3 und der MIN3 definition, doch wie gesagt ich habe keine ahnung was da steht.

    Laß dir mal alle zwischenschritte ausgeben, dann weißt du was schief läuft. Oder programmiere es einfach selbst nach dem muster was du im tutorium gefunden hast. Das geht bestimmt schneller.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.08.2004
    Ort
    Verden (bei Bremen)
    Alter
    30
    Beiträge
    247
    Hi,

    danke die zeile werde ich entsprechend ändern.

    die Geschichte mit der Min und MAX definition ist für mich auch ein Buch mit 7-Siegeln. Ich würd mich nicht wundern wenn dies dem Fehler weiterhilft

    soviel ich weiß ist das eine Kurz schreibweise von C die ich echt abstoßend finde da man immerwieder genau nachsehen muss was da passiert. Ist letztlich wohl auch nur eine If-Else geschichte.

    MFG

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2008
    Alter
    34
    Beiträge
    17
    Oki


    Ich dir empfehlen einfach 2 mal mit dem typ rgb_color zu arbeiten, dann hast du später keine probleme beim darstellen:

    "struct rgb_color rgb_to_hsv(struct rgb_color rgb) "

    Dann hast du später keine probleme beim darstellen, wenn du den rgb_color überhaupt darstellen kannst. Dafür brauchst du nur im code hsv.val durch hsv.r, hsv.sat durch hsv.g und hsv.hue durch hsv.b ersetzen und hsv soll vom typ rgb_color sein.


    zum anderen bastele mal eine ordentliche function für MIN3:
    Code:
    unsigned char MAX3(unsigned charx,unsigned char y,unsigned char z){
    if (x>y){
       if (x>z)
          return x;
       else
          return z;
    }
    else{
       if (y>z)
          return y;
       else
          retirm z;
    }
    
    }
    so ich hoffe ich hab mich nicht irgendwo vertan.

    so ähnlich machst du das auch für MIN3 und dann geht alles wie geschmiert hoffe ich.

    Viel glück...

    Tompcat[/code]

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.08.2004
    Ort
    Verden (bei Bremen)
    Alter
    30
    Beiträge
    247
    Hi,

    Soo ich hab den fehler gefunden^^

    ich habe mir diese struct definiert
    Code:
    typedef union
    {
          struct
          {
                char R;
                char G;
                char B;
          }A    ;
          TColor Farbe;
    }mColor;
    doch leider habe ich dort zuerst int für die einzellnen farben gewählt und nicht char^^ (Ist mir einfach entfallen bzw. habs garnet gemerkt)
    und dadurch wurde mien Farbwert nur in das erste (R) reingeschrieben. daher konnte es nichts werden.

    so nun habe ich kein Schwarzes bild mehr aber die Frage bleibt wie ich damit ein SW bild hinbekomme(wenn ich nur mit dem Hue Wert arbeite)
    son Rotstich iss nicht soo toll.

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    ber die Frage bleibt wie ich damit ein SW bild hinbekomme(wenn ich nur mit dem Hue Wert arbeite)
    son Rotstich iss nicht soo toll.
    ähm... wie wärs mit R=G=B=H?
    (nur zur Ausgabe auf dem Bildschirm versteht sich, in allen anderen Fällen wäre das reine Platzverschwendung)
    So viele Treppen und so wenig Zeit!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •