PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ist Java schneller als C (Realisierung von Sterevision)?



Fisch-Ei
13.06.2005, 13:15
Hi Folks!

für mein projekt werte ich kamerabilder aus. allerdings stehe ich nun nach der ausarbeitung der theorie vor der wahl, mit welcher programmiersprache die auswertung stattfinden soll. mir gab mal jemand einen tipp, dass java eine sehr schnell programmiersprache sei und die 10bilder/s somit effektiv ausgewertet werden können. ein anderer meinte wieder, dass C das bessere von allem sei.

Summa sumarum: mir ist wichtig, dass die sprache schnell und plattformunabhängig sein soll

wie sind eure erfahrungen mit den prozessgeschwindigkeiten? (basic soll wohl z.b. sehr langsam sein?!)

PS: die auswertung der kamerabilder findet auf einem laptop statt (falls sich einige wundern)

zefram
13.06.2005, 14:42
Wie immer bei hardwarenahen Problemen und Bildverarbeitung werden dir die meisten Leute C/C++ empfehlen.
Nicht zuletzt auch, weil es mit OpenCV (oder LTIlib oder Gandalf oder ...) eine Menge Bibliotheken zur Bildverarbeitung gibt und darüberhinaus etliche Bibliotheken mit effizienten Routinen zu mathematischen Problemen (LAPACK, Boost, ...)

PS: Würde mich interessieren, was du mit den Stereokameras auswertest. Kannst du dazu ein wenig schreiben?

Fisch-Ei
13.06.2005, 15:04
hm, dazu gab es hier mal einen thread, der aber irgendwie abgestürzt ist...

mittels stereovision besteht die möglichkeit, den roboter dreidimensional "sehen" zu lassen. das funktioniert genau wie mit unserem menschlichen auge...

größtes problem dabei: ich versuche seit kurzem nach erfolgreicher theorie einen algorithmus herzuleiten, der es schafft, zwei kamerabilder im 0,5s-rythmus auszuwerten!

möchtest du noch mehr dazu hören?

PS: empfiehlst du eine besondere bibliothek zur bildverarbeitung? ich bin als erstes auf opencv gestoßen und bisher auch da geblieben!

zefram
13.06.2005, 15:48
Momentan kann ich noch nix wirklich empfehlen. Ich will in den nächsten Tagen mal OpenCV und die LTIlib intensiver ansehen und vergleichen.
OpenCV ist aber sehr weit verbreitet, kann also nicht total schlecht sein.

Was soll dein Algorithmus "auswerten"? Disparity / Entfernungsinformationen für jeden Pixel im Bild?

Fisch-Ei
13.06.2005, 20:08
es geht um disparity, richtig! somit soll dem robot die möglichkeit gegeben werden, sich völlig autonom ohne zuhilfenahme andere sensorik im raum zu bewegen (der ihm völlig fremd ist).
als additum soll der robot mittels ki lernen und dinge so besser erkennen können. somit besteht die möglichkeit, dass er ein blatt papier nicht als hinderniss erkennt, sondern einfach drüber fährt. das ist dann allerdings das endstadium!

für die disparity-auswertung verwende ich mit sicherheit den LR-data-flow-algorithmus. zudem versuche ich, ihn so zu verändern, dass nicht nicht alle punkte erfasst und analysiert werden müssen, sondern der algo sich nur auf bestimmte bereiche konzentriert (eben mittels ki).

ein schwerer brocken, aber so sieht mein konzept aus, und dahin arbeite ich!

PS: ich habe mal in einer dissertation gelesen, dass mithilfe des lr-data-flow zwei kamerastreams mit einem 100mhz-chip (72fps) realisiert wurde (um auf den thread, in dem du ja sehr aktiv bist, mit den "dv-bilder auswerten" zurück zu kommen).

PSS: kennst du noch andere bessere algos für disparity? wie sehen deine erfahrungen aus?

