PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO mit Kamera ferngesteuert



stochri
07.01.2006, 08:19
Hallo Zusammen,
so, jetzt habe ich es geschaft, den ASURO mit einer Kamera fernzusteuern. Es funktiniert zwar noch nicht ganz so schnell, wie bei den Fussbalrobotern der Midsize-Leage, aber immerhin.

Das Setup:
- Logitech Quickcam Pro4000, 1m über Boden
- USB-Infrarot Transceiver daneben
- SCILAB mit SIP zur Steuerung und Bildverarbeitung

Zum Test habe ich dem Roboter mal die Wegpunkte des NIkolaushauses vorgegeben und die Bahn aufgezeichnet. Das ganze siehe ein wenig wackelig aus, besonders an der oberen Kante. Bei der oberen Kante bestand das Problem, dass der ASURO am Rand des Erfassungsbereiches der IR-Sendediode gefahren ist und teilweise Kommandos verloren hat. Die IR-Sendediode des USB-Transceivers hat leider nur einen Öffnungswinkel von 17°, sodass der Lichkegel relativ schmal ist. Ich möchte die Kamera und den Sender aber höher hängen, damit der Aktionsradius des ASURO größer gemacht werden kann.

Die ersten Bilder der Bildverarbeitung habe ich hier gepostet:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=15731

Gruss,
stochri

RedBaron
07.01.2006, 09:30
Hallo stochri,

Gratulation, sieht super aus =D>

Nur so als Idee: Du könntets noch eine (andersfarbige?) Markierung anbringen oder die LESDs anschalten und detektieren. Dann hast du auch die Orientierung.

Wieviele Bilder pro Sekunde analysierst du? Magst du ein wenig mehr über die Bilderkennung berichten (fertige Software oder selbst geschrieben)? Im anderen Beitrag erwähnst du SCILAB (habe ich googeln können), aber was ist SIP (23.000.000 Hits, z.T. recht lustig)?

Gruß Red Baron

stochri
07.01.2006, 13:34
Hallo Red Baron,

Nur so als Idee: Du könntets noch eine (andersfarbige?) Markierung anbringen oder die LESDs anschalten und detektieren
Da habe ich zuerst auch dran gedacht. Ich wollte aber schnell zu einem Ergebnis kommen und die Erkennung mehrer Punkte hätte meine Algorithmus gleich etwas komplizierter und störanfälliger gemacht.
Aber man könnte das Nikolaushaus sowieso nicht zeichnen, wenn man den Winkel des Roboters nicht kennen würde.
Deshalb bin ich folgendermaßen vorgegangen:

0. Bestimme den Standort
1. Fahre einen kleinen Schritt
2. Lege eine Gerade durch die beiden Punkte
3. Ermittle den Winkel
4. Ermittle den Winkel zur Zielposition
5. Drehe um den Differenzwinkel

Mit dem Programm https://www.roboternetz.de/phpBB2/viewtopic.php?p=145769#145769 im ASURO kann kann ich nur in ca10° Schritten drehen. Deshalb fährt der ASURO immer einen kleinen Schritt, die Kamera bestimmt dann die Position und korrigiert nötigenfalls die Richtung.
Dass das Bild wie eine Handzeichnung aussieht, könnte mit der geringen Winkelauflösung beim Drehen zusammenhängen.

Fahren und Drehen kann der ASURO mit dem Programm immer nur in kleinen Schritten. Gegenüber der Methoden dem ASURO per Infrarot einen Drehwinkel und ein Kommando zu übermitteln stört es in diesem Fall nicht, wenn einmal ein Befehl bei der Übertragung verloren geht. Im schlimmsten Fall bewegt sich der ASURO dann minimal in eine falsch Richtung. Er wird aber dann im nächsten Schritt durch die Bildverarbeitung wieder korrigiert.

Hier noch die Links:
SCILAB: http://www.scilab.org/
SIP: http://siptoolbox.sourceforge.net/

Gruss,
stochri

stochri
07.01.2006, 13:44
Hier das Scriptfile für die Bildaufnahme und die Bestimmung der Position des ASURO über die Farbe. Zur Bildaufnahme verwende ich das Programm "webcam" ( linux). Leider bremmst dieses Verfahren die ganze Bildauswertung ziemlich stark ab, weil der Aufruf von webcam ca.2 Sekunden dauert.
Es würde mich sehr freuen, wenn jemand eine Lösung wüßte, das ganze zu beschleunigen. Mit kdetv können die Bilder der Kamera immerhin in Echtzeit dargestellt werden, also müßte es auch ein Möglichkeit geben, die Daten schneller in SCILAB reinzukriegen.


function [xcp,ycp]=asuropos()
// Take picture and calculate Position
//
// 4.1.2006 stochri

clear x
clear r
unix webcam
x=imread('webcam.jpeg');
hsv=rgb2hsv(x);
hsv(:,:,3)=1;
r=hsv2rgb(hsv);

red=[1 0 0];
green=[0 1 0];
blue=[0 0 1];
ref=red;
colorerror=sqrt( (r(:,:,1)-ref(1)).^2 + (r(:,:,2)-ref(2)).^2 + (r(:,:,3)-ref(3)).^2)/sqrt(2);
//xset('window',1);
//xbasc
//imshow(colorerror);

bw=im2bw(colorerror,0.3);
//xset('window',2);
//xbasc
//imshow(bw);

[xcp ycp]=centroid(1-bw)

endfunction
//
// -------------------------------------------------------------------------
// This file ist made for scilab the free mathematical toolbox
//
// Copyright (C) 2006 stochri
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// -------------------------------------------------------------------------
//

RedBaron
07.01.2006, 14:20
Hallo storchi,

selbermachen sollte eigentlich nicht so schwierig sein:
https://www.roboternetz.de/wissen/index.php/Bildverarbeitung_Tutorial oder
http://de.wikipedia.org/wiki/Segmentierung_%28Bildbearbeitung%29

