PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei RGB zu HSV-Wandlung



troede
31.08.2006, 19:33
Huhu!

So bin neu hier aber hab schon einen Haufen durch und mitgelesen =)

Ich habe auch vor mir in nächster Zeit einen Robi zu bauen, ein Spaßprojekt, einen interagierenden Roboter. Bevor ich damit anfang wollte ich mir erstmal softwaremäßig einen Überblick machen, was für Möglichkeiten des "Inputs" es gibt.
Ich habe mit dem Bildverarbeitungstut. angefangen, läuft eigentlich auch alles soweit recht gut bis jetz, ich hab nur ein Problem mit den Webcams (ich denke es liegt an denen)

Wenn ich von RGB nach HSV umwandle und mir das "H"-Bild anguck dann seh ich immer Klötzchen (s. Bild). Habs mit ner andern Cam getestet, die hat gegrieselt, da wars ein reines Chaos und man hat gar keine Objekte erkannt. Liegt das an der Komprimierung der Kamera? Oder ist es ein Fehler im Code (das Bspbild vom Tut wandelt er aber genauso um). Gibt es Webcams mit denen ihr gute Erfahrung habt? Denn Objekterkennung wird schwierig wenn man Legosteine im Bild hat ;)


Grüße,
Tim

robocat
31.08.2006, 20:12
an deiner webcam sollte das nicht liegen, das rgb bild ist doch ok..
welchen algorithmus benutzt du zur umwandlung? ich denke da ist der wurm drin.
ich habe hier nur HSL->RBG:
http://codefactory.dead-men.de/index.php?tutorial=51

gruesse

troede
31.08.2006, 20:30
Doch zoom mal ran, das sind die typischen Kompressionsklötzchen, oder?

Als Algorythmus hab ich den von hier (is in VB geschrieben):
http://www.aboutvb.de/khw/artikel/khwrgbhlshsv.htm

Und schau mal, wenn ichs mit nem richtigen Foto mache dann geht's auch besser:


EDIT:
2. Anhang, ich hab das mal vergrößter und dunkler gemacht, das liegt doch schon dadran oder?

dennisstrehl
31.08.2006, 20:38
Hast du die Kantenerkennung über den Farbton-Kanal drüberlaufen lassen? Ich glaube das geht nicht. Zumindest nicht bei hellen und dunklen Flächen.
Aber mit den Klötzchen scheint's auch was zu tun zu haben.

Du siehst ja im H-Kanal schon, dass in den hellen Flächen unten Sprüge drin sind. Das hängt teils mit der Kompression und teils damit zusammen, dass bei Weißtönen sehr kleine Schwankungen starke Farbton-Schwankungen auslösen, z.B. (255 / 255 / 254) = Blau und (254 / 255 / 255) = Rot

troede
31.08.2006, 20:43
Nein hab ich auf dem Screenshot nicht, allerdings funktioniert das wunderbar, habs immer nur mit einem Kanal getestet aber das ging gut. Nur dann hat man halt viel zu viele Kanten...

D.h. wohl neue Webcam oder? Hat ich eh vor, das is so ne billige. Gibts denn welche ohne Kompression?

stochri
31.08.2006, 21:09
Hallo troede,

was möchstest Du denn mit deiner Kamera erkennen?
Ich habe mich auch schon mal vor einiger Zeit mit der Bildverarbeitung versucht https://www.roboternetz.de/phpBB2/viewtopic.php?t=15731 . Mit eine Quickcam Pro konnte ich für mich brauchbare Ergebnisse erzielen.

Gruss,
stochri[/url]

troede
31.08.2006, 21:23
Hey!
Wie gesagt ich dachte an einen "humanoiden" Roboter, der z.B. Gesichter erkennen kann und Menschen. Aber auch einfache Gegenstände.
Ist das für privat überhaupt realisierbar? Denn man hat ja nicht immer einfache Hintergründe in ner Wohnung, eher das Gegenteil davon...

Würdet ihr für Menschen lieber eine Infrarotkamera nehmen? Ist ja doch deutlich einfacher oder?

Grüße


EDIT:
Ich hab das grad mal mit deinem Testbild getestet...ich glaub da stimmt wohl doch irgendwas nicht, schauts euch mal im Anhang an.



Public Sub RGBColorToHSV(ByVal Color As Long, rH As Integer, _
rS As Integer, rV As Integer, rBack As Integer, gBack As Integer, bBack As Integer)

OleTranslateColor Color, 0&, Color
nR = Color Mod 256
rBack = nR
Color = Color \ 256
nG = Color Mod 256
gBack = nG
Color = Color \ 256
nB = Color Mod 256
bBack = nB

RGBtoHSV nR, nG, nB, rH, rS, rV
End Sub

Public Sub RGBtoHSV(ByVal R As Integer, ByVal g As Integer, _
ByVal b As Integer, rH As Integer, rS As Integer, rV As Integer)
On Error Resume Next