zefram
13.06.2005, 21:45
Hallo,

hab mich bisher nicht mit den "dense stereo" Algorithmen beschäftigt, sondern eher mit "sparse stereo". Im Gegensatz zu dense stereo geht es hier nur darum, für einige wenige (30 bis 100 pro Bildpaar) ausgewählte Pixel die Entfernungsinformation zu bestimmen.
Hintergrund ist, dass der Roboter anhand der Bilder seine Eigenbewegung ermitteln soll, quasi als Unterstützung/Ergänzung der Odometrie. Dieses Gebiet nennt sich folgerichtig dann auch Visual Odometry.
In zwei Tagen ist meine Studienarbeit dazu fertig, dann kann ich ja mal einen Link darauf posten.
Beschäftigst du dich im Rahmen eines Uni-Projektes damit? Poste doch mal einen Link auf ein Paper o.ä. zu diesem LR-data-flow-Algorithmus.

13.06.2005, 23:13
Java VS C Geschwindigkeit:

Java hat sicher ein paar schöne Funktionen und evtl. den einen oder anderen Voteil, aber GESCHWINDIGKEIT GEHÖRT NICHT DAZU. Java ist generell interpretierter Code. Meiner Erfahrung nach sind Javaprogramme ab einem gewissen Umfang unglaublich langsam, z.B. die Oberfläche von Matlab.
Für schnelle Software sollte man immer noch C verwenden, sofern man nicht ASM programmieren will.

zefram
14.06.2005, 08:34
Selbst vor Assembler sollte man nicht zurückschrecken. Einige MMX Operationen sind gerade für Berechnungen im Bereich Bildverarbeitung sehr hilfreich. (Skalarprodukt, Vektoradditionen ...)

Fisch-Ei
14.06.2005, 09:23
...wenn der code allerdings nur auf dem rechner laufen soll (und nicht auf dem microcontroller), so werde ich wohl nicht noch asm mit zunehmen. wenn, dann bleibe ich bei dem von euch besagten c (werde dann sicherlich borland c++ verwenden). aber danke erstmal für eure erfahrungsberichte!

@zefram: bin noch nicht an der uni, sondern einer der glücklichen, der 13 jahre zur schule muss. aber morgen habe ich meine letzte abi-prüfung (wirtschaft mdl.), und dann kann ich mich endlich austoben. ja, und danach geht es natürlich zur uni. möchte dann mechatronik studieren und mich hauptsächlich auf stereopsis konzentrieren!
kann dir dann ab morgen mal einige links posten zu meinem vorgezogenen algo! heute habe ich nicht wirklich den nerv dazu!

PS (@zefram): soll mittels der eigenkontrolle der bewegung überprüft werden, um wieviel grad sicher robo gedreht hat, bzw. wie schnell der robo eine bestimmte strecke gefahren ist?

zefram
17.06.2005, 14:42
kann dir dann ab morgen mal einige links posten zu meinem vorgezogenen algo! heute habe ich nicht wirklich den nerv dazu!
Mach mal bitte :)


soll mittels der eigenkontrolle der bewegung überprüft werden, um wieviel grad sicher robo gedreht hat, bzw. wie schnell der robo eine bestimmte strecke gefahren ist?

Genau. Weil die Odometrie im Außenbereich sehr unzuverlässig ist und auch andere Sensorsysteme nicht unbedingt verlässliche Daten liefern, kann ein kameragestütztes Verfahren hier viel helfen. Zumindest sind die ersten Ergebnisse sehr vielversprechend und auch gerade noch in "Echtzeit" rechenbar.

Ein Link zu meiner Studienarbeit zu diesem Thema: www.tu-chemnitz.de/~niko/studienarbeit

Johannes
19.06.2005, 11:04
@Fisch-Ei
Ich hatte auch Wipo mündlich :-)

