Autor Beitrag
violinenspieler1000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 01.07.09 21:54 
Hallo,

gegeben ist folgendes Problem:
Ein roter Laser erzeugt auf einem weißen Blatt-Papier einen roten "Punkt" (Der Punkt ist schon sehr verschwommen und unscharf), eine Webcam zeichnet Blatt und Papier auf. Ein Programm soll herausfinden, welche x-Koordinate und welche Y-Koordinate der Punkt hat.
Webcam kann sich relativ zu dem Papier nicht bewegen.


Probleme:
1. Es reicht nicht aus einfach ein Foto darauf zu untersuchen, wo ein roter Pixel ist, durch Fehler können nämlich auch ab und zu rote Pixel auf dem weißen Papier vorhanden sein.
2. Der rote Punkt besteht nicht nur aus roten Pixeln
3. schwankende Lichtverhältnisse
4. ...

Mit welchem Algorithmus kann ich die Position des Punktes finden? Der Algorithmus sollte möglichst zuverlässig sein, gleichzeitig aber auch nicht eine allzu große Ilmplementierungsherausforderung darstellen.
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Mi 01.07.09 22:29 
such einfach das bild ab, und merk dir für jedes pixel, in welchem abstand dazu noch rote pixel vorhanden sind
das "rot" muss natürlich eine toleranz erlauben.

bzw. brauchst du ja nur einen maximalwert.

also sowas wie:
ausblenden Delphi-Quelltext
1:
2:
3:
Trec=record
pos:TPoint;
anzRotPixel:Integer;


und dann ebn in einer for-schleife das bild ruchlaufen und in 2 weiteren for schleifen jedes pixel "umlaufen" und (abzüglich toleranz) die roten pixel zählen. am besten dir toleranz von der abweichung vom mittelpunkt-pixel abhängig machen
das ganze noch speedmäßig optimieren und fertig
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 01.07.09 22:35 
Kannst du vielleicht ein Beispielbild anhängen? Je nach Größe des Punktes, der Fehlerpunkte und des restlichen Bildes lässt sich das sicher optimieren.
crncpz
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 59

WIN 2000, WIN XP Pro
Delphi 6
BeitragVerfasst: Mi 01.07.09 22:38 
ich gehe mal davon aus das der laser punkt größer als ein pixel ist und deswegen würde ich einfach alle pixel auflisten und da wo vermehrt rote pixel auftreten müsste dann ja der Laser hinzeigen.

alternativ könntest du auch um jedes pixel das rot ist einen umkreis überprüfen und den farbmittelwert bilden, wenn ein einzelnes pixel rot ist ud drum herum weiß wird der mittelwert kleiner als der schwellwert. da wo der laser hin zeigt ist ja viel rot und der schwellwert wird überschritten. für das pixel wo der farbmittelwert am nächsten an rot liegt müsste der mittelpunkt des lasers sein.

dann musst du nur noch ein wenig mit der suchumkreisgröße und der schwellwert experimentieren bis du zuverlässige ergebnisse bekommst.

um sich ändernde lichverhältnisse unter kontrolle zu bekommen könntest du vielleicht versuchen einen weißen bereich zu überprüfen und dem das jeweilige rot zuordnen. mit einem dynamischen anlernen lässt sich so ganz schnell eine zuverlässige farbklasse für den laser generieren. vielleicht braucht man mit einer außreichend großen zahl an testpixeln so was auch gar nicht.
turboPASCAL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: Mi 01.07.09 23:17 
Naja, nicht gerade einfach.

Ich könne es mir so vorstellen

Als erstes das Bild bearbeiten und in Graustufen umrechnen ausgenommen rote Bereiche.
Nicht per RGB sondern mit HSL ( bzw. HSB).
Natürlich gibt es daran auch Ecken und Kanten an der Geschichte. Beleuchtung und Farbe des roten Lichts, überstralung etc.

Danach das Bild nochmals scannen, welches nun in einzelne Raster aufgeteilt ist, die eine best. Grösse haben zB. 40x40 Pixel.
Zählt man nun die Anzahl der Roten Pixel in einem Raster, kann der LaserPunkt dem Raster zugeteilt werden welches die meisten roten Pixel hat.

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Do 02.07.09 08:43 
Hi :)

Leute, ihr denkt zu kompliziert :autsch: :mrgreen: :rofl:

Ich würde das so machen: Positionen aller Pixel mit Rotanteil > x aufsummieren, durch Anzahl teilen. Fertig: Mittelpunkt der Punktwolke. Zufällig auftretende rote Pixel dürften dabei rausfallen.