Ich hab' leider keine Webcam. Wie kommt man bei solch einem Gerät an die Daten 'ran? Gibt es einen (mehr oder weniger) kontinuierlichen Datenstrom? Treiber? (Ich habe Windows XP und nutze Visual Studio (VB und C#))

Gruß Red Baron

stochri
07.01.2006, 17:27
Hallo Red Baron,
das Tuturial habe ich schon gesehen. Allerdings muss ich sagen, dass es ein wenig kurz gefasst ist. Wobei die Transformation der RGB Daten in das HSV Format das weseentliche Element meines Programmes ist. Hier mal der Ausschnitt aus dem obigen SCILAB Scribt:

Mit

rgb2hsv

wandle ich die Daten ins HSV Format um und setze dann die Helligkeit

hsv(:,:,3)=1;

auf Maximum. Dann werden die Daten zurücktransformiert.
Danach wird die Vektordifferenz zur Farbe rot berechnet und das Bild mit

bw=im2bw(colorerror,0.3);

in ein Schwarzweisbild umgewandelt. Dann einfach der Flächenschwerpunkt

[xcp ycp]=centroid(1-bw)

ermittelt. Der Flächenschwerpunkt enspricht der aktuellen Position des ASURO.

Das ganze läuft bei mir unter Linux. Das Programm "webcam" speichert beim Aufruf ein Bild als File in das aktuelle Verzeichnis ( ein ähnliches Programm zu finden, sollte bei XP kein Problem sein). Das Bild lese in Scilab mit

x=imread('webcam.jpeg');

ein ( da müßte es wohl auch ein Bildeinlesfunktion für VB irgendwo geben). Aber ich kenne mich damit nicht aus.


Eigentlich kann man mit einer Webkamera und einem ASURO schon ganz schön viel machen. Wenn man nur einen ASURO hat, kann man damit schon ein 1-Roboter Fussbalspiel programmieren. Die Bilderkennung muss nur den Ball und den ASURO erkennen und wissen wo das Tor ist. Das Programmieren am PC hat den großen Vorteil, dass die langwierige Fehlersuche im ASURO entfällt, weil die Steuerung ja auf dem PC läuft. Und heute erst wieder habe ich eine Webkamera für 10€ gesehen.
Und falls es bei dir mit XP nicht klappt, kannst Du ja eine Linux-Partition installieren. Ich poste dann hier alle SCILAB Files, damit du den Roboter steuern kannst. Allerdings muss man natürlich darauf achten, eine Webkamera zu kaufen, für die es einen Linuxtreiber gibt.
Ich habe mir übrigens die Logitech Quickcam Pro4000 gekauft, weil die einen CCD Chip drin hat und im Vergleich zu meiner alten Quickcam Messenger eine wesentlich bessere Bildqualität hat. Die kostet allerdings 50€.

Gruss,
stochri

RedBaron
07.01.2006, 17:58
Hallo Storchi,

vielen Dank für die vielen Informationen.

Ich glaube, dass das Speichern der Daten auf Platte und das Wiedereinlesen einiges an Zeit kostet (einige 100 mSec zumindest). Deshalb meine Frage nach dem Datenstrom.

Was SCILAB so genau gemacht, weiß ich nicht. Aber es sieht so aus, als ob das Bild mehrfach und jedesmal komplett bearbeitet wird. Ich glaube es wird schneller, wenn man auf jeden Bildpunkt/-ausschnitt die Operationen direkt nacheinander ausführt und dann erst zum nächsten Bildpunkt geht (bin mir aber nicht sicher).

Eine andere Möglichkeit der Optimierung ginge vielleicht etwa so:
Wenn man einmal den Ort des ASURO bestimmt hat und die ungefähre Geschwindigkeit kennt, kann man in etwa abschätzen, wo er beim nächsten Bild sein wird. Dann braucht man nur noch diesen Bildausschnitt (mit einem bisschen Sicherheitsaufschlag) zu analysieren. Also statt 600 x 800 (480.000 Bildpunkte) nur noch z.B. 100 x 200 (20.000 Bildpunkte, Faktor 24). Das könnte zu einer höheren Abtastrate führen, was wiederum die Möglichkeit der Bildrezierung erhöht.

SCILAB hatte ich schon einmal runtergeladen (zum Berechnen von Regelkreisen). Ich hab' aber zu blöd angestellt und bin damit nicht klar gekommen. Kennst du eine Seite (vielleicht sogar auf deutsch), die einen Einstieg in das Programm ermöglicht?

Ich hab' mitlerweile nachgeschaut, eine Webcam kostet wirklich nicht viel. Ich werde mir wohl eine zulegen. Denn das, was du gemacht hast, finde ich schon echt spannend! Bis dahin werde ich mal ein paar Versuche mit dem geposteten jpeg deines ASUROs machen.

Gruß Red Baron

izaseba
07.01.2006, 19:16
Hallo Stochri,
kennst Du xawtv ?
Das ist ein echt gutes Video Capturing Programm, damit habe ich auch schon einiges aus der Konsole raus gemacht, vielleicht geht es damit schneller...

Gruß Sebastian

Edit:

Was ist, wenn Du Dir eine RAMdisk einrichtest, um die Bilder im Speicher zu belassen, und nicht erst auf die Festplatte zu schreiben? Das könnte eventuell auch schneller gehen, oder ?

stochri
07.01.2006, 19:28
Hallo Red Baron,

Ich glaube, dass das Speichern der Daten auf Platte und das Wiedereinlesen einiges an Zeit kostet (einige 100 mSec zumindest).

Das Speichern auf die Platte wird vielleicht schon 100mSec oder so um den Dreh dauern. Bei mir scheint es allerdings eher der Aufruf der webcam-Funktion zu sein. Es dauert nämlich in der Kommandozeile auch so ca.2 Sekunden. Es könnte natürlich auch damit zusammenhängen, dass ein jpeg-Bild gespeichert wird und dafür wird die Komprimirungsroutine wohl auch etwas Zeit benötigen.


Was SCILAB so genau gemacht, weiß ich nicht. Aber es sieht so aus, als ob das Bild mehrfach und jedesmal komplett bearbeitet wird.

Sieht so aus, als wenn Du es schon ausprobiert hast? Ich habe festgestellt, dass das Anzeigen des Bildes sehr viel Zeit braucht. Wenn man die Anzeige abschaltet, geht die Verarbeitung wesentlich schneller. Mein Positionsfindealgortihmus braucht, wenn man das Bildladen wegläst und die Bildausgabe abschaltet 260ms (bei 320x240 Punkten). Und meinen Rechner habe ich momentan nur auf der halben Geschwindigkeit laufen (1.2GHz ). Wenn ich auf 2.6GHz hochtakte, rechne ich mit einer Ausführungszeit von unter 150ms.


Also statt 600 x 800 (480.000 Bildpunkte) nur noch z.B. 100 x 200 (20.000 Bildpunkte, Faktor 24). Das könnte zu einer höheren Abtastrate führen, was wiederum die Möglichkeit der Bildrezierung erhöht

Klar eine Reduzierung der Punkteanzahl erhöht die Geschwindigkeit. Aber wie schon erwähnt, macht ja momentan eher das Bildeinlesen mit mehr als 2Sekunden im Vergleich zu den 150ms Auswerung den großen Anteil


SCILAB hatte ich schon einmal runtergeladen (zum Berechnen von Regelkreisen). Ich hab' aber zu blöd angestellt und bin damit nicht klar gekommen. Kennst du eine Seite (vielleicht sogar auf deutsch), die einen Einstieg in das Programm ermöglicht?

Scilab Kurzeinführung: http://www.nt.fh-koeln.de/fachgebiete/mathe/pmdat/scilabein.pdf
Ansonsten bei der Bildverarbeitungstoolbox exec(SIPDEMO)


Ich hab' mitlerweile nachgeschaut, eine Webcam kostet wirklich nicht viel. Ich werde mir wohl eine zulegen

Na, immer drauf los ! Bildverarbeitung ist ja ein hochaktuelles und spannendes Thema. Mich wundert ja, dass die Leute hier im Robterforum so wenig damit machen.
Wenn Du Dir eine Kamera kaufst und es nicht wirklich eng ist mit dem Geld, würde ich die bessere kaufen. Mit der Bildverarbeitung ist es wie sonst in der Messtechnik: Wenn der Sensor schlecht ist, macht das die Signalauswertung meistens nicht einfacher !

Gruss,
stochri

stochri
07.01.2006, 19:35
Hallo Sebastian

kennst Du xawtv ?
Ich dachte immer, das sei der Fernseher, so wie kdetv.


Was ist, wenn Du Dir eine RAMdisk einrichtest, um die Bilder im Speicher zu belassen, und nicht erst auf die Festplatte zu schreiben?

Hab ich auch schon mal dran gedacht, ich weiss aber nicht, wie man mit Linux eine Ramdisk einrichtet. Bei webcam gibt es die Möglichkeit, jede Sekunde ein Bild auf die Platte zu schreiben, die habe ich aber verworfen, weil die Bildaufnahme mit der Auswertung synchronisiert sein muss. Wenn ich mit "top" die Systemlast anschaue, braucht "webcam" ca. 7%CPU time. Scheint noch einigermaßen ok.

Gruss,
stochri

izaseba
07.01.2006, 19:53
Ich dachte immer, das sei der Fernseher, so wie kdetv.

Ja mit xawtv kann man auch Fernsehen, aber woher es Das Bild bekommt, und wohin es veschickt wird bleibt Dir überlassen.
leider habe ich momentan das Programm nicht drauf, um Dir ein paar Beispiele zu nennen, aber Google danach, oder installiere es und schau Dir die Manpages dazu "man xawvt" vielleicht lohnt es...

Die RAMdisk einzurichten, ist ganz einfach:

Erstelle Dir irgendein Verzeichnis z.B. /mnt/RAM, oder ~/meineRAMdisk oder was auch immer.
Jetzt tipe als root:

mount -t tmpfs -o size=20M tmpfs /mnt/RAM
oder
mount -t tmpfs -o size=20M tmpfs ~/meineRAMdisk

oder wie Dein Verzeichnis auch immer heißen mag.

Schon bist Du fertig, Du hast Dir eine RAMdisk mit 20MB größe eingerichtet!

Daß Du mit size=.... die größe angeben kannst brauch ich wohl nicht zu sagen, oder O:)

mit
df -h kannst Du prüfen, ob sie auch wirklich angelegt worden ist
Das gute daran ist, es werden nicht wirklich 20MB "verbraucht" sondern die größe variert, je nachdem wieviele Dateien drin sind, dynamisch also.

schreibe Deine Bilder einfach in Dieses Verzeichnis, ich hoffe, daß es hilft...

Achso willst Du als user darin schreiben, muß ein Eintrag in /etc/fstab rein, ich hoffe, daß es auch klar ist...

Gruß Sebastian

izaseba
08.01.2006, 12:18
Hallo stochri,

Ih hätte da noch eine Frage, und zwar, wie komunizierst Du mit dem Asuro ?

Mit der "Onboard" IR-Lösung?
Klappt das gut?

Ich habe irgendwo ein Joystick ausgegraben, und möchte versuchen meinen
Asuro damit zu steuern.
Nur stellt sich die Frage, wie gut die IR Verbindung funktioniert, nicht das sie nach 20 cm abbricht.

Klar könnte ich es selber probieren, nur netterweise hab ich mir die IR-Hindernisserkennung gebaut, und jetzt zeigt die Diode nach vorn, noch schön in einem Röhrchen versteckt #-o .

Gruß Sebastian

super_castle
08.01.2006, 12:25
Du kannst das auch ohne Kamere machen.
Du sendest einfach deine Pixeldaten vom PC-Programm (ich nehme Pure-Basic) einfach zum Robby und legst für jeden Pixel eine Wegstrecke und Drehpunkt fest.
Mit einem anderen Pure-basic-Programm beobachtet die Kam vom Robby und sendet dir das Bild zum Pc.

Castle

RedBaron
08.01.2006, 14:08
Hallo Storchi,

nein, ich habe noch nie mit SCILAB gearbeitet.

Den Trick mit Flächenschwerpunkt habe zuerst gar nicht so mitgekriegt. Ist aber eine feine und einfache Sache und macht das Leben ziemlich leicht.

Ich habe 'mal ein wenig experimentiert. Als Basis habe ich dein ASURO-Foto genommen.

Ich habe das Bild pixelweise abgearbeitet. Alle Punkte, die eine H-Wert zwischen 350 ... 360 ... 0 ... 10 haben (also rot) und eine Sättigung von min. 70%, habe ich in die Mittelwertberechnung einbezogen, alle anderen ignoriert. Verarbeitungszeit: 150 mSec bei einem 320 x 240 großen Bild (AMD +2800, Windows XP, Visual Basic .NET).

Ich habe mir die Position des Schwerpunkts gemerkt und danach nur noch ein 50 Pixel x 50 Pixel großes Bild um den Schwerpunkt herum analysiert. Hat 3 mSec gedauert. Wenn man davon ausgeht, dass eine Webcam 30 fps liefert und 5-10 Messungen pro Sekunde bereits ein gutes Ergebnis liefern sollten, ist das schon so gut wie Echtzeit.

Danach habe ich deinem ASURO einen grünen Punkt auf der Nase verpasst (zum Detektieren der Orientierung, s. Bild) und bei der Berechnung den "grünen" und den "roten Schwerpunkt" berechnet (Ergebnis s. 2.Bild).

Das mit dem Grün hat nicht ganz so gut geklappt. Der ASURO hat da einige grüne Flächen "onboard". Man sollte also nur solche Flächen berücksichtigen, die eine min. Größe haben.

Ingesamt finde ich das Resultat sehr ermutigend. Gleich morgen werde ich schauen, dass ich an eine Webcam herankomme.

Gruß Red Baron

stochri
08.01.2006, 17:33
Hallo Sebastian,


Ih hätte da noch eine Frage, und zwar, wie komunizierst Du mit dem Asuro ?
Mit der "Onboard" IR-Lösung?
Klappt das gut?
Ich habe irgendwo ein Joystick ausgegraben, und möchte versuchen meinen
Asuro damit zu steuern.
Ich verwende den ASURO IR-mässig im Orginalzustand. Das mit der IR-Kommunikation ist immer ein wenig problematisch. Im Moment häng der Sender in etwa 1m Höhe über dem ASURO. Laut Datenblatt hat die IR-Dioden einen Öffnungswinkel von 17°. Das dürfte einen Lichtkegel von

1m*sin(17°/180*pi)*2 = 58cm

ergeben. Man sieht aber schon, dass der Aktionsradius relativ begrenzt ist. Die Verbindung klappt bis auf eine Entfernung von ca. 4m, damit könnt man also den 4fachen Aktionsradius erreichen, wenn man eine 4m hohe Decke hätte.

Beim Avoider https://www.roboternetz.de/phpBB2/viewtopic.php?p=141576#141576 habe ich auch einen SFH300 wie beim ASURO als Empfänger verwendet. Den kann ich mit meiner normalen CD-Fernbedienung steuern. Ich erwähne das deshalb, weil Fernbedienungen im Vergleich zum ASURO Tranmitter mit Sendeströmen bis in den Amper-Bereich arbeiten und deshalb die Lichtstärke wesentlich größer ist.
Wenn der Empfänger allerdings vom Sender wegdreht, verliert man auch da die Verbindung.

Fazit:
Eine direkte IR-Fernsteuerung für den ASURO ist problematisch. Das läßt sich nur dann vernünftig verwenden, wenn ein kleiner Aktionsradius wie für das Experiment in diesem Thread ausreicht, der Sender ortsfest in gnügendem Abstand über dem Roboter angebracht wird und der Empfänger Sichtverbindung zum Sender hat.

Gruß,
stochri

Xtreme
08.01.2006, 17:49
Hi Leute

könnt ihr das mir dem Farb/Flächenschwerpunkt mal genauer erklähren?
Wäre ne große Hilfe, brauch sowas nämlich grad in Delphi...

Danke!

stochri
08.01.2006, 18:04
Hallo Red Baron,


nein, ich habe noch nie mit SCILAB gearbeitet.

Habe ich bis letzte Woche auch nicht. Aber ich verwende schon seit einiger Zeit MATLAB. Im privaten Bereich möchte ich aber SCILAB einsetzen.
Das sind eigentlich Mathematikprogramme, die für eine schnelle, interaktive Datenvisualisierung und das schnelle Ändern und Ausprobieren von Algorithmen geeignet sind.

Für eine reale Steurung nimmt man diese Programme normalerweise nicht.
Ich habe mit allerdings schon ein wenig mit dem Thema Bildverarbeitung befasst und wenn es um das Thema Neuentwicklung eines Algorithmus geht, glaube ich, dass man mit SCILAB schneller als mit BASIC oder C ans Ziel kommen. Aus diesem Grund sind große Matlab System ja auch in Entwicklung und Forschung im Automotive Bereich so weit verbreitet. Dort ist eben Zeit auch Geld.

Bei der Bildverarbeitung besteht das Problem, dass die Bilder sehr stark von der Beleuchtungssituation abhängen. Aus diesem Grund ist es sehr nützlich, wenn man die Daten schnell visualisieren, analysieren und den Algorithmus anpassen kann.
Etwas ungewohnt bei Scilab/Matlab ist, dass jede Varible als Matrix behandelt wird. Das Verfahren läst sich allerdings relativ rasch verstehen und dann ist der Syntax nur noch eine relativ einfache Scribt-Sprache. Falls es jemand in diesem Thread wünscht, kann ich mal ein kleines Tutorial machen, dann kann man das bestimmt schnell verstehen.

Gruss,
stochri
[/quote]

stochri
08.01.2006, 18:22
Hallo Xtreme,


könnt ihr das mir dem Farb/Flächenschwerpunkt mal genauer erklähren?
Wäre ne große Hilfe, brauch sowas nämlich grad in Delphi...


Der Algothmus für die Positionsbestimmung ist folgender:

1. Alle Farbpunkte auf gleiche Helligkeit bringen
2. Den Rot-Anteil nehmen mit einem Grenzwert vergleichen
3. Die Punkte, die über dem Grenzwert liegen in ein binäres Schwarz/Weisbild übertragen
4. Den Flächenschwerpunkt im Binärbild berechnen.

Hier das SCILAB Scibt für die Berechnung des Schwerpunktes einer Matrix. Wenn Du weist, wie man Matrizen mit Vektoren multipliziert, sollte das kein Problem sein, in Delphi umzusetzen.


function [rowcp,columcp]=centroid(mat)
//
// calculate the centerof a matrix
//
//
// $Revision: 1.0 $ $Date: 2006/04/01


nx=length(mat(:,1)); // nx=number of rows
ny=length(mat(1,:)); // ny=number of colums
gx=1:nx; // create vektor x=1,2,3..nx
gy=1:ny; // create vektor x=1,2,3..ny
summat=sum(mat); // calculate sum of all elements
if summat==0, // if summat=0 then the result is not defined
columcp=0;
rowcp=0;
else
columcp=sum(mat*gy')/summat; // calculate colum center point
rowcp=sum(gx*mat)/summat; // calculate row center point
end


endfunction

//
// -------------------------------------------------------------------------
// This file ist made for scilab the free mathematical toolbox
//
// Copyright (C) 2006 stochri
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// -------------------------------------------------------------------------
//



Gruss,
stochri

stochri
08.01.2006, 18:34
Hallo Red Baron,

Danach habe ich deinem ASURO einen grünen Punkt auf der Nase verpasst (zum Detektieren der Orientierung, s. Bild) und bei der Berechnung den "grünen" und den "roten Schwerpunkt" berechnet (Ergebnis s. 2.Bild).


Sieht schön aus, der grüne Punkt.



Das mit dem Grün hat nicht ganz so gut geklappt. Der ASURO hat da einige grüne Flächen "onboard". Man sollte also nur solche Flächen berücksichtigen, die eine min. Größe haben.

Der Algorithmus wird eben stabiler, wenn man nur die Farbe rot vewendet. Wie schon mal weiter oben erwähnt, habe ich die Winkelbestimmung absichtlich über die Gerade zwischen 2 Wegpunkten berechnet. Das funktiniert wirklich sehr gut, weil ja nur der erste Punkte auf der ASURO Wegstrecke unbekannt ist. Sobald man ein kleines Stück gefahren ist, kennt man den Winkel für alle nachfolgenden Fahrten.
Aber für den Lerneffekt ist es natürlich gut, auch mal mehrere Farben zu suchen.

Gruss,
stochri

stochri
08.01.2006, 20:00
Hallo Red Baron,
wie wäre es mit der Analyse des folgenden Bildes ?
Vieleicht wäre es praktischer, wenn man den Ball grün machen würde, wie im Beispiel von Dir oben. Aber ich glaube, irgendwann wird man wohl kaum drumrum kommen, mehrere Gegenstände gleicher Farbe im Bild zu finden Ich bin noch am Überlegen, wie man es schaffen könnte, die beiden roten Dinge auseinander zu halten ....

Gruss,
stochri

Xtreme
09.01.2006, 13:29
Aha... Danke! Den Code dieser centeroid funktion hab ich gesucht...
Dann mach ich mich mal an die Arbeit...

Xtreme
09.01.2006, 18:37
Hallo

nochmal ne Frage:


Matrix: A=
00000
01110
01110
01110
00000

Summe der Matix: 9?!?!??

Vektoren:
a=(1,2,3,4,5)
b=(1,2,3,4,5)



Wie multipliziere ich jetzt die Vektoren und die Matrix?
Also A*a bzw A*b

Der Zentrale Punkt müsste dann allso
P( (A*a)/9 | (A*b)/9) )sein....

Ich liege warscheinlich total daneben, stimmts?!??!

RedBaron könntest du evtl den VB code posten... den kann ich nämlich besser lesen, Danke!

stochri
09.01.2006, 18:59
Matrix: A=
00000
01110
01110
01110
00000

Summe der Matix: 9?!?!??

Vektoren:
a=(1,2,3,4,5)
b=(1,2,3,4,5)

stimmt beides


Wie multipliziere ich jetzt die Vektoren und die Matrix?
Also A*a bzw A*b

Der Zentrale Punkt müsste dann allso
P( (A*a)/9 | (A*b)/9) )sein....