Zur Geschwindigkeit von JAVA. JAVA ist mit dem Vorurteil besetzt, dass es langsam ist. Wie schon jemand richtig erwähnt hat, wird der Code zur Laufzeit interpretiert, was die Geschichte langsamer macht als zum Beispiel bei C.
Aber dennoch ist JAVA nicht so langsam, wie viele glauben. Die Bibliotheken für Benutzeroberflächen bei JAVA (AWT, SWING) sind hingegen sehr sehr langsam. Ich habe ein Programm geschrieben, dass eine eigentlich kleine Oberfläche hat, und manchmal dauert er bestimmt 30Sekunden, bis das Ding gestartet ist. Es gibt aber bereits neuere Bibliotheken, die da einem normalen Windows-Programm in nichts nachstehen. Die Entwicklungsumgebung Eclipse für JAVA ist soweit ich weiß genau damit programmiert worden und zeichnet sich meiner Erfahrung nach nicht durch eine langsamere Geschwindigkeit aus.

Aber dennoch, für Bildverarbeitung würde ich C nehmen, da es dort auch wesentlich einfacher sein wird, auf die Kamera zuzugreifen. Allein die serielle Schnittstelle mit JAVA anzusteuern ist ein Krampf...

Gruß
Johannes

Fisch-Ei
19.06.2005, 15:59
danke erstmal für eure antworten. bin morgen wieder in der uni. dann poste ich mal so einiges zu meiner arbeit, oder lade material hoch.

PS: fahre deshalb zur uni, weil ich dort schnelleren anschluss habe, der mich nichts kostet ;)

zefram
26.06.2005, 09:30
Hallo,


bin morgen wieder in der uni. dann poste ich mal so einiges zu meiner arbeit, oder lade material hoch.

Huhu ... :)
Ich fände ein paar Infos zu deiner Arbeit immer noch interessant.

pebisoft
26.06.2005, 19:55
hallo, ich benutze für cmoscambilderauswertung visualbasic 5.0 . ist ausreichend schnell, weil visualbasic 5.0 reinen exe-code erzeugt.
mfg pebisoft

Fisch-Ei
03.07.2005, 18:01
da ich momentan in zeitpanik bin (unter anderem wegen der elektronik-enzyklopädie), möchte ich den Neugierigen erst einmal folgende Skripte geben:
http://home.arcor.de/lisa_abi05/robotik/stereovision1.pdf
http://home.arcor.de/lisa_abi05/robotik/stereovision2.pdf

meine hinzugefügten theorien werde ich im laufe der kommenden woche einmal veröffentlichen - bitte soweit um geduld! danke...

17.07.2005, 03:07
Also das Java generel langsama ist als C ist ein Vorurteil!
Es gibt sogar eine menge Situationen (weis ich von Erfahrenen Leuten die sowohl in C als auch Java Programmieren) in denen Java (durch besser optimireungen zur Laufzeit) schneller ist als C.
Und das Java-Bytecode rein intepretiert wird schlichweg falsch:
Die Java-Virtual-Machine hat seit einiger Zeit einen sogenannten Just-in-Time compiler integriert, der je nach bedarf oft aufgerufene Methoden in nativen Code compiliert (zur Laufzeit wohlgemerkt!).

Wer also meint, dass Java generel langsam sei, der sollte sich erst einmal Literatur zu den aktuellen JVM's duchrlesen und erst dann ein Statement zum Thema Java und Geschwindigkeit abgeben.

Aber nichtsdestotroz viel Erfolg mit der Bilder-Jungliererei... ;-)

luma
30.07.2005, 16:10
Hio. Also ich häng mich jetzt auch mal hier rein, weil ich Stereovision superspannend finde.