Sind zwar u.U. ziemlich weit weg, aber auch ziemlich wenige und ziemlich viele am Laserfleck. Sollten es mehr false positives sein, werden sie in alle Richtungen gleich verteilt sein. Sonst entsprechend die Schranke anpassen.

Erweiterte Methode: Outlier detection.

mfG,
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1322
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 02.07.09 09:47 
Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

He, das ist eine geniale Idee! :zustimm: Das muss ich mir merken.
Zum finden des Rot Anteils : Das ist bei einem weißen Blatt Papier nicht ganz einfach. Da ein echtes weis auf allen drei Grundfarben volle intensität hat. Also einfach nur Rot verwenden dürfte da nix bringen.
Besser ist es ein Graustufenbild zu erzeugen das überall dort einen Wert hat wo der rote Anteil deutlich dominant ist und die anderen Anteile (Grün und Blau) nicht.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 02.07.09 10:17 
Hough-Kreis-Trafo auf das Bild machen Empfehlenswert könnte hier die Nutzung von HSV\HSL als Farbraum werden.

Aber ein Beispiel-Bild wäre wirklich einmal ganz gut ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Do 02.07.09 11:12 
user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
Zum finden des Rot Anteils : Das ist bei einem weißen Blatt Papier nicht ganz einfach. Da ein echtes weis auf allen drei Grundfarben volle intensität hat. Also einfach nur Rot verwenden dürfte da nix bringen.
Klar, das war natürlich stark vereinfachend. Würde ich ausgliedern in eine "IsRed"-Funktion, die den RGB-Pixel testet(oder ein anderes Format).

Mit Rotanteil meinte ich schon den relativen Anteil.

mfG,
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: Do 02.07.09 15:42 
user profile iconHidden hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde das so machen: Positionen aller Pixel mit Rotanteil > x aufsummieren, durch Anzahl teilen. Fertig: Mittelpunkt der Punktwolke. Zufällig auftretende rote Pixel dürften dabei rausfallen.

Sind zwar u.U. ziemlich weit weg, aber auch ziemlich wenige und ziemlich viele am Laserfleck. Sollten es mehr false positives sein, werden sie in alle Richtungen gleich verteilt sein. Sonst entsprechend die Schranke anpassen.


Hey,

die Einfachheit deiner Methode gefällt mir, allerdings kommst du in Schwulitäten wenn
a) der Punkt nur aus wenigen Pixeln besteht, und wenige rote Pixel sehr weit entfernt sind
b) es 2 Punkte geben sollte :)

Alternativvorschlag: Man lässt das ganze etwas "verschwimmen", erstellt sich also eine neue Matrix, mit z.B.
r(i, j) = a(i, j) + 1/2(a(i+1, j) + a(i, j+1) + a(i-1, j) + a(i, j-1))
(oder sowas ähnliches...)

Dabei sollte vor allem die Mitte von roten Punkten einen sehr hohen Wert erreichen, einzelne Pixel würden nicht so groß auffallen.

Moderiert von user profile iconNarses: Zitat gekürzt.
gfoidl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 157
Erhaltene Danke: 19

Win XP
C#, Fortran 95 - Visual Studio
BeitragVerfasst: Do 02.07.09 16:54 
Hallo,

du könntest das Bild auch mit einem Filter bearbeiten der das Rauschen entfernt und nur ein "rot/weiß" zurückgibt. Dann sollte das finden des Mittelpunkts kein Problem mehr sein.


mfG Günther

_________________
Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Fr 03.07.09 10:11 
user profile icongfoidl hat folgendes geschrieben Zum zitierten Posting springen:
du könntest das Bild auch mit einem Filter bearbeiten der das Rauschen entfernt und nur ein "rot/weiß" zurückgibt. Dann sollte das finden des Mittelpunkts kein Problem mehr sein.
Im Prinzip tut ja die IsRed()-Prüffunktion nichts anderes.

Hier geht es darum, das Arithmetische Mittel einer Menge zu bestimmen, die z.T. wenige, aber starke Streuer aufweist, d.h. das Gesetz der großen Zahlen nicht vollständig erfüllt.

Wenn ihr das genauer haben wollt, ist das Stichwort wie gesagt Outlier Detection, und da dürfte es fertige Algorithmen geben.

mfG,
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mo 18.01.10 15:19 
Ich habe in Thread Delphi-Forum.de » Multimedia / Grafik » Farbe in einem Bild finden mal auf diesen verwiesen.
Ich hoffe, dass Ihr dem hier auch weiterhelfen könnt.