Nicht ganz, weil A*a nicht gleich a*A ist.
Matrixmultiplikation heißt ja immer Zeile mit Spalte multiplizieren.
richtig wäre
P( (A*a)/9 | (b*A)/9) )sein, wobie ich allerding immer irgendwie Zeile und Spalte vertausche, es könnte also auch
P( (b*A)/9)|(A*a)/9 ) sein

bei Deiner obigen Beispielmatrix werden allerdings beide Fehler kompensiert, weil sie ja symmetrisch ist. Nimm lieber mal

00000
11100
11100
11100
00000

Gruss,
stochri

Xtreme
09.01.2006, 19:04
AAHHH!!
Stimmt... Matrixmultiplikationen sind ja nicht kommutativ.
Danke!

stochri
09.01.2006, 19:18
00000
11100
11100
11100
00000

Bei der Matrix müsste als Schwerpunkt
zeile=3
spalte=2
rauskommen.

Wenn Dein gesamtes Projekt funktioniert, poste doch mal das Ergebnis mit Bidl und so. Willst Du eigentlich den ASURO dann mit Delphi steuern ?
Mich würde interessieren, wie schnell dass der ganze Algoritnmus dann arbeitet.

Gruss,
stochri

Xtreme
09.01.2006, 19:19
Moment... wenn ich nen Vektor mit ner Matrix multipliziere bekomm ich wieder ne Matrix... dann durch 9... wieder ne Matrix.
Ich will doch net Zahl =(
Tut mir leid, aber heut steh ich aufm Schlauch... die komplexen Zahlen von heut Vormittag taten mir wohl nicht so gut =)