nRR = R / 255
nGG = g / 255
nBB = b / 255
nRGBs(0) = nRR
nRGBs(1) = nGG
nRGBs(2) = nBB
nMax = zMax(nRGBs)
nMin = zMin(nRGBs)
nV = nMax
If nMax <> 0 Then
nS = (nMax - nMin) / nMax
End If

If nS = 0 Then
nH = -1
Else
nDelta = nMax - nMin
Select Case nMax
Case nRR
nH = (nGG - nBB) / nDelta
Case nGG
nH = 2 + ((nBB - nRR) / nDelta)
Case Else
nH = 4 + ((nRR - nGG) / nDelta)
End Select
nH = nH * 60
If nH < 0 Then
nH = nH + 360
End If
End If
rH = nH
rS = nS * 100
rV = nV * 100
End Sub

Und das ist der Code für die Umwandlung, copy&paste deswegen sollte das ja eigentlich gehn oder? Was auf dem Bild ist ist der "H-Kanal".
Oder liegt das wieder nur daran dass das n JPG ist? Hast du das mal probiert, deinen Screenshot umzuwandeln?

troede
31.08.2006, 23:24
OK ich hatte vergessen die Normierung vorzunehmen, von 360 auf 255... 8-[

Sieht schon viel besser aus. Wie mach ich denn jetzt weiter am besten?

Und noch eine Frage, manchmal bekomm ich viel bessere Ergebnisse wenn ich den S oder den V-Kanal nehm...nach welchem Kriterium is denn das so?

jeffrey
01.09.2006, 00:33
teste die umwandlung doch mal in matlabn oder scvilab, dann kannt du schauen, ob´s an deinem proghramm oder am bild liegt

troede
01.09.2006, 01:37
Wie geht das? :roll:

jeffrey
01.09.2006, 11:13
hi,
am besten du nimmst scilab, das ist frei verfügbar. wie das geht, kannst du hier lesen: https://www.roboternetz.de/phpBB2/viewtopic.php?t=16884
dann lädst du das bild und verwendest den befehl rgb2hsv, und dann schaustr du dir die einzelnen kanäle an.
mfg jeffrey

troede
02.09.2006, 19:13
Hey!
Ich hab jetz nen Trick gemacht, ich "blure" das Bild einfach vorher. Code ist von http://www.activevb.de/tipps/vb6tipps/tipp0243.html , funktioniert einwandfrei und schnell!

Im Anhang könnt ihrs sehn. Bei Gesichtern oder sowas funktioniert das besonders gut, das Bsp ist jetz nicht grad so geeignet ;)

FuRanKu
24.09.2006, 11:47
Hallo Troede,

ich kann Dir eventl noch ein paars Tipps geben um die Bildqualität zu erhöhen, da ich mich im Moment sehr mit Webcams beschäftige.

Also das Wichtigste ist erstmal die Artefakte rauszukriegen, denn da wird ne Menge Infos weggeholzt und Du brauchst keinen Blur mehr. Und das geht am Besten so:

-Eine Usb 1.1 Cam schafft eigentlich unkomprimiert nur 5fps. Das die 25fps senden schaffen die nur über Komprimierung. Da gibt es RGB oder I420 (bei den Einstellungen der Kamera)
-Am Besten eine Usb 2.0 Cam nehmen und mit 15fps laufen lassen.
-I420 ist bei Dir zu empfehlen, da Du ja nur den Helligkeitskanal brauchst. I420 heisst pro 4 Bildpixel: 4 für Helligkeit, 2 für B-R Kanal, 0 für R-G Kanal. D.h. die Farbe wird richtig schlecht und reingerechnet.
-Wenn die Cam einen SW-Modus hat würde ich den bevorzugen.
-Bei den Einstellungen kannst Du auch noch ne Menge optimieren, also Gain, Kontrast, Helligkeit etc. Kannst Du hier sehr gut nachlesen:
http://astrofotografie.ilo.de/aufnahmetechniken/toucam.optimieren.php
Das ist eine Astroseite. Die haben die TouCam von Philips (ca. 25eu bei Lidl) optimiert und ziemlich rauschfrei bekommen. Die haben sogar die Cam gehackt und mit neuem Code bespielt. http://www.astrosurf.com/astrobond/ebrawe.htm
-Dort gibts auch Tipps fürn einen Umbau als IR-Cam. Würde ich aber von abraten. Oder eher nur den Ir-Filter aus der Cam rausholen.
-Jede CCD!!!-Webcam hat einen Ir-Filter eingebaut, denn die Chips sind auch Ir-empfindlich. Das verändert aber die Farben und deshlab ist zwischen Optik und Chip ein kleiner Plastikfilter, den man aber leicht rausknacken kann. Dadurch wird die Cam viel lichtempfindlicher oder kann im Dunkeln mit Ir-Beleuchtung (Leds) noch was sehen.

Soweit so gut
Ciao FuRanKu