PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : HSV.hue in Image zeichnen (in C/C++)



Felixx87
26.05.2008, 21:36
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 (https://www.roboternetz.de/wissen/index.php/Bildverarbeitung_Tutorial)
)mein HSV Bild zeichnen??? wenn ich den HSV einfach als RGB annehme bleibt alles schwarz^^

das mein ich
https://www.roboternetz.de/wissen/images/8/85/RGBHSV.jpg

MFG

just4fun
26.05.2008, 22:31
Vielleicht gibt es hier:
http://vision.cis.udel.edu/opencv/ref/OpenCVRef_cv.htm#decl_cvCalcHist
bzw. hier weitere Infos für dich:
http://opencvlibrary.sourceforge.net/Welcome

Gruß,

just4fun

Felixx87
27.05.2008, 18:56
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...

tompcat
29.05.2008, 08:37
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

Felixx87
29.05.2008, 12:14
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) (http://en.literateprograms.org/RGB_to_HSV_color_space_conversion_(C))


#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;
}

tompcat
29.05.2008, 13:22
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.

Felixx87
29.05.2008, 14:32
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

tompcat
30.05.2008, 08:37
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:


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]

Felixx87
30.05.2008, 12:43
Hi,

Soo ich hab den fehler gefunden^^

ich habe mir diese struct definiert


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.

Felix G
31.05.2008, 14:26
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)