Fisch-Ei ich hab ne Frage zum 2. Link: http://home.arcor.de/lisa_abi05/robotik/stereovision2.pdf
Wo hast du das PDF her? Da findet man weiter unten im PDF-Dokument Hinweise zu irgendwelchem Java-Beispielcode, den ich liebendgern zum testen bräuchte! Hättest du vielleicht nicht noch ein paar mehr Links zu (am besten) deutschen Seiten auf denen näheres zur Sterevision erläutert wird? Sollte auch für Einsteiger verständlich sein.
Noch ne elementare Frage zur Sterevision: Wenn ich das richtig verstanden habe kann man aus einem "verschmolzenen" Bild (das mal aus zweien bestand) die Tiefen berechnen?

Fisch-Ei
30.07.2005, 19:55
im vornherein zwei dinge:
* auf deutsch gibts zu diesem thema erstauntlich wenig. da bleibt einfach nichts anderes übrig, als sich durch englisch durchzuquälen, wenn dir die sprache nicht so liegt...
* da das thema stereovision schon alleine sehr kompliziert ist, wird es schwierig, dokus zu finden, die das auf amateur-niveau erklären. jedenfalls hab ich noch keine weiteren dokus gefunden, bzw. nicht näher gesucht. mein ziel war es in der hinsicht nur den ansatz zu verstehen. den rest möchte ich selbst entwickeln und herleiten. vielleicht kann ich dir aber so einige fragen von dir erklären. ich werde definitiv einen artikel dazu in der robotik-enzyklopädie schreiben (siehe: https://www.roboternetz.de/phpBB2/viewtopic.php?t=10127)

luma
30.07.2005, 22:13
Hättest du vielleicht den Java-Beispielcode?

Fisch-Ei
31.07.2005, 13:35
nein, da ich nicht mit java arbeite (sondern mich jetzt eher auf c gestützt habe). ich werde mich aber für dich mal schlau machen. bis morgen sage ich dir bescheid...

zefram
31.07.2005, 21:19
Noch ne elementare Frage zur Sterevision: Wenn ich das richtig verstanden habe kann man aus einem "verschmolzenen" Bild (das mal aus zweien bestand) die Tiefen berechnen?

Ja. Die Tiefeninformation ergibt sich aus der sogenannten Disparity (Disparität). Gemeint ist damit der Unterschied in der horizonalen Koordinate (x-Achse) ein und des selben Weltpunktes in den beiden Bildern.
Beispiel: Eine Tischecke hat im linken Bild die Koordinaten (100,250) und im rechten Bild die Koordinaten (80,250). Die Disparität beträgt also 20 Pixel.
Sind Brennweiten der Kameras und der Abstand der Kameras voneinander bekannt, lässt sich daraus die Entfernung der Tischecke von den Kameras berechnen.
Es gilt die Formel Z=f*B/d. Dabei ist Z die Entfernung des Punktes, f die Brennweite der Kamera, B der Abstand der beiden Kameras voneinander und d die Disparität.

Johannes
31.07.2005, 23:36
Moin!
Mich würde mal interessieren, wie ihr die Sache praktisch verwendet bzw. wofür ihr die Tiefeninformationen verwendet. Erstellt ihr daraus ein 3D Bild? Und: Wie sucht ihr die beiden selben Weltpunkte in den verschiedenen Kamerabildern? Ein Weltpunkt muss wahrscheinlich aus mehreren Pixeln bestehen...

Gruß
Johannes

zefram
01.08.2005, 09:19
Moin!
Wie sucht ihr die beiden selben Weltpunkte in den verschiedenen Kamerabildern?


Zum Beispiel:

1. Finde markante Punkte in beiden Bildern. Hierfür nutzt man meist den Harris-Operator. Dieser wird (ähnlich wie ein Operator zur Kantenfindung) auf beide Bilder angewendet. Ergebnis sind zwei Mengen von Punkten (linkes Bild und rechtes Bild), die der Operator für "markant" hielt. Je nach Parametern und Bild können das mehrere hundert Punkte pro Bild sein.

2. Zuordnen der markanten Punkte zwischen linkem und rechten Bild. Jetzt muß man herausfinden, welche Punkte vom rechten Bild denen vom linken Bild entsprechen, d.h. welche ein Abbild vom selben Weltpunkt sind. Bedingt durch die Kamerageometrie gibt es hilfreiche Einschränkungen. Zum Beispiel wird sich im idealen Fall zwischen linkem und rechten Bild nur die x-Koordinate ändern, die y-Koordinate bleibt gleich (oder schwankt max. um +-1 Pixel).
Man muß also für einen gegebenen Punkt aus dem linken Bild nur die Punkte aus dem rechten betrachten, die etwa auf der selben Höhe liegen. Die endgültige Identifizierung des passenden Punktes geschieht meist mit einem auf Korrelation basierten Verfahren (Korrelation zwischen den 11x11 Nachbarschaften der in Frage kommenden Punkt-Paare).
Man wird nicht jedem Punkt einen Partner aus dem anderen Bild zuordnen können. Meist klappt das nur für etwa 50-75% der Punkte.

3. Ausrechnen der Entfernungen. Man hat jetzt also für viele der vom Harris Operator gefundenen markanten Punkte die Koordinaten im linken und rechten Bild. Damit kann mal wie im Posting oben beschrieben, die Entfernung ausrechnen.

4. Anwendung: Gelingt es, die markanten Punkte nicht nur zwischen dem linken und rechtem Bild zuzuordnen, sondern auch zwischen zwei Bildernpaaren zwischen denen sich die Kamera bewegt hat, kann man die Bewegung der Kamera errechnen. Man kennt ja die 3D-Koordinaten einiger Punkte vor und nach der Bewegung.

5. Weitere Anwendung: Erstellen einer 3D-Karte, Identifizieren von Objekten, ...

6. Das hier beschriebene Verfahren nennt sich "sparse stereo", da nur für einige Pixel die Tiefeninformationen zur Verfügung gestellt werden. Bei "dense stereo" Algorithmen sind für (im Idealfall) jeden Pixel die Tiefeninformationen verfügbar. Vielleicht kann Fisch-Ei ja was zu den dense stereo Algorithmen sagen.

Siehe auch http://www-user.tu-chemnitz.de/~niko/studienarbeit/node5.html

luma
15.08.2005, 18:08
Hast wohl nichts mehr gefunden... Gibt's da nicht irgendwelche Bücher? Und dann noch ne Frage: Würden 2 GB-Cams ausreichen, Stereovision einfach zu realisieren?

zefram
15.08.2005, 20:02
Nichts mehr gefunden? Sollte ich was suchen?

Was meinst du mit 2 GB Cams? Gigabyte? 2 Megapixel?
Also die Kamera die ich habe, hat eine Auflösung von 640x480. Mehr braucht man nicht, mehr kann man auch garnicht ausreichend schnell verarbeiten. 320x240 reicht auch.

Bücher gibts auch, aber meist englisch und teuer.
Zum Beispiel: http://www.amazon.de/exec/obidos/ASIN/0521540518/qid=1124132687/sr=8-1/ref=sr_8_xs_ap_i1_xgl/028-7634357-8407753

luma
07.09.2005, 19:01
Hio Zefram.



Nichts mehr gefunden? Sollte ich was suchen?

Fish-Ei hat doch gesagt er sucht mal. Bisher hat er aber nichts mehr gepostet...



Was meinst du mit 2 GB Cams? Gigabyte? 2 Megapixel?

Ich mein mit GB Cam eine GameBoy-Kamera mit ner Auflösung von 128 x 128 Pixel. Allerdings keine Farbe sondern Graustufen.



Bücher gibts auch, aber meist englisch und teuer.
Zum Beispiel: http://www.amazon.de/exec/obidos/ASIN/0521540518/qid=1124132687/sr=8-1/ref=sr_8_xs_ap_i1_xgl/028-7634357-8407753

Gibts da vielleicht auch was in Deutsch?

Gruß
Lutz