Xtreme
09.01.2006, 19:27
Oh, jetzt... hab das sum übersehen... seh die Befehle vor lauter Matrizien nicht mehr.
jetzt stimmts!!
Ja, kann ich posten wennst fertig ist!!

EDIT:
Mich intressiert nur das Verfahren an sich. Möchte eine Art Objektüberwachung machen. Vieleicht versuche ich auch meinen Bot damit zu steuern. Ist allerdings ein Eigenbau.

stochri
09.01.2006, 20:18
Vieleicht versuche ich auch meinen Bot damit zu steuern. Ist allerdings ein Eigenbau.


Eigenbau ist doch toll.
Falls du noch mehr files brauchst: Ich habe jetzt das gesamte Projekt inclusive des ASURO-Codes und aller script-files nach:

https://www.roboternetz.de/phpBB2/viewtopic.php?t=15537

kopiert.

Damit kann also jeder, der Suse 10 und eine Linux-fähige Webcam hat, seinen ASURO steuern.

Gruss,
stochri

Xtreme
11.01.2006, 14:13
Ah! Danke, werd ich mir mal anschaun!

stochri
11.01.2006, 16:21
Hallo Xtreme,
wie läuft Deine Bildverarbeitung, kann sie den Mittelpunkt schon finden ?

Gruss,
stochri

Xtreme
11.01.2006, 18:03
Jep... allerdings hab ich die Bilder bis jetzt immer noch "von Hand" geladen. Arbeite gerade daran das Bild direkt von der Cam zu laden. Ich hab schon mal was mit Video Capture gemacht, wird also nicht mehr lange dauern... morgen vieleicht.

stochri
11.01.2006, 22:45
Hallo Zusammen,
im Moment versuche ich gerade, einen Algorithmus für die Suche nach zwei Objekten in einem Bild zu realisieren.
Es klappt schon, nur ist der Algorithmus noch ein wenig langsam. Die Tiefpassfilterung braucht etwas zuviel Zeit.

stochri
12.01.2006, 17:23
Hier eine Beschreibung des Algorithmus zu den obigen Bildern ( gestern war's schon etwas zu spät ):

Bild1: Orginalbild
Bild2: Rote Farben mittels des Algoritnus wie weiter oben im Thread beschrieben extrahiert und in eine Pixelbild umgewandelt
Bild3: tiefpassgefiltertes Pixelbild, durch die Tiefpassfilterung werden aus den ebenen weißen Fläche kleine Berge
Bild4: Höchste Bergspitze gesucht und Berg mittels Überzeichnen aus dem Bild entfernt danach suchen der zweiten Bergspitze
Bild5: Position der beiden gefundenen Bergspitzen

Mich würde mal interessieren, was ihr von dem Algorithmus haltet. Er funktioniert, aber vielleicht hat ja noch jemand eine andere Idee ?

Gruss,
stochri

super_castle
13.01.2006, 20:03
Hallo, ich speichere die VideoCapturebilder der Cam über die Ablage in ein Picturefenster zum auswerten.
Ich Progge in Purebasic.
Ich Teste es zur Zeit über einen Button. Links ist das Videocapturebild (25 B/sec) und rechts wird nach dem Buttondrücken ein Picturebild dargestellt zum auswerten.
Eine andere schnellere Lösung als über die Ablage habe ich nicht gefunden.



; PureBasic Visual Designer v3.92 build 1460

IncludeFile "inc.pb"

#WM_CAP_START = #WM_USER
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
#WM_CAP_FILE_SAVEDIB = #WM_CAP_START + 25
#WM_CAP_SET_SCALE = #WM_CAP_START + 53
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
#WM_CAP_EDIT_COPY = #WM_CAP_START + 30
#WM_CAP_GRAB_FRAME = #WM_CAP_START+60

Open_Window_0()
OpenLibrary(0, "AVICAP32.DLL")

hRobby = CallFunction(0, "capCreateCaptureWindowA", "Test", #WS_VISIBLE + #WS_CHILD, 120, 30, 300, 300, hWnd, 0)
SendMessage_(hRobby, #WM_CAP_DRIVER_CONNECT, 0 , 0)
SendMessage_(hRobby, #WM_CAP_SET_SCALE , 1 , 0)
SendMessage_(hRobby, #WM_CAP_SET_PREVIEWRATE, 50, 0)
SendMessage_(hRobby, #WM_CAP_SET_PREVIEW, 1 , 0)

Repeat ; Start of the event loop

Event = WaitWindowEvent() ; This line waits until an event is received from Windows

WindowID = EventWindowID() ; The Window where the event is generated, can be used in the gadget procedures

GadgetID = EventGadgetID() ; Is it a gadget event?

EventType = EventType() ; The event type

;You can place code here, and use the result as parameters for the procedures

If Event = #PB_EventGadget

If GadgetID = #Button_0
If Link <> 0
StartDrawing( WindowOutput() )
DrawImage(Link, 440,30,300, 300)
StopDrawing()
EndIf
EndIf

EndIf

SendMessage_(hRobby, #WM_CAP_GRAB_FRAME, 0 , 0)
SendMessage_(hRobby, #WM_CAP_EDIT_COPY, 0 , 0)
Link = GetClipboardData(#PB_ClipboardImage)

Delay(1)

Until Event = #PB_Event_CloseWindow ; End of the event loop

SendMessage_(hRobby, #WM_CAP_SET_PREVIEW, 0, 0)
SendMessage_(hRobby, #WM_CAP_DRIVER_DISCONNECT, "Test", 0)
CloseWindow(0)
CloseLibrary(0)

End
;

Castle

Xtreme
14.01.2006, 11:09
In Delphi gibt es sowas wie Copyrect... so machs ich jedenfalls!
Werde heute Abend mal das Progrmm hochladen...

Xtreme
14.01.2006, 18:32
So, in meiner Galerie befindet sich jetzt ein Screenshot des Programms.
Bearbeitungszeit auf meinem 1,5 GhZ Rechner: ca. 450 ms

Auf meiner 3500 er Kiste läuft die Webcam komischerweiße net... muss ich mir mal genauer anschaun...

RedBaron
15.01.2006, 02:41
Hallo,

ich hab' mir jetzt eine WebCam zugelegt. Zur Zeit versuche ich mich darin, die Bilder mit einem VB-Programm einzulesen. Als Vorlage habe ich leider nur ein Programm in C++, das aber ekelhaft viele API-Funktionen über DirectX aufruft. Hat jemand eine Idee, wie es einfacher geht?

Hier der VB-Code (Auszüge) zur ermittlung der Schwerpunkt-Koordinaten:

....

bmpOrig ist eine Bitmap und enhält das Bild.

Dim mXRed As Integer, cXRed As Integer
Dim mYRed As Double, cYRed As Integer
Dim mXGreen As Integer, cXGreen As Integer
Dim mYGreen As Double, cYGreen As Integer

Dim x, y As Integer
Dim c As Color
Dim Hue As Integer
Dim Saturation As Integer
Dim Brightness As Integer

For y = 0 To bmpOrig.Height - 1
For x = 0 To bmpOrig.Width - 1
c = bmpOrig.GetPixel(x, y)
Hue = CInt(c.GetHue())
Saturation = CInt(c.GetSaturation() * 100)
Brightness = CInt(c.GetBrightness() * 100)
If (Hue > 355 Or Hue < 5) And (Saturation > 70) And Brightness > 35 Then
'roter Punkt, Farbwert (Hue) zwischen 355 .. 360 / 0 .. 5
mXRed += x 'Summe der x-Koordinaten mit roten Pixel
mYRed += y
cXRed += 1 'Anzahl der x-Koordinaten mit rotem Pixel
cYRed += 1
ElseIf (Hue > 105 Or Hue < 120) And (Saturation > 70) And Brightness > 35 Then
'grüner Punkt, Hue zwischen 105 .. 120
mXGreen += x
mYGreen += y
cXGreen += 1
cYGreen += 1
Else
'irgendeine andere Farbe
End If
Next
Next
mXRed = CInt(mXRed / cXRed) 'Mittelwert der x-Koordinaten mit rotem Pixel = x-Koordinate des Schwerpunkts
mYRed = CInt(mYRed / cYRed)
mXGreen = CInt(mXGreen / cXGreen)
mYGreen = CInt(mYGreen / cYGreen)


@storchi: Ich habe die ersten Experimente mit SCILAB gemacht. Damit kann man sicher gut Versuche anstellen. Vielen Dank noch einmal für den Hinweis auf das Tutorial.

Gruß Red Baron

super_castle
15.01.2006, 12:05
xtreme, warum machst du das videocapturebild von der cam nicht ins gleiche fenster, sieht doch besser aus, als wenn es daneben hängt. es gibt dafür schöne videobefehle in der avicap32.dll :
#WM_CAP_START = #WM_USER
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
#WM_CAP_FILE_SAVEDIB = #WM_CAP_START + 25
#WM_CAP_SET_SCALE = #WM_CAP_START + 53
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
#WM_CAP_EDIT_COPY = #WM_CAP_START + 30
#WM_CAP_GRAB_FRAME = #WM_CAP_START+60

Castle

Xtreme
15.01.2006, 14:21
Ja, dir kenn ich... verwende die auch für das Cam Fenster...
Keine Ahnung warum ich das so gemacht hab ;-)

stochri
15.01.2006, 16:50
Hallo RedBaron,
Schön, dass Du SCILAB ausprobiert hast. Es ist schon ganz gut, um mal schnell Experimente zu machen. Mittlerweile bin ich noch auf eine andere Toolbox gestossen: SIVP für Scilab. Leider hab ich die bis jetzt noch nicht zum Laufen gekriegt. Die benutzt die Open-Soruce Bildverarbeitungsroutinen OpenCV von Intel. Kennst Du diese Bibliothek ? Eine riesige Sammlung von Funktionen in C. Wenn Du also gerne weiter in C-Programmieren möchtest: dort findest Du alles, was für die Bildverarbeitung nötig ist. Allerdings kommt man natürlich vom hundersten ins tausendste. Eigentlich wollte ich nur eine Routine für eine schnelles vergrößern und Verkleinern des Bildes. Aber jetzt bin ich an der OpenCV hängen geblieben. Die Routinen sind natürlich optimiert für Intel-Prozessoren, aber auf meinem AMD lassen die sich auch kompliieren. Ich nehme mal an, dass sie dort halt langsamer laufen.

Wenn Du also genügend Zeit hast: .... OpenCV !

Gruss,
stochri

stochri
15.01.2006, 16:57
Hallo Xtreme,
hab mir mal das Bild in Deiner Galerie angeschaut. Das Fadenkreuz hat der Algrithmus ja schön in die Mitte zentriert. Bei 480ms Frame-Folge müsste sich das Objekt ja gut online verfolgen lassen. Funktioniert das einigermaßen störungsfrei ?
Die rote Farbe erscheint mir etwas blass, das war bei meinr alten Quickcam Messenger bei Kunstlicht auch so. Bei der neuen 4000 Pro ist die Farbe wesentlich besser, der Störabstand des Algorithmus schein mir deshalb auch viel besser zu sein.
Vielleicht hiflt es auch, verschiedene rote Oberflächen auszuprobieren. Es könnte sein, dass manche bei Kunstlicht besser dargestellt werden.

Gruss,
stochri

RedBaron
19.01.2006, 11:25
Hallo,

falls es interessiert, ich habe es dann doch geschaft, die WebCam mit VB.NET einzulesen. Hier das Visual-Studio-Projekt.


Gruß RedBaron

stochri
19.01.2006, 20:21
Hallo Red Baron,
schön, dass Du es geschafft hast. Ich denke mal VB.NET werden etwas mehr Leute verwenden als SCILAB. Jetzt bin ich mal gespannt, ab es bei Dir auch klappt, den roten Punkt zu erkennen. Willst Du später den ASURO dann auch per infrarot fernsteuern ? Da könntest Du ja erst mal mein primitiv-Programm verwenden, da habe ich das hex-file gleich mitgepostet. Man müsste es blos schaffen von VB.Net auf dei serielle Schnittstelle die Zahlen 1-4 zu schreiben.

Gruss,
stochri

RedBaron
19.01.2006, 22:48
Hallo storchi,

Datenübertragung ist auch noch eine Baustelle... Meine IR-Verbindung reicht max. 1m (bei gutem Wetter O:) ).

Dieses Thema werde ich als eines der nächsten angehen. Ich denke da an Funk (Funkmodul oder Blauzahn) oder ich werde der IR-Schnittstelle ein bisschen mehr Saft verschaffen. Eine TV-Fernbedienung schafft schließlich auch einige Meter bzw. einen ganzen Raum (mit Reflektionen).

Deine Aufgabe mit den verschieden Punkten ist schon interessant. Ich werde mich 'mal bei Gelegenheit damit auseinander setzen. Aber dadurch habe ich einen wichtigen Hinweis erhalten (s.u.).

Ich denke, ich werde erst einmal klein anfangen. Das Problem, die Position zu bestimmen (z.B. Ausgleich der perspektivischen Verzerrungen) und den Asuro zu steuern, sollte erst einmal reichen. Wahrscheinlich werde ich ihn dazu zunächst einfach auf eine möglichst einheitliche Fläche setzen (Rückseite einer Tapete oder so). Autonomer Marsroboter kommt nächste Woche d'ran :-b .

Ich werde aber bei der Schwerpunktberechnung (ist ja eigentlich eine Bestimmung des arithmetischen Mittels) die Standarabweichnung mit berechnen. Das wird kaum mehr Zeit kosten, sichert aber das Ergebnis ab. Wenn die Standarabweichnung zu hoch ist, wird es wahrscheinlich mindestens einen weiteren Punkt im Sichtfeld geben.

Ich werde es mit folgender Strategie versuchen:
1) Die erste Position zu erkennen, ist die schwierigste Aufgabe: Mögliche Lösungen: a) einen einheitlichen Untergrund verwenden (s.o.) oder b) die erste Position mit der Hand markieren oder c) den Asuro ein wenig fahren lassen. Wenn er das einzige Objekt ist, das sich bewegt, ist alles klar.
2) Folgepositionen kann man anhand der erwarteten Bewegung ziemlich genau vorhersagen (umso besser je häufiger die Analyse stattfindet). Wichtig ist nur, dass die geschätzte Position noch im "roten Fleck" der realen Position liegt. Danach Floodfill-Algorithmus. Aus dem, was man füllt, wieder die Position berechnen (Schwerpunkt ist schon ok). Hierbei darf der Asuro-Fleck nur nicht mit einem anderen Fleck verschmelzen.

Aber als allererstes muss ich mir entweder eine ordentliche Leuchte zulegen oder etwas anderes einfallen lassen. 100W Zimmerfunzel reicht nicht für die WebCam. Ich werde es einmal mit einem Reflektor vom Fahrrad versuchen und den von der WebCam aus beleuchten. Müsste dann eigentlich recht gut auf die Kamera zurückstrahlen.

Gruß RedBaron

stochri
20.01.2006, 17:03
Hallo Red Baron

Datenübertragung ist auch noch eine Baustelle... Meine IR-Verbindung reicht max. 1m (bei gutem Wetter Angel ).

Bist Du sicher ? Bei mir geht die Übertragung mindestens 3m. Allerdings Sende ich nur Daten vom PC zum ASURO. Wenn ich über die IR programmieren wollte, ginge es nicht so weit.
Ich verwende den USB-Tranceiver, da stimmt die Sendefrequenz vielleicht genauer als beim RS232 Transceiver. Bei 1m Abstand hat man durch den engen Sendekegel der IR-Diode ja nur die ca. 60cm Aktionsradius des ASURO ( wie weiter oben im Thread berechnet ). Ich habe mir schon überlegt, ob ich nicht 3 zusätzliche Dioden dranhänge um den Lichtkegel zu vergrößern.



Aber als allererstes muss ich mir entweder eine ordentliche Leuchte zulegen oder etwas anderes einfallen lassen. 100W Zimmerfunzel reicht nicht für die WebCam.

Was hast Du denn für eine Kamera ? Würde mich mal interessieren. Meine alte war auch etwas lichtschwach, aber die neue 4000 PRO geht erstaunlich gut bei normalem Zimmerlicht.

Gruss,
sto---chri

[az-real]
20.01.2006, 20:03
Hallo zusammen.

Ich arbeite grad an der Uni an nem Programm, welches mit einer von der Decke nach unten gerichteten CCD-Kamera ine einem bestimmten Gebiet eine Menge (bis zu 60) Mikroroboter erkennen und tracken soll. Da bin ich natürlich auf die gleiche Problematik gestossen, und meine Lösung sieht folgendermaßen aus:

Die Roboter kriegen zwei Positions-smd-LEDs aufs Dach gesetzt, die einen genügen großen Abstrahlwinkel haben, sonst verliert die Kamera sie an den Rändern des Gebiets. Diese beiden LEDs sollten möglichst verschiedene Farben haben, also z.B. rot und blau, um die Ausrichtung der Bots zu bestimmen. Mit rot und gelb hab ich allerdings z.B. schon Schwierigkeiten gehabt, weil in dem rot sehr viele gleiche Farbanteile stecken wie in dem gelb und umgekehrt. Soviel zur Theorie.

In der Realität haben wir auf die zweite LED verzichtet, und zwar - man glaubt es kaum - wegen des Energieverbrauchs. Die Roboter sind halt doch _sehr_ klein, und somit auch ihre Akkus. Aber man kann die Ausrichtung ja auch über den letzten und den aktuellen Standort bestimmen, merkt dann halt nicht wenn der Bot auf der Stelle rotiert.

Warum LEDs? Im HSV-Colorspace kann man diese eben auch bei widrigen Randbedingungen noch sehr zuverlässig aus dem Bild extrahieren. Da auf die Roboter-Arena noch ein Beamer verschiedene Sequenzen projeziert, aus denen die autonomen Bots selbst ihr Position und andere Daten bestimmen können, gibt es ständig irgendwelche Reflexionen und Helligkeitsunterschiede, die normale Farbmarkierungen ausschließen würden.

Die Bildverarbeitung sieht folgendermaßen aus:
- grabbe Frame von der Kamera
- Wandle Frame von RGB nach HSV (wie das geht ist findet sich u.a. im Bildverarbeitungs-Tutorial)
- Filter: Alles, was nicht LED ist wird weiß, die LEDs werden auch aufgearbeitet
- der eigentliche Erkennungs-Algo läuft im Prinzip durch das Bild, sucht Farbkleckse/LEDs, vergleicht mit alten Positionen und gesammelten Daten und entscheidet dann welcher Roboter wo ist.

Die Mittelpunkte der Kleckse bestimme ich einfach, indem für jeden Pixel eines Kleckses der x- und y-Wert aufaddiert werden und dann jeweils durch die Anzahl der Pixel geteilt wird. Das müsste das gleiche sein, das ihr meint.

Ich hoff das war jetzt hilfreich (auf jeden Fall lang :)
Gruß
Raphael

stochri
20.01.2006, 22:14
Warum LEDs? Im HSV-Colorspace kann man diese eben auch bei widrigen Randbedingungen noch sehr zuverlässig aus dem Bild extrahieren. Da auf die Roboter-Arena noch ein Beamer verschiedene Sequenzen projeziert

Hallo Raphael,
das mit der LED ist eine sehr schöne Lösung gerade weil ihr ja den hohen Störabstand wegen des Beamers braucht. Das könnte man sogar recht gut auf dem ASURO umsetzen, weil der ja auf der Oberseite ein paar LEDs hat.

Für mein Miniprojekt, bei dem ich meinem künstlichen Ball folgen will, muss ich es anderst machen, weil ich in den Ball keine LED einbauen möchte.

Bei Deinem Verfahren hat man natürlich auch den zusätzlichen Vorteil, dass die Fläche der LED's relativ klein sind und fast als Punkte im Bild erscheinen dürften. Bei meine etwas größeren Ball kann es Unterbrechungen im Objekt geben, deshalb ist bei mir die Tiefpassfilterung eingebaut. Mittlerweile funktioniert das sogar schon sehr zuverlässig.


Ich hoff das war jetzt hilfreich (auf jeden Fall lang Smile

Ja, ist immer ein wenig anstrengend, soviel zu schreiben, gell ? Deshalb habe ich mich jetzt mal kurz gefasst.

Beste Grüße,
stochri

[az-real]
21.01.2006, 11:02
Ich benutze übrigens auch OpenCV, da fällt mir spontan noch was dazu ein: Wenn du eh einen Ball, also ein aus jeder Perspektive rundes Objekt tracken willst, kannst du dir mal die Hough-Transformation anschauen. Is auch in openCV implementiert, cvHoughCircles oder so heißt das dann. Ist ein praktischer Algorithmus zur Enteckung von Kreisen in Grafiken...

stochri
21.01.2006, 12:39
Ich benutze übrigens auch OpenCV ...
die Hough-Transformation anschauen....
Ah, interessant, ich wusste nicht, dass es die Hough-Transformation auch für Kreise gibt.
Allerdings frißt die ja normalerweise ziemlich Rechenpower. OpenCV ist ja eigentlich für Intel-Prozesoren, ich konnte sie aber auf meinem AMD-System auch kompilieren. Ich nehme mal an, dass das Ganze dann ein wenig langsamer läuft.
Die Beispiele hat es zwar aus irgendwelchen Gründen nicht mitkompiliert, aber das werde ich auch noch irgendwann rausfinden.
Hast Du eigentlich ein Bild von Deiner Kamera ? Wenn ja und es nicht so geheim ist, könntest Du es hier ja mal posten, es ist immer schön ein paar Bilder hier zu sehen.

Bis dann,
stochri

[az-real]
21.01.2006, 12:58
Ehrlich gesagt hab ich keine Ahnung ob ich das darf, denk aber schon. Allerdings is das nicht so spannend.... einfach so ne Firewire-Kamera, die eben von oben auf eine 1,60*2m große weiße, eingegrenzte Fläche ausgerichtet ist... und dann eben noch ein Beamer. Von den Robotern gibt es bisher nur 5 oder so, die werden grad erst noch entwickelt. Ich hab eben einige Tests mit LEDs ohne Roboter durchgeführt und mir eine Simulation geschrieben, die die Bewegungen der Roboter vortäuscht und dem eigentlichen Trackingprogramm Bilder mit "LEDs" liefert...

Benutzt du OpenCV unter Win oder Linux? Probleme mit den Beispielen hatte ich bei meinem Linuxsystem auch schon, das lag aber glaub ich an den Parametern, mit denen sie von dem Skript kompiliert wurden... als ich sie nochmal von Hand kompiliert hab hats glaub bei allen geklappt.

Ist die Hough-Transf. nicht sogar ursprünglich nur für Kreise gedacht? Mich hat die Linienversion in OpenCV überrascht. Is ja egal. Ich würd mir auf jeden Fall ma die Doku dazu durchlesen... je nach dem wie schnell dein System ist merkst du auch mit AMD nicht viel von der Rechenintensität. Es handelt sich ja um einen grafischen Algorithmus (da werden ja tatsächlich ne Menge Kreise gezeichnet, ein Schwellwert gebildet und ausgewertet)... möglicherweise ist das dann gar nicht sooo systembelastend wie sämtliche Kreisberechnungen tatsächlich auszuführen... Weiß nicht ob die These haltbar ist :)

Ich nutze nen P4-Rechner (Taktfrequenz weiß ich grad nicht... sorry) mit 1 GB RAM, und dan kann man schon ne Menge grafisches Zeugs in Echtzeit machen, bis mal Verzögerungen bemerkbar sind. Is aber natürlich auch Intel.

stochri
21.01.2006, 13:15
Ehrlich gesagt hab ich keine Ahnung ob ich das darf, denk aber schon. Allerdings is das nicht so spannend.... einfach so ne Firewire-Kamera,

Ähm, ich meinte das Bild was die Kamera sieht, die kleinen Roboter mit den LED's.


Benutzt du OpenCV unter Win oder Linux?

Eigentlich benutze ich OpenCV noch gar nicht. Nur Scilab und die SIP-Toolbox. Ich wollte mir die Wiedrigkeiten der Programmiertechnik und Klassenbibliotheken ersparen.
Es gibt aber für Scilab eine Toolbox SIVP- die Teile von OpenCV einbindet.
Ich bin eigentlich erst dabei, mich in das Thema Bildverarbeitung praktisch einzuarbeiten.

[az-real]
21.01.2006, 13:42
Äh.. ok. Freud'sche Fehlleistung meinerseits könnte man das vielleicht nennen.

In diesem Post bin ich schonmal näher auf das Projekt eingegangen, da findet sich auch ein Link zu ner Seite über die Roboterchen.
https://www.roboternetz.de/phpBB2/viewtopic.php?t=14216

Da ich wie erwähnt noch nicht wirklich mit den echten Robotern arbeite kann ich auch kein interessantes Bild davon liefern.... von oben sehn die halt aus wie 2x2cm Platine mit ner LED ;) Und für mein Programm wird das nach dem ersten Filter zu einem weißen bild mit Farbklecksen, wo die LEDs sind.

stochri
08.02.2006, 18:09
Hallo Zusammen,
mittlerweile gibt es Anfragen, wie man Scilab und SIP unter windows benutzen kann. Dazu habe ich hier

https://www.roboternetz.de/phpBB2/viewtopic.php?p=156299#156299

einen Thread aufgemacht.

Gruss,
stochri

Amiwerewolf
29.11.2006, 22:10
Hallo das Visual Studio Projekt File ist super! aber kann mir das auch jemand erklären?
ich würde gern aus dem bitmap eine bilderkennung machen. mir auch Linien, .... ins bitmap einzeichen lassen. Das im Mainform versteh ich ja. aber das in capture nicht mehr! :-(

wär super, gruß Michi

rudikx
28.03.2010, 19:13
Hallo....

Ist zwar schon ganzschön alt der Beitrag, aber genau sowas suche ich.

Versuche mit delphi die erkennung von farbigen flächen zu realisieren.
Und dann die koordinaten auszugeben.
Kann mir da jemand noch weiter tips geben oder vielleicht sogar ein bespiecode für eine solche funktion geben?

vielleicht gibt es auch eine Library (nent man das so? sorry...) die soeine funktion schon drin hat und man das ganze nicht selber schreiben muss?