Archiv verlassen und diese Seite im Standarddesign anzeigen : Scilab Bildverarbeitung unter windows
Hallo Zusammen,
vor einiger Zeit habe ich einen kleinen Thread gestartet, wie man einen Asuro per USB Kamera und Scilab und Linux steuert:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=15762
der Sourcecode befindet sich hier: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=15537
Möchte jemand das ganze Projekt unter Windows verwenden und vielleicht schon einmal jemand Scilab und die Bildverarbeitungstoolbox unter Windows benutzt ?
Gruss,
stochri
Hier eine Mail von Mike, der das ganze unter windows benutzen möchte
Hallo Stochri,
ich habe vor zwei Tagen Ihre Threads zur Steuerung von Asuro mittels Webcam gelesen. Ich selber interssiere mich auch sehr für dieses Thema.
Leider kann ich nur minimal in C++ programmieren. Da ich bis jetzt viel Stress in der Schule hatte und mich nicht näher mit C beschäftigen konnte. Ich habe mir Scilab 3.1.1 runter geladen. Weiß nun aber überhaupt nicht was damit machen soll. (ich weiß das klingt blöd Anxious )
Ich habe schon Ihr Programm auf Asuro geflasht. Das geht wunderbar wenn ich die Zahlen per Hand eingebe. Sip habe ich mir auch schon runtergeladen. Aber das sind nur Ordner mit vielen Dateien. Muss ich die irgendwohin entpacken oder mit Scilab verbinden???
Denn bis jetzt ist es mir noch nicht gelungen irgendwie ein Bild zu bearbeiten.
Mir würde ja für den Anfang schon reichen wenn ich Asuro mit Scilab fernsteuern kann. Also zum Beispiel mit Asuro_vor. Sie sagten dazu müsse man scipfiles erzeugen. Aber was sind eigentlich scipfiles und wie erzeugt man sie????
Ich weiß das sind viele Fragen auf einmal aber vielleicht können sie mir ja helfen denn ich komme überhaupt nicht klar:-(
Vielleicht ist es auch besser ich kaufe mir erstmal ein Buch über die Programmiersprache C, denn dann hätte ich bestimmt mehr Grundkenntnisse.
Hier noch mein Setup:
Notebook mit 1,5 ghz
und Windows XP
USB Schnittstelle für Asuro
eine Webcam kaufe ich mir noch erstmal will ich aber sehen ob ich das überhaupt auf die Reihe bekomme.
vielen danke schonmal im Voraus.
MfG Mike
Nachtrag:
Viele der folgenden Fragen beziehen sich auf eine veraltete Version von Scilab und SIP
Die aktuellen Versionen, bei denen keine Probleme auftreten sind
Scilab 4.0
SIP 0.4.0
Snapshot-Programm:
www.i-do-more.de/mine-robo/download/VideoCapture.zip
Hallo Mike,
zuerst musst Du das SIP-Verezichnis irgendwo erstellen. Die Toolbox kannst Du installieren, wenn Du Scilab startest und
exec <PATH>\builder.sce
eintipst. Wobei <PATH> der Pfad ist, wo du das SIP-Verzeichnis hinkopiert hast.
Die Installationsanleitung findet sich übrigens bei SIP im verzeichnis unter INSTALL.txt. Kannst Du Englisch ?
Gruss,
stochri
Hallo Stochri,
naja English kann ich so halbwegs. Hab aber ein Übersetzungsprogramm für den Pc. Werde das jetzt mal ausprobieren mit dem Sip-Verzeichnis.
Und nochmal vielen Dank!!!
Hallo Mike,
wenn Du weitere Fragen hast, einfach hier posten.
Gruss,
stochri
Hallo,
ich kriegs immer noch nicht hin.
Ich habe das Sip-Verzeichnis nach Eigene Dateien kopiert. Dann bei Scilab
exec <C:\Dokumente und Einstellungen\Mike1\Eigene Dateien\sip-0.1.1-win5>\builder.sce
eingegeben. Und es kommt immer
!--error 42
incompatible RHS
Was heißt das nun? In der Install Anleitung steht
1) ImageMagick library
First you will have to download install the ImageMagick
library version 5.4.3 for windows 2000/NT.
This is necesary for dealing with various image file formats.
I- Get ImageMagick.
go to:
ftp://ftp.nluug.nl/pub/ImageMagick/binaries
and get the newest package. Its name is something like this:
"ImageMagick-win2k.zip". This "win2k" package works
for w1ndows 95 up to XP.
II- Install ImageMagick.
Just unzip the file into any directory, say "c:\Program Files"
Also wenn ich das richtig verstanden habe muss ich noch dieses win2k downloaden. Das habe ich auch gemacht aber weiß nun schon wieder nicht weiter. Oder liegt der Fehler wo anders????
MfG Mike
Achja eh ichs vergesse,
hab mir heute noch ne Webcam gekauft. Muss jetzt nur noch den Rest irgendwie hinbekommen. :lol:
Und nochmal vielen Dank für deine Hilfe Stochri
Hast Du die SIP-library von http://siptoolbox.sourceforge.net/ heruntergeladen ?
Da steht:
(SIP 0.1.1 binary) -- Scilab v. <= 2.7 only!
also auf deutsch: Sip 0.1.1 passt nur zu Scilab 2.7 oder gibt es eine neuere Version von SiP ?
Gruss,
stochri
Ja da könnte der Fehler liegen. Ich habe zwar Sip 0.1.1 binary runtergeladen aber nicht Scilab 2.7 sondern die neuere Version 3.1.1. Also bin ich gerade beim laden von Scilab 2.7. Hoffentlich passt das dann!
Denn eine neuere Version Sip hab ich noch nicht entdeckt.
Mfg Mike
Gut ich habe es jetzt hinbekommen. Allerdings musste ich auch ImageMagick für die Installation verwenden. Nur musst du mir jetzt sagen wie es weiter geht. :lol:
Hallo Mike,
als nächste kannst Du versuchen, ein vorher abgespeichertes Bild mit
x=imread('bildname.jpeg');
einzulesen
und dann mit
imshow(x)
darzustellen.
Geht das ?
Gruss,
stochri
Hallo stochri,
Ich habe es eben eine ganze Weile lang versucht. Also als erstes muss ich ja diese loader.sce Datei laden. Die ziehe ich einfach immer rüber auf Scilab. Dann habe ich X=imread('den Bild Namen mit genauem Pfad.jpeg'); eingegeben. Das hat auch geklappt. Dann zeigt es Größe des Bildes an und ein Haufen Zahlen. Steht da jede Zahl für einen Bildpunkt? Jedenfalls muss ich y or n für weiter oder nicht. Beim ersten Versuch habe ich y gedrückt und das ging ewig weiter beim zweiten Mal habe ich n gedrückt. Anschließend habe ich imshow(x) eingegeben. Und dann kommt ne lange Fehlermeldung. Irgendwas mit dem Speicher wenn ich das richtig sehe. Naja hier ist das ganze mal:
Startup execution:
loading initial environment
-->gl_name='C:\Dokumente und Einstellungen\Mike1\Eigene Dateien\sip-0.1.1-win5\loader.sce';exec('SCI/util/GLoad.sce');
k =
! 58. 60. 74. !
-->mode(-1);
Warning :redefining function: help
SIP - Scilab Image Processing Toolbox loaded
Enter "sipdemo()" for a demonstration
shared archive loaded
-->x=imread('C:\Dokumente und Einstellungen\Mike1\Eigene Dateien\2222.jpg')
Size: 288 rows X 352 columns
Truecolor Image
x =
(:,:,1)
column 1 to 8
! 130. 132. 132. 131. 128. 126. 126. 128. !
! 133. 131. 124. 117. 113. 113. 116. 120. !
! 138. 135. 129. 123. 121. 120. 123. 126. !
! 132. 131. 132. 134. 134. 133. 131. 131. !
! 129. 127. 126. 127. 126. 125. 123. 121. !
! 146. 138. 127. 120. 117. 118. 118. 119. !
! 152. 142. 129. 121. 121. 121. 124. 124. !
! 133. 126. 119. 119. 122. 124. 125. 124. !
! 134. 139. 144. 146. 135. 122. 120. 125. !
! 142. 138. 131. 125. 117. 113. 120. 131. !
! 141. 137. 132. 130. 126. 120. 120. 126. !
! 141. 136. 132. 136. 133. 127. 122. 122. !
! 144. 134. 123. 122. 121. 120. 121. 124. !
! 137. 130. 124. 126. 123. 120. 118. 119. !
! 132. 130. 129. 134. 130. 123. 118. 118. !
! 139. 131. 122. 120. 117. 116. 123. 132. !
! 141. 137. 131. 123. 122. 123. 123. 123. !
! 126. 125. 124. 123. 125. 127. 127. 125. !
[More (y or n ) ?]
-->imshow(x)
This will take a while. !--error 17
stack size exceeded! (Use stacksize function to increase it)
Memory used for variables : 730935
Intermediate memory needed: 304160
Total memory available : 1000001
at line 5 of function %hm_e called by :
line 79 of function imshow called by :
imshow(x)
Wenn du weißt was ich nun schon wieder falsch gemacht habe bitte sags mir :lol:
MfG Mike
Hab eben mal eins von deinen Bildern versucht, da kommt nur
Size: 240 rows X 320 columns
Truecolor Image
also nicht noch die ganzen Zahlen. Jedoch kommt bei Imshow(x) wieder die gleiche Meldung (This will take a while.......)
Hi,
vergiss was oben steht. Jetzt geht es gar nicht mehr :cry:
Bis imread geht alles wunderbar. Und so wie ich dann imshow(x) eingebe kommt von Windows eine Fehlermeldung das das Programm geschlossen werden muss. Ich habe noch mal alles deinstalliert und wieder installiert. Geht trotzdem nicht :x
Vielleicht hast du ja noch ne Idee aber ich denke das ganze läuft unter Linux besser als unter Windows.
MfG Mike
Hallo Mike
ch habe es eben eine ganze Weile lang versucht. Also als erstes muss ich ja diese loader.sce Datei laden. Die ziehe ich einfach immer rüber auf Scilab. Dann habe ich X=imread('den Bild Namen mit genauem Pfad.jpeg'); eingegeben. Das hat auch geklappt. Dann zeigt es Größe des Bildes an und ein Haufen Zahlen.
Die Zahlen werden nur angezeigt, wenn man das Semikolon hinter einem Kommando vergißt.
Beispiel:
x=1+2
und
x=1+2;
( probiere es mal aus )
Steht da jede Zahl für einen Bildpunkt?
Genau, die Zahlen stehen für die Helligkeit der Bildpunkte.
SIP - Scilab Image Processing Toolbox loaded
Enter "sipdemo()" for a demonstration
kleiner Tipp: wenn du sipdemo() eintippst müste ein Demoprogramm ablaufen
-->imshow(x)
This will take a while. !--error 17
stack size exceeded! (Use stacksize function to increase it)
bei mir hilft
stacksize(15000000);
Sonst ist auch unter linux der Speicher zu klein.
Ich benutze ein kleines Scriptfile, damit ich nicht jedesmal den loader und stacksize eingeben muss. Das scrptfile rufe ich einfach nach dem starten von scilab mit
exec scriptfilename
auf. ( Dateierweiterung nicht vergessen )
Hier mein scriptfile
cd scifiles
exec /home/xx/Linux_Programme/scilab/sip-0.4.0-bin/loader.sce
stacksize(15000000);
dir
Soweit erst mal,
stochri
Danke,
jetzt funktioniert es, allerdings ist das Bild was geladen wird schwarz.
Wie erstellt man denn dieses Scriptfile? Gebe ich das einfach ein?
Das Scrpfile kannst Du einfach mit irgendeinem Texteditor z.B. notepad erstellen.
Das Bild ist schwarz ? Kannst Du es malhier ins Roboternetz posten, dann probiere ich es mal bei mir.
Es ist dein Bild.(AsuroBallTor) Komischer Weise kann ich nur das Bild hochladen. Alle anderen gehen nicht. Da kommt die Meldung unable open file oder so ähnlich.
Du drückst hier auf der Seite den Knopf "antwort erstellen" unter dem Eingabefenster für die Antwort gibt es den Knopf attachment hinzufügen. Es ist gut, wenn das Bild weniger als 400 Spalten hat, dann wird es gleich anzeigt.
Ja hab es schon selbst rausbekommen
Ähm, ich meinte, Du könntest eines von Deinen Bildern posten, mein eigenes habe ich ja schon ...
Und ist es bei dir auch schwarz? Bestimmt nicht.
Wie gehts jetzt weiter?
kleiner Tipp: wenn du sipdemo() eintippst müste ein Demoprogramm ablaufen
schau mal, ob die Demoprogramme gehen und ob Bilder angezeigt werden.
Achso hab mal schnell eins gemacht:
Ja es kommt ein Bild bzw Bilder.
Bei mir geht es mit Deinem Bild
x=imread('asuro_933.jpg');
imshow(x);
es muss sich natürlich im selben Verzeichnis befinden.
mit
dir
kannst Du sehen, welche Dateien sich im Verzeichnis befinden.
Heut muss ich Schluss machen, bis demnächst,
stochri
Hi,
ich kann jetzt jedes Bild hochladen. Allerdings sind anschließend alle schwarz. Ist das nur eine Einstellungsfrage? Wenn wie stelle ich das so ein das ich es sehe??
MfG Mike
Vielleicht funktiniert bei Deiner Version die Helligkeitanpassung eines Bildes noch nicht.
Versuch:
1.Bild laden: x=imread('bild.jpeg');
2. maximale Helligkeit ermitteln: max(x) ==> bei mir kommt '1'
3. Bild anzeigen imshow(x); ('bei Dir schwarz')
4. Fenster wieder zu machen
5. Versuchen Bild heller darzustellen imshow(x*100); ( oder andere Zahlen probieren
6. Geht's ?
Danke danke danke!!!!!!
Bei mir war der Wert max(x)=250.
Ich habe dann mal 400 eingegeben da hat sich das Programm geschlossen. Hab dann mal mit 100 getestet und den Idealwert 230 ermittelt. Geht super!
Wie gehts nun weiter?
Jetzt kommt bestimmt der schwierige Teil. Aber scheinbar läuft das Programm doch gut unter Windows. O:)
MfG Mike
Jetzt werden wir versuchen, den ASURO zuerst von windows und dann von Scilab aus zu steuern.
1. Hyperterminal öffen und den ASURO kurz damit steuern ( mit den Tasten 1,2,3,4
das Steuern mit Hyperterminal ist wichig, damit die Schnittstelle richtig eingestellt wird.
2. DOS-Komandozeile aufrufen und testen, ob sich der ASURO mit dem Kommando
echo 1 > com3
( an com3 hängt bei mir der Infrarot Adapter )
3. die vier asuro_rechts,asuro_links, asuro_vor, asuro_rueck durch vier Dos-Batch files mit den dem Inhalt
echo 1 > com3
... usw
ersetzen
4. scilab aufrufen und testen ob die Batch files funktinieren
z.B.
unix asuro_vor;
5. geht's ?
Also bis Schritt 2 geht alles super.
Aber Drittens versteh ich nicht so ganz.(nimms mir nicht übel steh manchmal auf der langen Leitung) Soll ich die files mit Notepad öffnen und dann echo 1> com4 eingeben.(bei mir ist es com4)
Und wenn ich bei sciblab ein file testen will brauch ich da nur z.b. unix asuro_vor; eingeben oder auch wieder den genauen Pfad des Files?
Heut muss ich Schluss machen.
Aber morgen gehts weiter.
:mrgreen:
MfG Mike
Aber Drittens versteh ich nicht so ganz.(nimms mir nicht übel steh manchmal auf der langen Leitung) Soll ich die files mit Notepad öffnen und dann echo 1> com4 eingeben.(bei mir ist es com4)
Kennst Du ein paar DOS-Kommandos ?
Wenn du bei Windows auf Start->Ausführen und dann cmd eingeben. Dann bis Du in der DOS-Oberfläche.
Mit dem Befehl
dir
( directory=verzeichnisanzigen)
kannst Du die Dateien im aktuellen Verzeichnis sehen. Wenn im aktuellen Verzeichnis das batch-File steht, welches ich hier poste
Filename: asuro_vor.bat
Inhalt: echo 1>com4
kannst Du es aufrufen:
asuro_vor
jetzt muss sich der Roboter bewegen ( und nicht vergessen, beim Computerneustart erst einmal Hyperterminal benutzen )
Und wenn ich bei sciblab ein file testen will brauch ich da nur z.b. unix asuro_vor; eingeben oder auch wieder den genauen Pfad des Files?
in scilab gibt es den Befehl
dir
auch.
Er zeigt Dir die Dateien im aktuellen Verzeichnis.
Um Batch-Files im aktuellen Verzeichnis auszuführen, musst Du allerdings das Kommando "unix" vorne dran setzen. Das ist etwas irritiieren, weil Du ja windows und nicht Unix benutzt. Scilab kommt aber von der Unix-Seite und dort wird der Befehl eben benutzt um Betriebssystembefehle aufzurufen. Aus Faulheit hat man wohl den Namen "unix" für das Kommando auch in der Windowsversion beibehalten.
Du kannst also das Batchfile genau wie vorher in der DOS-Kommandozeile mit
unix asuro_vor;
aufrufen. ( So stehts zummindest im Help von Scilab ).
Gruss,
stochri
Danke!!!
Und schon hab ich wieder was dazu gelernt. Aber dir funktioniert bei scilab nicht.
Der Rest geht aber wunderbar. Habe jetzt alle batch file erstellt.(also asuro_vor, links, rechts, rueck)
Und kann ihn ohne Pobleme von Scilab aus steuern.
MfG Mike
Sehr schön,
dann kannst Du folgendes probieren: Bei den Funktionen die ich geschrieben habe befinden sich
turn.sci
und
go.sci
( Du kannst sie Dir mal mit einem Texteditor anschauen )
Die Funktionen kannst Du folgendermassen in scilab laden:
exec turn.sci
exec go.sci
danach kennt scilab die beiden Funktionen. ( am besten du trägst das laden der beiden Funktionen in Deine Initialisierungs-Batch-Datei ein, sonst musst du jedesmal beim Neustart von scilab die Funktionen wieder laden )
Jetzt kannst Du die Funktionen ausprobieren
go(10);
( Roboter fährt vorwärts )
turn(-180)
( Roboter dreht um -180° )
Hi,
das geht wunderbar. Ich musste die files nur leicht abändern. Statt unix .\asuro_vor; habe ich nur unix asuro_vor.
Wie gehts weiter?
Als kleine Übung könntest Du mal versuchen, ein kleines Scriptfile zu erstellen, welches turn und go so aufruft, dass der Asuro ein Rechteck abfährt.
Und als zweites ein Scriptfile, mit dem der Asuro ein Nikolaushaus abfährt.
Hi,
hab das eben mal gemacht haut aber noch nicht so hin. Die gefahrene Strecke ist ziehmlich schief. Jedenfalls habe ich das Prinzip verstanden. Hab mal versucht das file zu posten geht aber nicht.
Wie gehts weiter???
MfG Mike
Hallo Mike,
schau dir doch mal das File auropos.sci an, ob Du den Inhalt verstehst.
Mit folgendem Codauschnitt kannst Du aus einem Bild die roten Farbanteile in ein scharz/weis Bild umwandeln
x=imread('bild.jpg');
hsv=rgb2hsv(x);
hsv(:,:,3)=1;
r=hsv2rgb(hsv);
red=[1 0 0];
ref=red;
colorerror=sqrt( (r(:,:,1)-ref(1)).^2 + (r(:,:,2)-ref(2)).^2 + (r(:,:,3)-ref(3)).^2)/sqrt(2);
bw=im2bw(colorerror,0.3);
xbasc
imshow(bw);
Probiere das doch mal mit meinem urspünglichen Bild aus und dann mit ein paar Bildern von Deiner Kamera.
Gruss stochri
Hab mal versucht das file zu posten geht aber nicht.
P.s. Manche File-Endungen kann man nicht posten. Wenn Du diese Files posten willst, musst Du sie erst als Zip-File verpacken.
Hallo Stochrie,
1. Ich hab mir das file angeschaut. Und verstehe es so halbwegs. Also der erste Teil bestimmt von wo das Bild geladen werden soll.(in dem Fall von der Webcam)
2. Der Code Auschnitt funktioniert nicht. Scilab kennt "rgb2hsv" nicht. Ich habe mal im Ordner von Sip nachgesehen und da gibt es nur ein file "rgbntsc". Ich habe dann im Codeauschnitt rgb2hsv durch rgb2ntsc ersetzt. Und in der letzten Zeile imshow(bw*230) eingetragen wegen der Helligkeit. Das geht, jedoch ist das Bild kommplett grau. Nur die Räder von Asuro sind schwarz. Das liegt bestimmt am falschen file. Kannst du mir nicht das rgb2hsv file posten und ich füge es im sip Ordner ein???
MfG Mike
Hallo Mike,
Scilab kennt "rgb2hsv" nicht.
rgb to hsv habe ich dazu benutzt, die Heilligkeit der einzelnen Pixel maximal zu machen und gleichzeitig aber die Farbe konstant zu lassen.
Was hsv bedeutet, kannst, findest Du hier:
https://www.roboternetz.de/wissen/index.php/Bildverarbeitung_Tutorial
Für's erste können wir versuchen, die Helligkeitsanpassung wegzulassen.
1. Bild laden
x=imread('bild.jpeg');
2. rote Farbebene aus Bild herausholen
rot=x(:,:,1);
3. Probelweise anschauen
imshow(rot);
4. Maximum von Rot ermitteln
max(rot)
ist es 1?
5. Rotwerte in ein Pixelbild über einen Schwellwert umwandeln:
pixelbild=im2bw(rot,0.99)
6. Bild anschauen ( es sollten nur die Rotanteile als weise Punkte erscheinen )
imshow(pixelbild).
7. Du könntest mal eins Deiner Versuchbilder posten
8. geht's ?
Gruss,
stochri
Hallo Stochrie,
ich habe zur Zeit wenig Zeit. Mir gehts auch nicht so gut (Kopfschmerzen). Probiere es aber am Samstag gleich aus. Poste dann auch eins meiner Versuchsbilder.
Danke für deine Hilfe.
MfG Mike
Gute Besserung !!
Bis dann, wenn's Dir wieder besser geht.
Gruss,
stochrie
Hallo Stochrie,
ich das jetzt mal probiert. Ich habe ein File mit folgendem Inhalt erstellt:
x=imread('C:\Dokumente und Einstellungen\Mike1\Eigene Dateien\Asuro Programme\scifiles\pictures\AsuroBallTor.jpeg');
rot=x(:,:,1);
imshow(rot);
max(rot);
pixelbild=im2bw(rot,0.99);
imshow(pixelbild*230)
Ich muss aber trotzdem noch bei pixelbild *230 eingeben sonst ist das Bild schwarz.
Du sagtes ich soll den max Rotwert ermitteln. Soll ich da bei max(rot); nach rot eine Zahl eingeben z.B. max(rot,1); ?
Es funktioniert zwar aber nur mit deinem Bild AsuroBallTor, wenn ich ein anderes Bild mit rot nehme dann ist es meißt komplett schwarz, also die Rotanteile werden nicht dargestellt.
Und noch ein Problem. Wie kann ich bei Scilab ein dargestelltes Bild speichern. Wenn ich auf File gehe und dann auf save speichert es nur ein File und nicht das Bild. Ich habe jetzt das Bild mit der Webcam vom Bildschirm abfotografiert. Hoffe du erkennst was. Also hier wird auch nur das rote Ding links dargestellt aber nicht Asuro aber der ist doch auch rot.
MfG Mike
Hier noch mal das Original
Hallo Stochrie,
so halbswegs haut es jetzt hin. Ich muss bei anderen Bildern nur den Schwellwert anpassen. Nur mit max(rot) das verstehe ich nicht.
Wie gehts weiter?
Gruss,
Mike
Hallo Stochrie,
ich will mich ja nicht aufdrängeln und dich nerven aber du müsstest mir schon helfen wie es weiter geht. Ohne deine Hilfe kriege ich das nicht hin. :cry:
MfG Mike
Hallo Stochrie,
ich will mich ja nicht aufdrängeln und dich nerven aber du müsstest mir schon helfen wie es weiter geht. Ohne deine Hilfe kriege ich das nicht hin.
Upps, ich habe gar nicht bemerkt, dass Du wieder geposted hast. Irgendwie ging meine Mailbenachrichtigung nicht mehr.
Nur mit max(rot) das verstehe ich nicht.
Das max(rot) war nicht zum Einbau in die Routine gedacht. Es soll nur dazu dienen, den maximalen Rotwert im Bild zu ermitteln, um danach den Schwellwert einstellen zu können.
Folgendes Codebeispiel entspricht fast der asuropos.sci Funktion. Ich habe die rgb2hsv Funktion weggelassen und einfach eine Helliigkeitsnormierung eingebaut:
betrag=sqrt(x(:,:,1).*x(:,:,1)+x(:,:,2).*x(:,:,2)+ x(:,:,3).*x(:,:,3))+1;
red=x(:,:,1)./betrag;
x=imread('webcam.jpeg');
betrag=sqrt(x(:,:,1).*x(:,:,1)+x(:,:,2).*x(:,:,2)+ x(:,:,3).*x(:,:,3))+1;
red=x(:,:,1)./betrag;
bw=im2bw(red,0.90);
xset('window',2);
xbasc
imshow(bw);
[ycp xcp]=centroid(bw)
x=drawcross(x,xcp,ycp);
xset('window',3);
xbasc
imshow(x);
Die Funktion zeichnet ein blaues Kreuz auf ein gefundenes rotes Objekt. Probiere mal, ob es bei Dir funktioniert.
P.S.:Kannst Du mit Vektoren rechnen ?
Gruss,
stochri
P.s.: mir ist gerade aufgefallen, dass Du Deinen Monitor abfotografiert hast. Normlerweise kann man bei windows mit "strg-druck" eine Graphik in die Zwischenablage kopieren. Danach öffnet man paintbrush und "strg-v" ( einfügen ). Dort kannst Du das Bild berarbeiten und dann abspeichern.
Hallo Stochri,
hab das gerade ausprobiert aber es geht mal wieder nicht. Bei Scilab kommt die Meldung :"undefined variable : centroid"
Das verstehe ich aber nicht. Bei dir gehts doch auch. Hast du vielleicht eine andere Sipversion?
MfG Mike
P.S.: Nein ich kann leider nicht mit Vektoren rechnen :wink:
centroid
ist eine Funktion in meiner library zur Bestimmung eines Flächenschwerpunktes. Du musst sie mit
exec centroid.sci
laden.
Achso,
ich habe jetzt exec centroid.sci gleich in mein Startfile intigriert. Beim erneuten Versuch kam dann die Meldung das drawcross nicht bekannt ist. Das ist ja auch in deiner Lib. Also hab ich es auch in mein Startfile rein getan. Nun kommt die Meldung:
undefined variable : mogrify
Also ich hab dann mal nachgesehen und das Wort kommt im dem drawcross file vor. Was nun???
MfG Mike
Ok, in Deiner Version von SIP gibt es kein mogrify.
Deshalb habe ich Dir eine neue Version von drwacross ohne mogrify gemacht:
function pic_out=drawcross(pic,x,y)
//
// draw a cross in a picture
//
//
// v1.1 21.2.2006 stochri
//
//
// Verion History
//
// v1.0 using mogrify
// v1.1 without using mogrify
a=4;
b=30;
rectangle=ones(b,a);
y1=y-b/2;
x1=x-a/2;
//pic_out=pic;
pic(y1:y1+b-1,x1:x1+a-1,1)=rectangle-1;
pic(y1:y1+b-1,x1:x1+a-1,2)=rectangle-1;
pic(y1:y1+b-1,x1:x1+a-1,3)=rectangle;
a=30;
b=4;
rectangle=ones(b,a);
y1=y-b/2;
x1=x-a/2;
pic(y1:y1+b-1,x1:x1+a-1,1)=rectangle-1;
pic(y1:y1+b-1,x1:x1+a-1,2)=rectangle-1;
pic(y1:y1+b-1,x1:x1+a-1,3)=rectangle;
pic_out=pic;
endfunction
//
// -------------------------------------------------------------------------
// This file ist made for scilab the free mathematical toolbox
//
// Copyright (C) 2005 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
// -------------------------------------------------------------------------
//
Hi,
ich habe jetzt das alte drawcrossfile mit dem neuen Inhalt ersetzt. Dann habe ich das wieder ausprobiert und es kommt wieder eine Fehlermeldung;
Size: 240 rows X 320 columns
Truecolor Image
xbasc =
[]=xbasc(win_num)
xcp =
0.
ycp =
0.
!--error 21
invalid index
at line 80 of function %s_i_hm called by :
line 23 of function drawcross called by :
x=drawcross(x,xcp,ycp);
line 14 of exec file called by :
suro Programme\scifiles\Testfile');disp('exec done')
Also bis draw.. geht alles super. Aber das Bild was geladen wird ist immer noch schwarz.
Ist mir richtig peinlich das ich dir so viel Arbeit mache.
MfG Mike
Ok,
Du kannst folgende probieren:
x=imread('test.jpeg');
y=drawcross(x,100,100);
imshow(y);
Die Funktion drawcross zeichnet eigentlich nur ein blaues Kreuz, im obigen Beispiel an die Stelle 100,100.
xbasc ist eigentlich nur zum Bildschrimlöschen gedacht. Also wen xbasc nicht geht, einfach weglassen.
Überprüfe mal die Koordinaten, welche die Flächenberechnungsfunktion ausgibt. Ich vremute, dass bei dem Bild was Du verwendet hast, irgendwie falsche Koordinaten rauskommen.
Hast Du die Funktion von centroid verstanden ?
Gruss,
stochri
Hi,
nein die Funktion habe ich nicht verstanden. Aber wenn ich bei drawcross anstatt (x,ycp,xcp) (x,100,100) oder halt andere Koordinaten, eingebe geht das file. Also dann wird das Kreuz gezeichnet. Also denke ich der Fehler liegt bei der centroid Funktion. Denn Koordinaten gibt die Flächenberechnungsfunktion auch nicht aus. Oder ich weiß nicht wo die ausgegeben werden. Bei scilab steht immer nur:
xcp =
0.
ycp =
0.
MfG Mike
Die centroid-Funktion berechnet, wie oben schon erwähnt, den Schwerpunkt der weisen Pixel in einem Schwarzweisbild.
Wenn die Fuktion x und y =0 zurückliefert, sind vermutlich keine weisen Pixel in Deinem Schwarz-Weisbild.
Das Schwarz-Weisbild des Monitorphotos, welches Du geposted hast, müsste eigentlich gut mit der centroid Funktion funktionieren.
Du kannst die centroid Funktion mit dem Bild ausprobieren:
[x y]=centroid(deinschwarzweisbild);
Hallo Stochri,
Ich habe es jetzt hingekriegt. Es lag an der Helligkeitsanpassung die ging nähmlich nicht.(hab sie einfach weggelassen)Mein file sieht jetzt so aus:
x=imread('Bild');
red=x(:,:,1);
bw=im2bw(red,0.79);
xset('window',2);
xbasc
imshow(bw*240);
[ycp xcp]=centroid(bw)
x=drawcross(x,ycp,xcp);
xset('window',3);
imshow(x*230);
und so sieht es dann aus wenn der Stift gefunden ist:
MfG Mike :mrgreen:
Super ! Ich bin begeistert ! O:)
Vielleicht kannst Du mal eine rote Fläche auf den ASURO kleben und ausprobieren, ob er an verschiedenen Positionen und unter verschiedenen Beleuchtungsbedingungen korrekt erkannt wird.
--------------------------------------------------------------------------------------------------------------------------------------------------
( warum geht bei mir im post das Smili mit dem Klatschen =D> nicht? weiss das jemand ? )
Hallo Stochri,
ich hab jetzt mal ein bisschen getestet. Also so auf der Hälfte der Bilder wird er erkannt auf der anderen nicht. Hier mal ein paar Bilder:
Hier noch das Bild von dem Schwarzweiß Bild. Da liegt er mächtig daneben #-o
Aber die Rotpunkte wurden doch gut erkannt und in weiß dargestellt :-k
Das letzte Bild sieht ein wenig so aus, als wenn x und y vertauscht sind. Das könnte mein Fehler sein, vielleicht habe ich einfacht x und y bei der centroid oder der drawcorss Funtion vertauscht.
Ich muss gestehen, dass ich da immer ein wenig durcheinander komme.
Die Bild Matirzen sind immer in bild(zeile,spalte) angeordnet.
Wenn man die Kooerdinalten in (x,y) angibt, wäre es ja genau verkehrt rum, weil ja die Zeile eher der y-Richutn und die Spalte eher der x-Richtung entspricht also (zeile,spalte)=(y,x).
Also kurz:
Probier doch einfach mal
[xcp ycp]=centroid(bw);
vielleicht stimmt's dann eher.
Gruss,
stochri
Hi,
du hast mal wieder recht!!! Ich hab ycp xcp einfach vertauscht und schon geht jedes Bild wunderbar, hier das von vorhin:
MfG Mike
Hallo Stochri,
wie gehts weiter????
MfG Mike
Jetzt brauchen wir ein Programm, welches ein Bild abspeichert, damit man es in Scilab einlesen kann. Bei Linux habe ich dazu das Programm "webcam" benutzt, aber das gibt es für windows vermutlich nicht.
Unter Linux habe ich es genauso verwendet, wie die ASURO-Steueroutinen: Einfach mit "unix pragrammname" aufgerurfen. Dann hat mir "webcam" ein Bild abgespeichert und Scilab konnte es automatisch wieder einlesen.
Um das Problem zu lösen, habe ich folgenden Thread eröffnet:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=161795#161795
Vielleicht kann man ja eines der Programme verwenden, die bei Deiner Webcam mitgeliefert wurden.
Oder vielleicht läst sich doch etwas im Internet finden, ich bin mir sicher, dass irgendjemand das schon mal gemacht hat. Du kannst ja eventuell auch mal mit google suchen.
Das Problem wird sich bestimmt lösen lassen.
Gruss,
stochri
Hallo Stochri,
ich glaub auch das wir das hinbekommen. Ich hab schon mal im Netz gesucht bis jetzt aber noch nichts gefunden:-(
Aber das ändert sich hoffentlich bald.
MfG Mike
Hi,
ich hab jetzt endlich nach langem suchen bei winload ein geeignetes Programm gefunden. Es lädt alle paar sekunden ein aktuelles Bild unter dem Namen "cam" in ein Verzeichnis. Nun kann ich das immer wieder aktualisierte Bild in Scilab hochladen. Und das beste, mit dem Programm hat meine Webcam ne viel bessere Bildqualität (warum auch immer oder mir kommts nur so vor)
Jedenfalls wird Asuro überall perfekt erkannt. Es ist zwar nicht genau wie dein Programm aber es müsste doch eigenlich auch gehen.
MfG Mike :mrgreen:
Na super !
bestimmt läßt sich das Programm verwenden. Vielleicht kannst Du ja den Link posten, wo Du es gefunden hast, dann können es eventuelle Mitleser auch verwenden.
Die ursprünglichen Routinen funktionieren so, dass mit "asuropos" die Position des ASURO bestimmt wird. Die Funktion "asuropos" hast Du ja jetzt schon kennengelernt.
Jetzt musst Du die Positonsbestimmung nur in die ursprüngliche Funktion einbauen, sodass sie Dir nach dem Aufruf die position des ASURO zuverlässig zurückliefert.
Eventuell muss doch noch eine Helligekeitsanpassung eingebaut werden. Deshalb ist es so wichtig, dass Du die Postionsbestimmung ausgiebig testest.
Bei mir sieh der Aufruf von "asuropos" so aus:
-->[x y]=asuropos()
Size: 240 rows X 320 columns
Truecolor Image
Warning :redefining function: y
y =
92.266304
x =
100.54891
Der ASURO wird also an der Position (100,92) gefunden.
Die Funktion asuropos wird von der Funktion "gopos" benötigt.
Diese Funktion fährt den Asuro an eine gewünschte Postion.
Die Funkton wird folgendermaßen aufgerufen:
gopos([100 150])
100,150 sind die Koordinaten.
Es ist allerdings wichtig, das die Funktion "turn" kalibriert ist und sich der ASURO beim Aufruf von
turn(360)
einigermßen genau um 360° dreht.
Übrigens: bei Scilab gibt es einen Unterschied zwischen Dateien, die mit sci und mit sce enden.
Dein Initialisierunsscribt rufst Du mit name.sce auf.
Funktionen wie z.B. asuropos.sci werden normalerweise mit exec asuropos.sci in scilab geladen aber noch nicht ausgeführt.
Nach dem Laden kann eine Funktion ausgeführt werden, und zwar so wie weiter oben beschrieben.
Wenn Du etwas an der Funktion mit dem Editor änderst, musst du die Funktion aus sclab mit
clear asuropos
löschen und danach die geänderte Funktion wieder mit
exec asuropos.sci
laden.
Praktischerweise schreibe ich das immer in eine Zeile
clear asuropos; exec asuropos.sci;
Gruss,
stochri
Hallo Stochri,
ich hab jetzt das file asuropos angepasst. Es sieht jetzt so aus:
x=imread('C:\Dokumente und Einstellungen\Mike1\Eigene Dateien\Asuro Programme\scifiles\pictures\cam.jpg');
red=x(:,:,1);
bw=im2bw(red,0.70);
//xset('window',1);
//xbasc
//imshow(bw*230);
bw=im2bw(bw,0.3);
//xset('window',2);
//xbasc
//imshow(bw*230);
[xcp ycp]=centroid(1-bw)
endfunction
Jedoch gehts mal wieder nicht richtig. Also zuerst muss ich ja asuropos mit exec laden. Das geht. Aber wenn ich dann-->[x y]=asuropos() eingebe kommen immer die selben Coordinaten. Hier als Beispiel:
-->exec('C:\Dokumente und Einstellungen\Mike1\Eigene Dateien\Asuro Programme\scifiles\asuropos.sci');disp('exec done');
Warning :redefining function: asuropos
exec done
-->[x y]=asuropos()
Size: 288 rows X 352 columns
Truecolor Image
y =
176.5
x =
144.5
Eigentlich funktioniert es nur sind x,y immer gleich.
Mit der Funktion gopos ist es ähnlich. Asuro fährt fährt zwei Schritte vorwärts und hält an. Auch wenn ich unterschiedliche Zahlen eingebe. Alos nicht gopos([100 150]) sondern gopos([90 190]).Dann müsste er doch wo anders hinfahren. Wenigsten hab ich die Kalibrierung von turn hinbekommen. Bei turn(360) dreht er fast punktgenau um 360Grad.
Ich hoffe du weißt wo der Fehler liegt und kannst mir helfen.
MfG Mike
Achso jetzt hätte ichs fast vergessen. ](*,)
Hier noch die Adresse für das Programm:
http://www.winload.de/download/1959/Internet/Internettools/VisionGS.PE-1.20.html
Ich habe jetzt ruasbekommen das man sogar die Aktualisierungsgeschwindigkeit des Bildes einstellen kann. Bei mir wird es nun jede Sekunde neu geladen.
MfG Mike
Schau Dir mal die orginal asuropos.sci an.
Bei Funktionen gibt es immer einen Funktionskopf ( erste Zeile ). Den hast Du bei Dir weggelassen, deshalb denkt Scilab es sei ein Script und keine Funktion.
Also:
Funktionskopf wie in der orginalen asuropos davor schreiben!
Hi,
meinst du:
function [xcp,ycp]=asuropos()
das hab ich stehen lassen.
MfG Mike
Warning :redefining function: asuropos
Diese Warnung kommt normalerweise, wenn man vergessen hat mit
clear asuropos
die Funktion aus Scilab zu löschen, bevor sie neu geladen wird.
Wenn Deine Bilderkennung als Scriptfile funktioniert ( dazu hast Du ja schon ein paar Bilder geposted ) sollte die Funktion asuropos auch die korrekten Koordinaten zurückliefern. Bist Du sicher, dass das aktuelle Bild geladen wird und nicht immer das selbe ?
Hi Stochri,
ich hab das file noch mal umgeändert, jetzt gehts. hab es so geändert das ich auch ein Bild sehe. (Also vor imshow "//" weggelassen) Asuro wird gut erkannt aber das Webcamprogramm ist doch nicht so gut, denn alle paar Bilder steht oben oder unten Werbung in weißer Schrift, dem entsprechend verfälscht ist dann die Positionserkennung von Asuro.
Ich muss mal schauen ob man das nicht abschalten kann oder noch mal ein neues Programm suchen. Auch gopos geht nun aber wie gesagt wird er nicht richtig erkannt. Er fährt mal hier hin dann da hin und bleibt irgendwo stehen.
Aber das kriegen wir schon noch hin. Und nochmals vielen Dank für deine Hilfe, denn sonst wäre ich nie soweit gekommen.
MfG Mike
Hallo Mike,
wenn die weise Schrift immer an der gleichen Stelle ist, könnte man sie einfach schwarz übermalen, dann sollte das Problem behoben sein.
Du kannst Dir die neue Funktion "drawcross" anschauen, die ich in diesem Thread geposted habe.
Das Kreuz, welches dort gemalt wird, besteht aus zwei Rechtecken. Du könntest die Funktion nehmen und so veränderen, dass die Rechtecke größer über der störenden Schrift gezeichnet werden.
Sie sollen natürlich schwarz gezeichnet werden, dazu musst Du die Rechtecke mit zeros(länge_x,länge_y) statt mit der Funktion ones(....) erzeugen.
Kannst Du programmieren? Möchtest Du das Projekt noch ein wenig weiter führen, oder erst mal auf Eis legen ?
Gruss,
stochri
NumberFive
05.03.2006, 22:17
Sorry hab jetzt nich den ganzen Thread gelesen.
Aber wenn du "nur" ein programm suchst das die Bilder ein webcam unter windows aus die Platte schreibt hätte ich da vielleicht was für dich habe nämlich eien selbst geschrieben.
Gruß
Hallo,
Stochri, das mit der drawcrossfunktion ist eine gute Idee, an so was habe ich auch schon gedacht aber die Schrift ist einmal unten und einmal oben. Man müsste also zwei Rechtecke einfügen. Außerdem kann ich nicht programmieren :(
Aber auf Eis legen will ich das Projekt noch nicht. Ich will wenigstens so weit kommen, dass er zu einer bestimmten Position fahren kann.
NumberFive, wenn du so ein Programm hättest das wäre ja super. :lol: Könntest du es vieleicht posten? [-o<
MfG Mike
NumberFive
06.03.2006, 12:20
mir fehlt noch die dauer funktion da ich nicht an nehme das du dauert clicken willst. aber die Würde ich noch machen. das bmp fromat ist ok ?
Hallo Numberfive,
das wäre echt nett aber wie funktioniert das ganze dann. Instaliere ich das Programm dann auf meinem Rechner oder läuft das dann über Scilab?
Was meinst du mit dem bmp format?
Kenn mich da nicht aus :oops:
MfG Mike
NumberFive
07.03.2006, 07:07
www.i-do-more.de/mine-robo/download/VideoCapture.zip
bevor ich das programieren anfange erst mal gucken ob es überhaupt geht.
das Zip runter laden und mal gucken ob du ein bild bekommst.
Wichtig ist das du den Video Capture Pin auf RGB stellst sonst kann man das bitmap hinter nicht lesen. (Ist ne macke im Programm)
Dann soltest du mit dem Pick Frame Button einzel bilder machen können.
wenn das soweit Funktioniert machen wir weiter ok ?
Vielleicht könnte mir einer von euch zweien mal genau er klären wie der Ablauf ist ich kenne die lib bzw. Scilab überhaupt nicht. Aber die ergebnisse sehen toll aus.
Gruß
Hallo NumberFive,
hab gerade dein Programm getestet. Es funktioniert einwandfrei. =D> Aber bis jetzt speichert es immer wieder ein neues Einzelbild ab, wenn ich auf den Button klicke. Es müsste dann so sein das es das neu gemachte Bild immer unter dem selben Namen abspeichert. Damit man dann das immer wieder aktualisierte Bild in Scilab einlesen kann.
Und wegen dem genauer erklären brauchst du doch nur die ganzen Threads zum Thema lesen? Wenn dir das aber noch nicht reicht musst du Stochri fragen.
MfG Mike
NumberFive
07.03.2006, 11:10
Sicher wie das Programm Funktioniert ist hier erklärt.
Aber nicht wie der Programm ablauf ist.
Also wa machst du nach dem das Bild auf der platte ist ?
Fürst du dann ein dos/cmd comando aus oder guck das
Andere program Cyclisch ob da ein neues Bild ist ?
Gruß
Zuerst lädt das Programm das Bild mit "x=imshow('Pfad\Bildname.jpg')" hoch. Dann wird die Position bestimmt. Und der Asuoro dementsprechend angesteuert. Danach beginnt das ganze wieder von vorn, also wird das gleiche Bild wieder hochgeladen etc......
Praktisch immer wenn die Funktion gopos durchgelaufen ist beginnt sie wieder von Vorne bis Asuro die Position ereicht hat.( man könnte also sagen es guckt cyclisch nach einem neuen Bild)
Hoffe ich habe es richtig erklärt und deine frage beantwortet.
MfG Mike
NumberFive
07.03.2006, 18:23
Nun kannst du es noch mal runter laden jetzt hast du ein Button mehr
und kannst in der Ini einstellen ob die Bilder nummeriet werden oder nicht.
Hatte eigenlich gehofft das man dem Scilab von aussen sagen könnte das es jetzt neu versuchen soll.
Ohne das ist das für mich nicht verwendbar
Gruß
Hallo Number5,
mit einem kleinen Trick könnte man Scilab schon von außen sagen, dass ein neues Bild da ist.
Bis jetzt funktioniert der ganze Scilab-Algorithmus so ( zumindest bei meiner Linux-Version ):
1. scilab triggert per Kommandozeilenbefehl die Bildaufnahem ( Aufruf des Kommandozeilenprogramms "webcam" )
2. Scilab liest das Bild von der Platte
3. Scilab bestimmt die Position des Asuro, zusammen mit der letzten Position berechnet Scilab auch den aktuellen Winkel des ASURO
4. Scilab dreht den ASURO und fährt eine konstante Strecke ( die Ansteuerung erfolgt wieder über Kommondozeilenaufrufe, dort befinden sich die Batch-Dateien Turn und Go, welche die serielle Schnittstelle ansteuern )
Ich habe das ganze Projekt in der Weihnachtszeit in 4 Tagen realisiert. Deshalb auch die etwas umständliche Ansteuerung über die Kommandozeile. Eigentlich gibt es bei Scilab die möglichkeit C-Code in die Funktionsaufrufe einzubinden.
In welcher Programmiersprache hast Du denn dein Programm geschrieben ?
Gruss,
stochri
Jo das geht wunderbar. Danke Danke Danke,
aber wie stell ich denn ein das die Bilder nicht nummeriert werden?
MfG Mike
Hallo Mike,
irgendeinen Haken hat doch alles, oder =P~
Gruss,
stochri
NumberFive
07.03.2006, 20:28
@stochri
das Program ist in VC6 geschrieben da habe ich noch Delphi VB 6 java.
C und Delphi mag ich vb wenn es sein muss und schnell gehen java habe ich erst 5 Ziele oder so geschrieben.
@Mike1
Inder ini ändern
[Bitmap]
Laufend=0
dann sollte das bil nicht mehr nummerit werden
Wie schon weiter oben beschrieben, könnte man C-Routinen direkt in Scilab einhängen, dazu gibt es irgendwo ein HowTo.
Der Trick Scilab von außen zu triggern wäre folgender: Scilab schaut in einer Routine immer auf die Platte, ob eine Datei mit bestimmtem Namen existiert. Falls die Datei existiert, wird sie geladen und danach von Scilab gelöscht. Super schnell ist das Verfahren natürlich nicht, aber vielleicht ausreichend.
Falls Du den Code für das Bildaufnahmeprogramm Open Source machen willst, könnte ich Dir auch helfen, den ASURO-Steuerungsalgorithmus direkt in Visual C zu realisieren ( ich will nicht selber in VC programmieren, da ich Linux benutze ).
Der Algorithmus wäre aber relativ schnell in VC zu implementieren.
Mich würde das Projekt interessieren, das Du mit der Bildverarbeitung realisieren möchtest.
Gruss,
stochri
NumberFive
07.03.2006, 22:13
Bei mir geht es nicht um den ASURO sondern um die Vieleicht an bindung an ein Nachricht system für roboter also nicht so genau für einen Robotertyp.
Ich habe überlegt ob ich das für das Trainieren mein Sensor logic nutzen könnte.
Also Cam an die decke und robi suchen die Pos wird gemeldet und in die Kordianten für die Karte um gerechtet jetzt kann der Robi prüfen um die Pos Über die cam gleich ist wie er denkt auf der Karte zu stehen.
So könnte man vielleicht die Sensoren einrichten und genauer machen.
(Neuronen und die Sensoren da rüberjagen).
Das zweite währe für Aufgaben ein bessere Postionierung zu erreichen in bestimmten räumen (Küche wegen dem Kühlschrank).
Ich weiß klingt verrückt aber das war der Gedanke.
https://www.roboternetz.de/phpBB2/viewtopic.php?p=164773#164773
vielleicht hast du es aber schon gelesen
Gruß
Also Cam an die decke und robi suchen die Pos wird gemeldet und in die Kordianten für die Karte um gerechtet jetzt kann der Robi prüfen um die Pos Über die cam gleich ist wie er denkt auf der Karte zu stehen.
Das sollte funktinieren. Die Frage wäre nur, ob Du mit Deiner Kamera von der Decke aus den ganzen Boden sehen kannst. Vielleicht wäre da ein Fischaugenobjektiv notwendig.
Im Moment funktinioniert die Positionserkennung des ASURO nur über ein rotes Papier auf dem ASURO. Für diese einfachste Arte der Bilderkennung darf natürlich nur ein roter Gegenstand im Bild sein. Wenn Du also Deine Küchenboden von oben betrachten willst, musst Du alle roten Gegenstände aus der Küche entfernen, oder schwarz anmalen O:)
Falls sie an einer festen Position wären, könnte man sie auch aus dem Bild ausblenden.
Ich habe auch schon eine Version für mehrere Gegenstände, als Unterscheidungsmerkmal verwende ich da die Objektgröße.
Einen Thread mit Bildern findest Du übrigens hier:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=15762
Das zweite währe für Aufgaben ein bessere Postionierung zu erreichen in bestimmten räumen (Küche wegen dem Kühlschrank).
Wie meinst Du das ?
Ich weiß klingt verrückt aber das war der Gedanke.
Dazu eine Anektode, die ich vor kurzem mal irgendwo gelesen habe:
Ein junger vielversprechender Student kam zum Physiker Pauli und hat ihm seine neue Theorie vorgestellt. Dazu Pauli: "ihre Theorie kann gar nicht stimmen, dazu ist sie gar nicht verrückt genug"
Dein Weg ist allso möglicherweise gar nicht so schlecht.
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=164773#164773
vielleicht hast du es aber schon gelesen
Uih, ganz schön lang der Thread ...
NumberFive
07.03.2006, 23:27
Ich dachte wenn ich ein rotes T drauf mache müssen ich es hin bekommen
die Parallelität Zwischen robi und Kühlschrank hin zu bekommen.
Und die pos vor dem Kühlschrank. Ich denke das ich sonst der griff nicht finde. So genau kann keine karte sein.
Gruß
Hallo,
gut das funktioniert jetzt, also speichert es nur noch ein Bild ab. Aber es gibt noch ein Problem: das Bild ist ein Bitmap Dateityp, wir brauchen aber jpeg. Hab schon im file asuropos mal Bitmap eingetragen aber das scheint es nicht zu kennen. Du müsstes das also noch mal umändern nach "jpeg" wenn das ginge. Danke Danke Danke!!!
MfG Mike
NumberFive
08.03.2006, 11:51
des wegen habe ich vorher gefragt welches Format mal sehen ob wir auch jpg's hin bekommen.
Gruß
NumberFive
08.03.2006, 21:23
Hätte es nie gedacht aber jpg's nicht so einfach zu erzeugen aber ich bleibe am ball nur heute wird es nix mehr
Hallo Mike,
bei meiner linux-version ( silab 3-1-1 ) gibt
help imread
folgendes:
imread reads BMP, GIF, JPEG, PNG, PCX, TIFF, XPM, and even more types of image files into Scilab. The format of the file is inferred from the extension in the filename parameter.
Schau mal bei der Version nach, die Du verwendest.
Gruss,
stochri
hallo,
Numberfive du brauchst das gar nicht mehr ändern. Es geht auch mit BMP.
Tut mir leid das du soviel Arbeit wegen mir hast.
Ich hab mal ein bisschen rum experimentiert. Ich glaube Asuro wird nicht gut genug erkannt. Was halttet ihr davon wenn ich eine rote LED drauf baue. Dann kann ich die Helligkeit soweit runternehmen bis man nur noch die LED sieht. Er würde also punkt genau erkannt werden. (theoretisch)
MfG Mike
Hi,
also ich hab jetzt mal probeweise mein LED-Fahrradrücklich auf Asuro gebaut. Er wird nun perfekt erkannt. Aber irgendwie will er nicht so recht zu einer bestimmten Position fahren. er fährt gerade aus dreht fährt kurz dreht wieder eben hin und her. Er fährt also nicht koordiniert sondern einfach nur mal hier hin mal dahin, das in einem Bereich von ca. 30x30cm.
Stimmt also vieleicht etwas mit der Funktion gopos nicht?
MfG Mike
Vermutlich handelt es sich um ein Synchronisationsproblem. In der ursprünglichen Version wurde die Bildaufnahme von Scilab getriggert. Auch wichtig: turn(360) muss immer noch um 360° drehen, hängt ein wenig vom Batteriezustand ab.
In Deiner Version läuft die Bildaufnahme ja unabhängig von Scilab. Es kann vorkommen, dass ein Bild aufgenommen wird, während der Roboter noch dreht. Dann bekommt die Bildverarbeitung natürlich eine falsche Information über den Roboter. Abhilfe kann dadurch geschaffen werden, dass man nach den Bewegungsfunktionen eine kurze Wartezeit einbaut.
Du kannst mal folgende probieren: baue einfach nach den Bewegungen den Befehl
pause
ein.
Dann wartet die Funktion auf einen Tastendruck zum weitermachen. Du kannst auch mal die Bildanzeige wieder einschalten, um zu sehen, ob die Position auch immer richtig erkannt wird.
Gruss,
stochri
Hallo Stochri,
es ist nun so das Asuro kurz fährt dann dreht er sich nach links (meist um die 300 bis 360 Grad) und fährt einmal kurz geradeaus. Danach dreht er wieder nach links. Ich weiß ja nicht wie das sein soll. Ich denke mal wenn er die richtige Richtung hat sollte er geradeaus fahren und nur kleine Korrekturen nach links oder rechts machen. Nach rechts korrigiert er auch scheinbar richtig, nur nach links will er immer gleich eine ganze Drehung machen. Kann es sein das ich bei der Funktion gopos bei
pic=imread('Webcam.jpeg')
vielleicht mein Bild eintragen muss, also:
pic=imread('C:\Dokumente und Einstellungen\Mike1\Desktop\StillCap.BMP');
Oder ist es so schon richtig? Nach einer langen Fahrt mit vielen Drehungen um die eigene Achse kommt anschließend folgende Meldung:
ans =
column 1 to 5
! 364.46266 161.48644 174.65736 200.60303 184.60615 !
! 143.93983 344.59153 341.79442 356.72424 392.62849 !
column 6 to 10
! 175.92991 159.30861 163.39071 165.13158 146.15236 !
! 367.99533 359.95933 331.74044 301.72105 288.67597 !
column 11 to 15
! 153.26563 131.09036 115.15217 88.266355 119.82593 !
! 251.10938 262.27108 225.32609 210.90187 235.66296 !
column 16 to 20
! 112.05769 86.482143 121.33486 94.125 83.126374 !
! 206.07692 192.71429 196.47248 187.70833 161.65385 !
Ist das die richtige Meldung wenn er die Position gefunden hat?
MfG Mike
Hallo Mike,
Kann es sein das ich bei der Funktion gopos bei
pic=imread('Webcam.jpeg') vielleicht mein Bild eintragen muss
Als Bild muss natürlich immer das aktuelle Bild von Deiner webcam eingetragen werden ( also Pfad und Name, das hast Du schon richtig erkannt ).
Die Funktion gopos liefert die Wegpunkte, an denen der ASURO stehen geblieben ist und eine neue Position mit asuropos bestimmt wurde, zurück. Die Funktion wird beendet, wenn ein bestimmter Abstand zur Zielposition unterschritten wird.
mit
weg=gopos([100 200]);
plot(weg( 1 , : ),weg(2 , : ) );
kannst Du dir den Weg graphisch darstellen lassen.
Ich muss gestehen, dass sich in der Funktion gopos zwei "kleine" Fehler befinden ( naja, ist ja auch die Verion 0.1 ).
1. Der Abstand zwischen ASURO-Position und Zielposition wird falsch berechnet.
Folgende Zeile kommt zweimal vor:
distance=sqrt((xcp-zx)^2*(ycp-zy)^2);
dort muss das * durch ein + ersetzt werden:
distance=sqrt((xcp-zx)^2+(ycp-zy)^2)
2. Der ASURO dreht nicht immer um den kleinsten Winkel
Manchmal dreht sich der ASURO um 270° statt um -90°. Es funktioniert auch, sieht aber etwas ungeschickt aus.
Diesen Effekt kann man verhindern, wenn man nach der Zeile
dw=winkelsoll-winkelist;
diesen Code einfügt:
if dw>180,
dw=dw-360;
end
if dw<-180,
dw=dw+360;
end
Kannst Du eventuell mal ein Bild posten, das du mit der plot-Funktion vom Weg aufgenommen hast ?
Gruss,
stochri
p.s.: Bist Du noch in der Schule und falls ja, was kommt gerade in Mathe ?
Hallo Stochri,
1. Jo ich bin noch in der Schule. Bin Realschüler und gehe in die 10.Klasse. In Mathe haben wir gerade Sinus, Kosinus, Tangens.(Dreicksberechnung)
Also mit Vektoren haben wir noch nicht gerechnet.
2.Habe gopos nun umgeändert. Hätte aber noch ne Frage, muss ich bei den zwei imshow Befehlen noch *230 in die Klammer schreiben, wegen der Helligkeit?
Nun kommt er nach langer Sucherei also schon mal ins Ziel. Aber irgendwie ist das noch nicht richtig. Kann es vielleicht an den 3 LEDs liegen? Wäre eine vielleicht besser? Aber eigentlich dürfte das ja nicht viel ausmachen. Hier mal ein Bild von der Strecke. Und noch eins von Asuro mit den LEDs und eins mit der Kamereeinstellung die ich habe, damit wird er ganz leicht erkannt.
MfG Mike
Hi,
mit welchem Programm hast du denn nun die Bilder von der Webcam auf der Festplatte gespeichert?
MfG Jeffrey
Hi Jeffrey,
die Bilder speichere ich mit dem Programm von NumberFive. Das speichert nun jede Sekunde ein neues Bild. Allerdings muss man dann halt den Befehl pause einbauen und immer Resume drücken, sonst ist das Programm(Scilab) zu schnell und bekommt falsche Koordinaten, weil es meist ein veraltetes Bild bekommt.
@Stochri,
könnte man man nicht eine automatische Wartezeit vorgeben (z.B. 1 Sekunde), dann bräuchte ich nicht immer resume dücken?
MfG Mike
Hi,
wie wäre es wenn du das Programm die ganze Zeit laufen lässt, und nach jedem Bildeinlesen überprüfst, ob es ein andres ist, als das aus dem Durchlauf vorher, falls kein Unterschied besteht, wird der Rest des Programms nicht ausgeführt, sondern solange immer nur das Bild eingelesen, bis es ein anderes ist.
MfG Jeffrey
Hi,
hab mich jetzt auch mal ein bischen mit SciLab beschäftigt, und versucht eine Bilderkennung zu programmieren.
Für die ersten Versuche hat es schon ganz gut geklappt.
Ich habe versucht den roten Beutel nur anhand der Farbe zu erkenne, mit Hilfe der Form können dann bestimmt sogar noch bessere Ergebnisse erziehlt werden.
Es ist jeweils das Bild welches das Programm genutzt hat zu sehen, einmal mit voller Beleuchtung, und einmal bei doch sehr schummrigen Licht. Die Farbverzerrung bei Ausgangsbild ist nur deshalb, weil ich den erkannten Bereich darstelle, indem ich dort GRün auf 1 setzte und im restlichen Bild auf 0. Das etwas schlecht sichtbare Kreuz bezeichnet den Schwerpunkt der Fläche.
Ich muss sagen SciLab bietet schon gute Möglichkeiten, allerdings lange nicht so toll wie MatLab und vortallem viel langsamer.
MfG Jeffrey
PS: ich habe für die Verarbeitung bmp Bilder genutzt, die kann ich aber hier nicht hoch laden
hat beim ersten nicht mehr gepasst
Hi,
ich habe übrigns die Funktion mit dem übrprüfen, ob altes und neues Bild gleich sind in das Programm eingebaut. Es funktioniert.
Wie macht ihr eigentlich die Ausgabe während das Programm läuft? Die Funktin imshow ist dazu ja viel zu langsam. Ich habe das Bild nun immer auf Festplatte gespeichert, allerdings benötige ich nun ein Bildbetrachtungprogramm, das sich ständig automatisch aktualisiert, sodass man auch immer wenn es ein neues Bild gibt das aktuelle Bild sieht. Weiß da jemand eins, oder wie habt ihr das gelöst?
MfG Jeffrey
Hi jeffrey,
kannst du die Funktion zur überprüfung mal posten. Ich kenne mich zwar nicht so aus aber mit Stochris Hilfe könnte ich vielleicht die Funktion bei mir auch mit einbauen. :-k
Danke
MfG Mike :lol:
P.S.: sieht echt gut aus was du da machst!!!
hi,
ich hab einfach am anfang des programms was in der art gemacht:
while(1)
x=imread
if x=xalt
else
programm
xalt=x
end
mfg jeffrey
Hallo jefrey
schön, dass sich noch jemand für das Thema interessiert.
Ich muss sagen SciLab bietet schon gute Möglichkeiten, allerdings lange nicht so toll wie MatLab und vortallem viel langsamer
Matlab ist zweifelsohne besser, allerdings sind die Kosten auch ziemlich enorm. Wenn man's als nicht-Student kauft, dürfte das ganze so um die 3000 Euro mit Bildverarbeitungstoolbox kosten.
Aus diesem Grund habe ich Scilab gewählt, das kann sich jeder runterladen, da Open Source.
Ansonsten hätte ich für die BV+Robotersteurung LabView verwendet. Um in Echtzeit etwas damit zu steuern, ist das einfach besser.
Hast Du bei den Versuchen eine Helligkeitsnormierung eingebaut?
Wie ist es mit der Erkennung von Formen, hast Du schon mal etwas asuprobiert ?
Gruss,
stochri
Hi Stochri,
LabView kenn ih nicht. Ich habe keine Helligkeitsnormierung gemacht. Ich mache die Farberkennung im hsvformat, da ist die Farbe unabhängiger von der Helligkeit.
Ich bin bisher noch nicht dazu gekommen noch weiter zu probieren (muss ab und zu auch noch ne Prüfung schreiben), hab also noch nichts in Richtung Formerkennung gemacht.
Was eine weitere Möglichkeit wäre, wäre wenn es mehrere Flächen mit der gleichen Farbe gibt den Schwerpunkt der Einzelnen Fläche mit der größe der zusammenhängenden Fläche zu gewichten, dann hätte Rauschen keinen zu großen Einfluß auf die Schwerpunktslage.
gut N8 Jeffrey
NumberFive
16.03.2006, 07:38
Auch wenn es nicht mehr gebraucht wird
(Benachrichtigung hat nicht Funktioniert)
Ich habe das Teil jetzt auch JPG Fähig bekommen der Download link ist geblieben. Die dll bleibt im verzeichnis der anwedung. Bitmaps und jpgs gehen nur bei RGB und 24Bit Farbtiefe des VideoStream. Also beim einstellen auf passen.
Wenn mir jemand er klärt was ich machen muß Wurde ich auch Scilab benachrichtigen wenn ein Bitmap da ist.
ich habe gerade noch ein Bissle im Thread gestöbert wenn ich mir die Bilder mit der LED an schaue. Muß ich an die Zweite version dieses Programs Denken die den Helst punkt sucht das müsste ja eingendlich auch den Azuro finden oder ?
was ich nicht so wirklich verstehe ich kann in den Bilder ja nur nach farben suchen oder ? wenn ich also nach einer Farbe suche ist die doch nicht immer gleich da das licht sich ändert damit muß ich aber immer einen abgleich machen oder für Konstante bediengungen sorgen oder denke ich komplett falsch ?
Hi NumberFive,
wie du an meinen Bildern sehen kannst funktioniert die Farberkennung bei den Lichtverhältnissen, bei denen sie programmiert wurde am besten. Allerdings wird auch bei schlchten LIchtverhältnissen der rote Beutel vo dem roten HIntergrund immernoch relativ gut erkannt(finde ich zumindest).
Die Idee mit der Helligkeit hatte ich auch schon, man könnte nach hellen Punkten suchen und nach roten, und Ergebniss die Schnittmenge bilden.
MfG JEffrey
Hallo Mike,
wenn Du willst kannst Du mal zum Test eine künstliche Verzögerung einbauen, mit Scilab geht das so:
// Echtzeitzähler mit 1/10 Sekunde Zeitschrit initialisieren
realtimeinit(0.1);
// Zähler auf Null setzen
realtime(0);
// 30 zehntel Sekunden ( 3 Sekunden ) warten
realtime(30);
Diese Sequenz kannst Du immer einfügen, bevor ein Bild neu geladen wird.
@Number5
Eine Triggermöglichkeit für das Programm wäre super. Vielleicht könnte das Programm ja einfach auf der Platte schauen, ob eine bestimmte Datei existiert, z.B. JETZT.TXT.
Wenn die Datei vom Bildaufnahmeprogramm gefunden wird, wird ein neues Bild aufgenommen und die Datei danach gelöscht. Eine einfachere Möglichkeit fällt mir im Momnent nicht ein, aber vielleicht gibt es ja hier den ein oder anderen Experten, der sich mit TCP-Sockets und Scilab auskennt.
@jefrey
Mike schrieb
Scilab kennt "rgb2hsv" nicht. Ich habe mal im Ordner von Sip nachgesehen und da gibt es nur ein file "rgbntsc". Ich habe dann im Codeauschnitt rgb2hsv durch rgb2ntsc ersetzt.
Welche Version von Scilab und Sip verwenest Du? Welches Betriebssystem ? Unter Linux gab's die rgb2hsv, aber laut Mike für die windows Version nicht.
Gruss,
stochri
hi,
scilab 4.0 unter winxp. ich verwende auch die rgb2hsv funktion.
mfg jeffrey
NumberFive
17.03.2006, 08:21
Allso TCP Sockes sind kein thema da kenne ich mit aus scilab 4.0 habe ich hier unter 2000 installiert um mal zu sehen von was ihr redet wie es funktioniert habe zwar noch nicht ganz verstanden aber das kommt bestimmt noch.
Gruß
Hi,
schade :cry: Als ich mir Scilab runtergeladen hab gabs Scilab 4.0 noch nicht.(Ich hab ja jetzt Version 2.7 und die ist einfach zu alt)
Ich lade mir das dann noch mal neu runter. Aber mit meinem Modem dauert das immer ewig :(
Aber vielleicht geht es dann mit der Steuerung besser :P
Danke für die Verzögerung Stochri.
MfG Mike
@jeffrey
Gerade eben habe ich mal die Installationsanleitung von SIP 0.4.0 für windos überflogen, scheint ein größerer Aufwand zu sein. Wie war das bei Dir: muss man ImageMaqick auch installieren ?
Gruß,
stochri
Hi NumberFive,
das mit der Benachrichtigung dur das Capture Programm an SciLab ist bestimmt nicht schlecht.
Aber mit meinem Vergleich vo altem Bild und neuem BIld funktioniert es auch schon gut.
MfG Jeffrey
jeffrey,
wie schnell läuft Dein System? Bei mir hat die Aufnahme eines Bildes und die Steuerung des Roboters für einen Schritt etwas unter 1 Sekunde gebraucht.
Das ist eigentlich etwas langsam, für eine flüssige Bewegung des Roboters sollte sich das ganze im 1/10 Sekunden Bereich bewegen. Der Flaschenhals bei meinem System ist aber nicht die Bildverarbeitung, sondern die langsame Bildaufnahme.
Gruss,
stochri
Hi,
die Installation lief eigentlich problemlos, man muss diese imagemagic auch installieren. Aber das stört ja nicht wirklich, allerdings ist die Bildausgabe darüber sehr langsam, hat da jemand eine bessere Lösung?
Ich hab nen AthlonXP2400, mit 512 ram.
Je nach Bildauflösung ist das Bildeinlesen schon langsam, allerdings benötigt meine Bildverarbeitung je nach Aufwand auch einiges an Zeit. Ich denk unter 1s wird schwer. Allerdings halte ich eine Sekunde für ausreichend. Wenn der Roboter jede Sekunde seine Position erfährt, muss das doch reichen, er hat ja auch ne eigene Intelligenz, mit der er dann den Weg von der Ist- zur Sollposition berechnen kann, und eine Korrektur der Istposition jede Sekunde reicht da glaube ich. Ich weiß ja nicht wie schnell dein Robotr ist, aber mehr wie 10-20cm wird er in der Zeit doch nicht schaffen, vorallem wenn er nicht an der richtigen Position ist, und er korrigieren muss, dann bremst man ja sowieso. Und wenn die Position stimmt ist es ja egal, wenn die nächste Positionsbestimmung erst ne Sekunde später kommt.
MfG Jeffrey
Hi,
hab mir jetzt doch mal Scilab 4.0 runtergeladen(ging eigentlich ziehmlich schnell). Hab auch schon das Siptool.
Jetzt brauche ich nur noch dieses imagemagic Ding. Aber wo kann ich mir das runterladen? Ich war zwar schon auf der Seite von image aber hab keinen Downloadlink gefunden.(bin ich zu blöd oder warum krieg ich das nicht hin???)
Wo oder wie habt ihr das runergeladen. Denn meine alte Version von imagemagic geht ja bestimmt nicht.
MfG Mike
@ Mike:
Hi,
ich habe das von der Seite, die du angegeben hast.
@ alle:
wie ist den aus SciLab heraus ein Zugriff auf die serielle Schnittstelle möglich? Damit ich die ermittelten Daten auch irgendwie an die Ausenwelt übergeben kann.
MfG Jeffrey
NumberFive
17.03.2006, 18:34
Also wenn ihr so weit runter von dem Zeiten wollt ist wohl der weg über die platte der falsche dann müssten wir das mit dem speicher hin bekommen den laden und schreiben braucht zeit noch dazu im jpeg format da das gepackt und wieder entpackt werden muß.
es gibt dieses rsh von dem ich noch nicht verstanden habe wie es tut aber das scheint genau dafür gemacht worden zu sein. dann kann ich nämlich daten von rechner zu rechner oder lokal zwischen programmen austauschen.
So weit
gruß
hi,
ich denke nicht, dass das speichern die meiste zeit benötigt, da die bilder doch von der größe her überschaubar sind. ich denke es ist eher die ladefunktion von scilab die zu langsam ist.
mfg jeffrey
wie ist den aus SciLab heraus ein Zugriff auf die serielle Schnittstelle möglich? Damit ich die ermittelten Daten auch irgendwie an die Ausenwelt übergeben kann.
Hast Du das ganze projekt runtergeladen ? https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=15537
Dort befinden sich die Script-Files asuro_vor usw.
#!/bin/bash
echo 2 > /dev/ttyUSB0
( Linux-Version )
Mike hat die für Dos umgeschrieben ( findet sich hier im Thread ). Aus scilab kann man einen Dos-Kommandos mit
unix Kommandoname
aufrufen.
Ich gebe zu, das ist etwas murksig, aber es funktioniert und es war die Lösung, die ich ohne zu viel Aufwand realisieren konnte. Man muss allerdings vorher die serielle Schnittstelle initalisieren, z.B. einmal Hyperterminal aufrufen. Es gibt auch ein Dos-Kommando, hab aber den Syntax nicht mehr gefunden.
Gruss,
stochri
@Number5
Also wenn ihr so weit runter von dem Zeiten wollt ist wohl der weg über die platte der falsche dann müssten wir das mit dem speicher hin bekommen den laden und schreiben braucht zeit noch dazu im jpeg format da das gepackt und wieder entpackt werden muß.
Mike hat ja schon herausgekriegt, das man auch BMP-s laden kann. Es wäre natürlich sehr viel praktischer, die Bildaufname direkt in Scilab zu machen.
Hast Du Scilab schon installiert ?
Gerade eben habe ich ein Kommando gefunden
folgendes eingeben:
help link
Mit der Funktion "link" läst sich eine C-Routine direkt an Scilab anbinden. Ich denke mal es wird auch eine Möglichkeit geben, eine DLL-direkt anzusprechen, wenn man Dein Programm also in eine DLL umwandeln könnte ...
Gruss,
stochri
Nachtrag: hier ist beschrieben, wie eine VisualC++ DLL an Scilab angebunden wird:
http://www.cs.aueb.gr/users/yiannisk/aps/sci-bot-1.5-html/sci-bot/x6087.html
( Punkt 6.2.2.6. ziemlich weit unten )
wie ist den aus SciLab heraus ein Zugriff auf die serielle Schnittstelle möglich? Damit ich die ermittelten Daten auch irgendwie an die Ausenwelt übergeben kann.
Es gibt tatsächlich eine viel bessere Möglichkeit die serielle Schnittstelle mit Scilab anzusprechen:
http://www.scilab.org/contrib/displayContribution.php?fileID=295
NumberFive
19.03.2006, 16:38
die sip habe ich jetzt auch für die 4 version gefunden und runter geladen leider lässt sie sich nicht installieren weil die verwendete graphic treiber neuer ist und die alte finde ich nicht zum runter laden.
So ein m... jetzt hänge ich hier schon den ganzen nach mittag rum und habe kein zeil code hin gebracht ich habe nämlich eine Idee wie wird sehr schnell werden können. nur muß ich hier was zu testen haben.
Gruß
hi,
liegt das am Treiber deiner Graka oder an dem ImageMagick, weil davon könnte ich dir die richtige Version schicken.
MfG Jeffrey
PS: Ich hab mal ein eigenes Thema zur Formenerkennung aufgemacht https://www.roboternetz.de/phpBB2/viewtopic.php?t=18184
Hi jeffrey,
ich habe mir jetzt imagemagick runtergeladen aber ich kann Sip immer noch nicht installieren. Ich denke es ist die falsche Version imagemagick.
Könntest du mir vielleicht auch die richtige Version schicken?
MfG Mike
hi mike,
wenn du deine mail adresse angibst gern. du brauchst version 6.2.5-5
mfg jeffrey
so jetzt habe ich mal das zip file updatet.
jetzt müsst ihr nicht mehr auf das bild warten sonder könnt es euch holen.
Init() gibt ein zahl zurück merken !
die braucht ihr am ende
Mit GetBitmap() holt ihr ein neues bild auf die Platte wenn da 1 zurück kommt
Deinit(Zahl von vorher) räumt ihr wieder auf
Also da init und deinit immer nur einmal am anfang und am ende im sci file müsst ihr natürlich pfad angabe an passen. die dll's müssen ins selbe verzeichnis wie die exe.
Gruß
hää???
irgendwie versteh ich net was des bedeuten soll
NumberFive
20.03.2006, 10:47
Hallo Irgend wie hat mich gestern wohl das Forum durch einander gebraucht sehe erst heute deine Beiträge Komisch !?!?!
6.2.5-5 jo die Bräuchte ich auch.
Habe nämlich nur was neueres gefunden.
So es geht Auch Komplett Ohne Platte.
http://www.i-do-more.de/mine-robo/images/Screen1.jpg
Was verstehts du nicht ?
In dem sci file sind drei Funktionen drin Init GetBitmap und Deinit.
Init lädt die DLL
Deinit entlädt die DLL
GetBitmap() holt ein neues Bitmap
das ist dein Code Oder ?
while(1)
x=imread
if x=xalt
else
programm
xalt=x
end
den mußt du jetzt nur so ändern
Init()
while(1)
GetBitmap()
x=imread
programm
end
hi,
brauchst du die version 6.2.5-5 noch, dann aknn ich sie dir per mail schicken.
ich hab nur nicht verstanden um was es geht, weil du als gast geschrieben hast, und ich dann nicht wußte von welchen files du überhaupt redest.
mfg jeffrey
NumberFive
20.03.2006, 13:08
Ja die Brauche ich noch
So es geht Auch Komplett Ohne Platte.
Super Number5,
mit Deinem Programm duerfte sich der Roboter jetzt wesentlich schneller steuern lassen.
Wie ist denn die Bildwiederholrate, die man so hinkriegen kann ?
Gruss,
stochri
P.s.: koenntest Du das Programm in diesem Thread
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=15537
posten ?
Bei dem langen Thread hier ist es etwas schwierig, die richtige Seite zu finden, wenn man Deine Routinen herunterladen moechte. Der andere Thread ist sehr kurz und man kann ihn immer als Querverweis angeben.
hi number5,
irgendwie funktioniert das bei mir nicht. ich habe alle dateien nach d:\videocapture kopiert, und den vwérweis in get it geändert.
wenn ich init ausführe bekomme ich immer -1 zurück. wenn ich danach getbitmap mache kommt ein schwarzes bild heraus. muss die videocapture software laufen?
mfg jeffrey
NumberFive
22.03.2006, 08:00
ja das programm muß laufen sonst klappt das nicht. die dll unterhält mit dem Programm.
Rein Theoretisch sollten 20 - 40 FPS möglich sein je nach dem wie schnell die Platte ist. Komplett ohne Platte habe ich es noch nicht gemacht. bild auf der platte war immer die Kontrolle.
Ich müsste jetzt noch wissen wie das Graphic Tool das Bild in scilab ablegt das habe ich noch nicht so ganz kapiert.
Wie messe ich zeiten im scilab ?
@stochri
hast du auch ne windows kiste mit der du testen kannst ?
wenn jemand die Readme schreibt können wir ds gerne auch in dem Anderen Thread ablegen aber so ohne text wird es schwer es zu verstehen.
Gruß
hast du auch ne windows kiste mit der du testen kannst ?
Komme erst naechste Woche wieder an meinen Rechner.
Was mir aufgefallen ist:
- Dein Bad liegt neben dem Wohnzimmer O:)
- und das Bild ist schwarz/weis
Wird bei Deinen Routinen auch die Farb-Matrix mit uebertragen ? Warum brauchst Du eigentlich imread() ? Kann man das Bild nicht direkt mit GegBitmap() reinholen ?
@Mike
Halle Mike, wie sieht´s aus? was machen Deine Versuche ?
NumberFive
22.03.2006, 11:32
das geht wegen dem ablauf nicht den die Exe muß erstmal das Bild machen das stösst das GetBitmap an.
dann werden die daten in die dll kopiert und dann kann ich sie holen.
Wegen der daten menge habe ich erstmal mit scharzweiß gearbeitet.
True Color ist die nächste wenn ich mal verstanden habe wie der andere die daten ablegt. damit die funktionen weiter tun.
das imread brauche ich nicht mehr in der dll ist einfunktion die heist getGrayBitmap. nur die dll ist noch nicht stabil genung für den feld versuch.
gruß
hi,
bei mir funktioniert das ganze irgendwie nicht.
ich habe es jetzt so versucht:
a=Init();//bit immer -1 zurück
b=GetBitmap();//gibt immer 0 zurück
c=imread('stillcap.bmp');//allerdings wird stillcap garnicht erzeug, wenn ich die funktion BitMap() aufrufe
was mache ich falsch? ist es schlimm, wenn init öfters als einmal ausgeführt wird?
mfg jeffrey
NumberFive
22.03.2006, 12:36
nicht schlim aber verbraucht unnötig speicher.
wenn es funktioniert hat gibt GetBitamp 1 zurück.
Oh was vergessen zu schreiben inder INI gibt es eine neuen Parameter
USESCI=1 der sollte so aus sehen
immer erst das VideoCap starten dann init auf rufen dann sollte es gehen
Gruß
hi,
bei der neuen zip datei ist garkeine ini mit dabei. kann ich den einterag einfach bei der alten hinzufügen?
mfg jeffrey
NumberFive
22.03.2006, 13:29
der eintrag solte von allein erzeugt werden wenn du richtige version der exe hast
hi numberfive,
bei mir gibt es diesen eintrag nicht, und er wurde auch nicht erzeugt. wenn ich zuerst das programm und danach erstr scilab starte funktioniert es mit dem oben angegebenen code nicht, es wird immer -1 bei init u8nd 0 bei getbitmap zurückgegeben.
@mike
hi,
funktioniert das programm von number5 bei dir?
mfg jeffrey
NumberFive
22.03.2006, 13:55
habe zur sicher heit das zip file auf dem server noch updatet geht das jetzt ?
hi,
jetzt geht es, aalerdings benötigt der getbitmap befehl ca 20s für die ausführung. geht das bei dir schneller?
mfg jeffrey
NumberFive
22.03.2006, 19:29
bei mir ist die Zeit nicht war nehmbar die der befehl dauert hört sich so an als würde die Rückmeldung nicht klappen vom VideoCapture das Timeout zum warte ist 30 sec.
Komisch und der Parameter in der INI ist auf 1 ?
Gruß
Hi,
@Jeffrey, danke, danke für imagemagick. Hab jetzt alles installiert. Bin aber noch nicht zum testen gekommen. (Hoffe das es geht. Sonst müssen wir halt doch noch mal die 20mb Datei probieren)
@Stochri, hab noch keine Zeit gefunden weitere Versuche zu machen.Und Abends hab ich dann auch keine Lust mehr. Am Wochende versuche ich dann alles über Scilab4.0 zum laufen zu kriegen. Wenn ich vorher schon weiter mache melde ich mich natürlich.
MfG Mike
hi,
der parameter usesci ist 1, jpg und laufend sind 0, vielleicht funktioniert es nur mit jpg und nicht mit bmp, werde es bald mal testen.
mfg jeffrey
@Number5
Wie messe ich zeiten im scilab ?
Probiere mal
help realtime
da koennte es einen Querverweiss auf Zeitmessfunktionen geben.
Gruss,
stochri
hi,
ich habe es nochmal gestoppt. du hast recht. der befehl dauert genau 30s zur ausführung. das bild ist aber schon nach ca 1s auf der festplatte gespeichert. sowohl bei jpg als auch bei bmp.
vielleicht liegt es daran, dass ich eine farbkamera verwende.
mfg jeffrey
hi,
zeitmessen geht mit dem befehl
tic();
programm;
toc()
gibt die zeit zwischen tic und toc aus(in s).
deswegen so arg schnell wird es nie werden, weil nur um ein 640x480 bil einzulesen benötigt scilab schon 0.35s
mfg jeffrey
NumberFive
24.03.2006, 07:48
wenn die funktion so lange braucht dann klappt die rück meledung nicht und der Parameter ist wirklich auf 1 in dem INI file ?
function Demo
tic();
a=GetBitmap();
disp(a);
ColorArray = GetGrayBitmap(ColorArray,240,320);
t= toc();
disp(t);
endfunction
Das nenn ich schnell oder ?
-->Demo()
1.
0.047
Ok jetzt muß ich das noch für die farben machen.
das Bild wurde zur sicher heit aber noch auf der Platte
ab gelegt aber nicht geladen. Ich denke mit den Zeiten kann man was anfangen.
Kann jemand von euch gut englisch ?
Und kann mal die Jungs von sip was fragen ?
Mir Fehlt die definition von MaxRGB.
double factor = 1.0 / MaxRGB;
Damit ich die Bilder compatible in den speicher von scilab legen kann.
damit die Funktion weiter nutzen könnt auch wenn das bild von mir kommt.
wenn das geschafft ist. sollten wir viel schneller sein.
Reicht die Auflösung von 240X340 nicht ?
Gruß
Das nenn ich schnell oder ?
-->Demo()
1.
0.047
Die Geschwindigkeit waere super !
Mir Fehlt die definition von MaxRGB.
double factor = 1.0 / MaxRGB;
Wenn man ein Farbild mit
x=imread("bild.jpg");
laedt und danach den groessten vorkommenden Wert mit
max(x)
ueberprueft, erhaelt man 1.
D.h. die maximal vorkommenden Farbwerte sind auf 1 normiert. Du musst also den Faktor so waehlen, dass bei den hellsten Punkten eine 1 fuer die entsprechenden Farben uebergeben wird.
Bei Scilab ist die Matrix fuer ein Bild NxMx3 gross. Hier waere es von Vorteil, wenn man die Werte nicht als Fliesskomma, sondern als Byte Werte uebergeben koennte, dadurch wuerde sich die Speichergroesse gleich um den Faktor 4 reduzieren.
Bei Matlab gab es die Moeglichkeit 8Bit-Matrizen zu uebergeben. Weiss aber nicht, ob das bei Scilab auch geht und verkompliziert natuerlich die Programmierung etwas.
Reicht die Auflösung von 240X340 nicht ?
Meine Tests habe ich mit dieser Bildgroese gemacht, das spart auch Rechenzeit beim Auswerten.
Gruss,
stochri
hi,
das klingt ja echt gut. damit kann man echt einige bilder sdchaffen.
den befehl disp(a) und disp(t) brauchst du eigntlich nicht, lass einfach den strichpunkt hinter toc und gezbitmap weg, und das ergebnis wir gleich angezeigt, ist immer so, wenn man den strichpunkt weg lässt.
240x320 habe ich zum testen zum teil auch verwendet, sobald man aber dann die entfernung zur kamera erhöht wird das objekt zu klein. allerdings ist es schon mal ein riesen vortschritt, wenn es für 240x320 funktioniert.
mfg jeffrey
NumberFive
24.03.2006, 12:39
ich könnte die Farbwerte auch einem Integer übergeben das währe nicht das ding aber das passen die ganzen Funktionen aus der Libary ja nicht mehr.
Das wohlte ich eingendlich nicht.
Die Quelle aller daten ist immer ein array[240x320x3] of BYTE.
@stochri wann bist du wieder in deutschland ?
Bin das we unterwegs also jetzt weg vor Montag passiert also war scheinlich nicht viel.
Gruß
Bin das we unterwegs also jetzt weg vor Montag passiert also war scheinlich nicht viel
Gut, ich werde naechste Woche Deine Funktion ausprobieren.
Bis dann,
stochri
Hi,
ich habe Gestern alles über Scilab4.0 zum laufen gekriegt. Noch mal danke Jeffrey, imagemagick geht einwandfrei.
Jetzt gehen auch deine Orginalfunktionen Stochri. Asuro wird immer perfekt erkannt und das ohne LEDs und unter unterschiedlicher Beleuchtung.
Leider fährt er immer noch nicht an eine vorgegebene Position. Jetzt fährt er immer aus dem Bild. Kann es sein das vielleicht irgendwo y und x in der Funktion gopos vertauscht sind oder macht das nichts?
Übrigens verwende ich jetzt erstmal den Echtzeitzähler das funktioniert wunderbar.
MfG Mike
Jetzt fährt er immer aus dem Bild. Kann es sein das vielleicht irgendwo y und x in der Funktion gopos vertauscht sind oder macht das nichts?
Vielleicht steht Deine Kamera im Vergleich zu meiner auf dem Kopf oder in einem anderen Winkel. Kann das sein ?
Gruss,
stochri
Hi,
das könnte auch sein. Wie hast du denn deine Kamera positioniert?
Ich dreh sie einfach mal immer ein Stück weiter, vielleicht gehts dann.
MfG Mike
Hallo Mike,
mir ist eingefallen, dass die Drehung der Kamera ja eigentlich gar nichts bringen kann, da der ASURO ja nach der Kamera ausgerichtet wird. vielleicht kannst Du ja irgend wannn noch mal ein Bild vom Weg posten, den Dein ASURO beschreibt, bis er aus dem Bild fährt.
Was ganz anderes:
Wo habt ihr die Version von Image Magick 6.2.5 her ? Ich wollte das gerade probieren, musst aber leider auch feststellen, dass der Installer die neuere Version 6.2.6 anmeckert.
Gruss,
stochri
Hallo Number5,
jetzt habe ich mal Dein Programm ausprobiert. Das eigentliche Programm geht gut, aber mit der DLL habe ich etwas Probleme.
1. Files initialisieren:
exec getIt.sci
( fuer scilab waere es gut, fuer die Funktionsnamen nur Kleinschreibung zu verwenden, weil man die Funktionen ja so oft von Hand eintippen muss )
2.
Init()
ans: 16
3.
y=GetBitmap()
ans: 0
Getbitmap() liefertr also nur ein 0 zurück und kein Bild :-k
Auf der Platte wird das Farbbild aber abgespeichert.
Die vorigen Posts habe ich so verstanden, dass von GetBitmab() schon die Bildmatrix zurueckgegeben wird, liege ich da falsch ?
Gruss,
stochri
hi stochri,
bei mir ist es genauso, allerdings dauert getbitmap bei mir 30s. wie lange dauert der befehl bei dir?
mfg jeffrey
NumberFive
31.03.2006, 08:32
Na ganz so ist es nicht.
GetBitmap() lifert nicht das bild sondern erzeugt den Auftrag für ein neues.
Durch die Callback routinen und so maches andere klappt kein syncroner auf ruf. Es gibt zum bild holen dann eine eigene Funktion die ich aber noch nicht im Download habe da es nur zu schutz verletzungen kommt.
wir müssen erst mal hin bekomme das bei euch GetBitmap sicher eine 1 zu rück kommt da wir wissen das die Interprocess komuniktion klappt wenn das sicher geht schaffen wir die daten rüber.
Werde mal ein logging ein bauen damit wir sehen was bei euch so passiert.
Ich hoffe ihr arbeitet mit dann schaffen wir das sicher schnell.
Gruß
Hallo Number5,
GetBitmap() lifert nicht das bild sondern erzeugt den Auftrag für ein neues.
Durch die Callback routinen und so maches andere klappt kein syncroner auf ruf. Es gibt zum bild holen dann eine eigene Funktion
Das Beispiel für die Einbindung einer dll in scilab hast Du ja bestimmt schon gesehen
// matset
// Set element in mat at row and col to val.
// nrows is number of rows in mat. Shows row
// and col reference in a C function.
// REMEMBER: C row or col = Scilab row or col-1.
void matset_c(double *mat,
const int *nrows,
const int *row,
const int *col,
double *val)
{
mat[*row - 1 + (*col - 1)*(*nrows)] = *val;
}
Hier wird ja ein Pointer auf eine double matrix übergeben.
Wäre folgendes nicht einfach zu realisieren:
Beim ersten Aufruf von GetBitmap() wird die Call-Back Funktion aktiviert. Die schreibt dann ihre Werte an dei Stelle, auf die der Pointer zeigt.
Geht es eigentlich, dass ein Dll einen Speicherbereich für sich allokiert ?
Eine andere Frage: legst Du Deine Code offen ? Dann könnten ja vielleicht andere Leute noch mal einen Blick darauf werfen.
Ich habe die Frage nach einer Einleseroutine schon mal gestellt
https://www.roboternetz.de/phpBB2/viewtopic.php?p=161795#161795
und
michigrunf
scheint sich damit auszukennen.
Gruss,
stochri
NumberFive
01.04.2006, 11:06
Klar ein dll kann auch speicher für sich alokieren kein Thema.
GetGrayBitmap in der dll arbeitet genau mit dieser Funktion nur diese Funktion unterstützt und ein zwei dimensonales array und nicht ein drei dimensonales. Deshalb gibt es zur zeit auch nur das schwarz / weiß bitmap.
Das mit dem Code über lege ich mir mal. bin eigendlich da sehr offen aber habe immer die Angst das jemand mit meinen Ideen geld verdient. das würde mir nicht passen. Wenn wir alle hier nur unseren Spaß und erfolge haben dann soll mir das recht sein.
Werden jetzt erstmal noch das Tracen ein bauen damit wir mal gucken können was bei euch passiert.
Gruß
GetGrayBitmap in der dll arbeitet genau mit dieser Funktion nur diese Funktion unterstützt und ein zwei dimensonales array und nicht ein drei dimensonales. Deshalb gibt es zur zeit auch nur das schwarz / weiß bitmap.
Was hältst Du von folgendem Vorschlag:
Wenn es schwierig ist, ein 3 dimensionales Array zu übergeben, könnte man ja für's erste die 3 Farbebenen getrennt übergen, also jeweils eine Matrix für R,G und B.
Der Bildverarbeitungsalgorithmus ist leider voll auf Farben angewiesen.
Gruss,
stochri
NumberFive
01.04.2006, 12:47
die Farben kommen weil ich weiß das ihr /wir das brauchen da fällt mir schon was ein.
Aber erst mal muß die Komunikation auch bei euch klappen dann können wir weiter machen.
Habe jetzt mal die Dateien updatet. vielleicht finden wir so was los ist.
Wichtig: Die exe starten dann scilab starten und aus den getit.sci die init auf rufen. dann sollte GetBitmap ein 1 zurück geben. wenn wir das haben haben können wir weiter machen. im bin verzeichnis von scilab sollte jetzt ein log file auf tauchen von der dll.
Gruß
NumberFive
01.04.2006, 15:26
Also bei mir klapp das jetzt auch mit den Farb Array's leider stimmen
aber die von mir errechneten Farb werte nicht MaxRGB nicht nicht 255 aber damit kann man mit imshow das Bild erkennen.
Ich muß zugeben das ich echt nicht verstehe was die da rechnen für die Farbwerte.
Gruß
hi numberfive,
bei mir funktioniert es mit den aktuellen dateien auch.
mfg jeffrey
NumberFive
02.04.2006, 11:11
soure der DLL:
http://www.i-do-more.de/mine-robo/download/SourceDLL.zip
Gruß
Hallo Number5,
gerade habe ich Deine Funktionen mal ausprobiert.
1. zuerst Exe Programm starten
2. ins Verzeichnis wechseln, in der sich die Funktion getit() befindet
3. Scilab starten
4. exec getit.sci
5. Demo()
==> Error, weil GetBitmap() in Demo groß geschrieben
6. GetBitmap() kleinschreiben
== Error weil ColorArry unbekannt
7. testweise ColorArray erzeug mit ColorArray=ones(320,240)
8. Demo()
== Funktion kehrt nach 30 Sekunden zurueck, weiss nicht, wo ich das Bild finden kann, im ColorArray stehen immer noch die Einsen, die ich mit ones(320,240) erzeugt habe
Mir ist aufgefallen, dass Du zur Darstellung Matplot() verwendest. Das ist praktisch, weil man dann ImageMagik nicht braucht. Allerdings hat das meiner Meinung nach auch einen Nachteil: Das Colorarray besteht aus Werten, die eigentlich Pointer auf ein Farbtabelle sind, das bedeutet, man hat nich die getrennten R,G,B Farben.
Es ist zwar effizienter, ein Array mit Werten für die Farbtabelle zu uebertragen, aber für die Verwendung der Funktion rgb2hsv muss man die RGB Farben verwenden, d.h. eine 3d Matrix. Ich weis nicht, ob es eine Funktion fuer die Umwandlung gibt.
So weit erst mal,
stochri
Fuer Matlab gibt es eine Open-Source-Treiber, den ich schon einmal benutzt habe:
http://www2.cmp.uea.ac.uk/~fuzz/vfm/default.html
Das Matlab-Interface mueste eigentlich ziemlich ähnlich zum Scilab-Interface sein. Vielleicht kann man sich von diesem Treiber etwas abschauen.
NumberFive
02.04.2006, 21:38
ok ich habe die software in den stadium raus getan wo es sicher nicht einfach ist zu verstehen weil vieles nicht da steht.
Um die dll zu verwenden muß man erst init aufrufen aber nur einmal pro scilab session. da scilab die dll nicht mehr entlädt.
in meiner getit.sci tut einegenlich alles habe ich vielleicht bei letzten hoch laden die falsche rein.
mein demo zeigt nur das schwarz weiß bild den es verwendet die GetGrayBitmap. das lieder ein Array mit den grau werten 0- 255 das sich relativ leicht mit Matplot anzeigen lässt.
GetColorBitmap gibt es da auch noch mit der wollte ich eineglich ein
ImageMagik kompatiles bitmap erzeugen. Andem ich gescheitert bin wie man an meinen Letzten post gesehen hat.
Die Funktion bringt ein Array von (240,340,3) zurück also ein Array für Rot Grün Blau so wie du es Möchtest. Leider habe ich dein source für die Bilderkennung noch nicht so verstanden weil ich auch erst mal das bild hol problem lösen wollte, das ich jetzt nicht dein Alogrytmus so schnell um setzen konnte. Wenn du jetzt sagst das es dann sogar einfacher wird umso besser.
Zur Zeit wird der Farbwert mit 1/255 multipilziert so kannst du mit imshow das Bild ansehen auch wenn die farben nicht ganz passen.
GetColorBitmap sollte das sein was du brauchts. den Hier ist das Array schon in der Farbe gespalten. Halt mit werten zwischen 0 und 1.
1,1,1 = Bildpunkt ecke Frabwert für Rot
1,1,2 = Bildpunkt ecke Farbwert für gruen
1,1,3 = Bildpunkt ecke Farbwert für Blau
wenn getbitmap oder das Demo 30 sekunden Brauchen hat die Komunikation zum Video Programm nicht funktioniert.
USESCI=1 muß in der ini vom VideoProgamm stehen.
init() baut die verbindung auf
getbitmap() holt ein Bitmap auf die Platte und kopiert die daten in den speicher der dll.
Test = GetGrayBitmap(240,320) Holt das bitmap in das Test arrayund es hat farbe werte 0 -255 (Graustufen).
Test = GetColorBitmap(240,320) Holt das bitmap in das Test Array getrennt nach faben aber mit den werten 0-1 wie oben beschrieben.
habe fest gestellt im download war wirklich das falsche getit.sci habe das gerade korregiert.
Wenn du das Videoprogramm über ein verkünfung startest bitte darauf achten das das auführen in aus das richtig verzeichnis zeigt dort liegt dann
auch das bild
Gruß
NumberFive
02.04.2006, 21:49
Ich habe nicht das problem das Array nach scilab zu bekommen sondern es ImageMagik compatibel zu bekommen weil ich da von aus gegangen bin das das so sein muß und weil ich dann die anzeige Funktion von denen mit benutzen zu können und die anderen Funktionen wollte das rad ja nicht zwei mal erfinden.
Was macht rgb2hsv ?
Gruß
Hallo Number5,
verstehst Du die 2 unterschiedlichen Verfahren? In Deinem Programm werden eben Werte für ein Farbtabelle uebergen, dazu braucht man eben nur eine 2D-Matrix. Eigentlich sollte das Array aus Integer-Werten bestehen, weil Indixes in eine Tabelle logischerweise Integer-Werte sind.
Aber vielleicht habe ich ja noch Deine alte Version ausprobiert, muss erst mal die neue Version ausprobieren.
getbitmap() holt ein Bitmap auf die Platte und kopiert die daten in den speicher der dll.
??? ich dachte, Du wolltest die Platte umgehen ?
Was macht rgb2hsv ?
RGB to HSV wandelt ein Bild vom Rot-Gruen-Blau Farbraum in den Farbton-Sättigungs-Helligkeitsfarbraum.
http://de.wikipedia.org/wiki/HSV-Farbraum
Die Betohnung lieg hier auf Helligkeit. Wenn man alle Werte der Helligkeitsebene auf 1 setzt, erhellt man ein helligkeitsnormiertes Bild, also alle Farben gleich hell.
Ich habe hier leider keinen Speicherplatz mehr frei, sonst würde ich ein Bild posten.
Du kannst es aber auch einfach mal selber ausprobieren.
1. Bild mit rgb2hsv umwandeln
2. Helligkeisebee auf 1 setzen.
3. Bild mit hsv2rgb zurückwandeln und anzeigen
Gruss,
stochri
NumberFive
02.04.2006, 22:15
das speichern auf der platte kann man demnächst ab stellen ist für mich bei entwicklen nur nicht ganz unwichtig da ich so ein kontroll bild habe zum vergleichen.
Nein die DLL kann beides ein grau stufen array also ein Farbwert von 0 - 255
und somit eine 2D Matrix und ein Farbiges 3D array wo die werte für die Grundfarben übergeben werden.
Leider werden aber in ImageMagik nicht die normal Üblichen Farbwerte ververwendet sondern zahlen zwischen 0 und 1.
Normal ist die zahl zwischen 0 und 255 für die Intesität der farbe bei 24 Bit Bitmap's. Also R=255 G=255 B=255 ist normaler weise ein schwarzer punkt bei ImageMagik ist der R=1 G=1 B=1 und das verstehe ich nicht.
Ich arbeit nie mit ein Farbtabelle das ist viel zu umständlich. Also 1 Byte für Graustufen (256) oder drei Byte für RGB = 24Bit Farbtiefe.
Bin da bis jetzt auch immer gut gefahren damit.
Gruß
Leider werden aber in ImageMagik nicht die normal Üblichen Farbwerte ververwendet sondern zahlen zwischen 0 und 1.
Normal ist die zahl zwischen 0 und 255 für die Intesität der farbe bei 24 Bit Bitmap's. Also R=255 G=255 B=255 ist normaler weise ein schwarzer punkt bei ImageMagik ist der R=1 G=1 B=1 und das verstehe ich nicht.
Es ist kein Problem, wenn Werte von 0-255 uebergeben werden, die kann man ganz schnell auf 0-1 normieren
y=x/255;
oder
imshow(x/255);
oder eine automatische Normierung
imshow(x/max(x))
Ich arbeit nie mit ein Farbtabelle das ist viel zu umständlich
Das finde ich auch, aber in der Version Deines Programms, das ich habe, verwendetst Du Matplot. Und Matplot zeigt ein 2-D Farbtabellenarray an und keine 3-D-RGB-Matrix, oder sollte ich mich da täuschen ?
Hast Du Dir den Wikipedia-Artikel, den ich oben gepostet habe, mal angeschaut ?
http://de.wikipedia.org/wiki/HSV-Farbraum
Gruss,
stochri
NumberFive
02.04.2006, 22:47
das demo zeig ein schwarz weis bild (grausstufen) und dann kommt man ja locker mit einer 2D matrixs aus so war das mit matplot ganz einfach kenn nämlich eine color platte mit 256 grau stufen. das mach übriges ImageMagik genau so.
Wenn deine deine behauptung stimmt müsste doch eingenlich meine berechung stimmen und wenn ich dann die werte in der dll so berechne imschow das richtig an zeigen leider ist dem nicht so es muß noch was anderes gemacht werden.
Ich rechne in der dll Faktor = 1/255 und dann G= Faktor * g. g= Farbwert für Grün im Orgnial bild max. 255.
den link lese ich morgen den jetzt muß ich ins bett.
Freudin wartet *g*
Gruß
hi,
die anzeige bei imagemagick sieht immer komisch aus. bei mir sind die scilabwerte genau die normalen rgbwerte*255, hab es mal nachgerechnet für einzelne pixel. probier doch mal, wie das bild aussieht, wenn du es mit imread einliest und mit imshow darstellst.
oder wenn du das mit getbitmap bekommene bild mit imwrite speicherst und mit einem normalen bildbetrachtungsprogramm anschaust.
bei mir kommt mit getgraybitmap ein gutes bild raus. mit getcolorbitmap funktioniert es bei mir nicht, da kommt drei mal ne meldung mit getgraybitmap, wenn ich dann die eintäge anschaue steht in allen 0 hoch inf drin.
mfg jeffrey
Hallo Number5,
wie sieht's aus, bist Du schon weiter gekommen ?
Gruss,
stochri
NumberFive
10.04.2006, 07:12
Hallo,
leider bin ich nicht weiter gekommen da ich in der firma völlig land unter war. Die habe die halbe entwicklungsabteilung entlassen und jetzt herrscht ziemlisches chaos. Und arbeit gibt es des wegen auch nicht weniger. Mich persönlich hat das auch ganz ordendlich runter gerissen auch wenn ich persölich nicht betroffen war.
Also gebt mir ein bisschen zeit mich wieder zu sortieren.
Gruß
NumberFive
22.04.2006, 09:46
Ich muss zu geben das ich die Formel bei dem HSV nicht so wirklich verstehe.
Zum Mindestens im moment.
wenn ich das richtig verstanden habe funktioniert Matplot ein bisschen anders du kannst für die farbe ein array mit geben das die selbe strucktur aus weist also ein drei faches array dann mach er ein vergleicht wenn er den wert finde nimmt er die farbe die dahinter steht. um den punkt da zu stellen. werde jetzt mal wieder ein bisschen probieren
Gruß
machmal ist man einfach blind.
kein wunder das das ColorBitmap immer so komisch aussah wenn man ein Farbwert unterschlägt. Habe die Files Updatet jetzt funktioniert bei mir alles.
mit init starten.
Demo zeigt ein Schwarz weiß Bild
Demo2 Zeigt ein Buntesbild.
Kennt jemand einen guten raus filter (C++)
Gruß
NumberFive
22.04.2006, 10:59
der letzte Post war von mir
NumberFive
23.04.2006, 10:45
Hallo so ich wollte jetzt mal ein bisschen rot suchen aber das ergebnis ist mir nicht so ein leuchten
http://www.i-do-more.de/mine-robo/images/Screen2.jpg
function FindRed(ColorArray)
betrag=sqrt(ColorArray(:,:,1).*ColorArray(:,:,1)+C olorArray(:,:,2).*ColorArray(:,:,2)+ColorArray(:,: ,3).*ColorArray(:,:,3))+1;
red=ColorArray(:,:,1)./betrag;
xset('window',1);
imshow(red);
bw=im2bw(red,0.90);
xset('window',2);
imshow(bw);
//[ycp xcp]=centroid(bw)
//x=drawcross(x,xcp,ycp);
//xset('window',3);
//xbasc imshow(x);
endfunction
Gruß
Hi,
ich versteh nicht ganz, warum du beim Betrag am Ende +1 machst. wenn ich dein Programm richtig verstehe soll es so funktionieren, dass du rot durch den Betrag teilst, und das 1 ergibt, wenn nur rot da war, und die anderen 0 waren. Setz doch mal deinen Schwellenwert etwas runter.
aber ich denke es funktioniert besser, wenn man das bild zuerst im hsv Raum auf volle Helligkeit stellt und dann wieder in den rgb Raum geht.
Du kannst auch mal versuchen anstatt mit dem Betrag mit der Differenz zu rechnen, indem du blau und grün von rot abziehst, eventuell noch mit Gewichtungsfaktoren.
Funktioniert es eigentlich bei deinem Programm, wenn ich die Arraygröße auf 640x480 stelle, oder funktioniert das mit der dll nicht, weil ich eigentlich ein größeres Bild verwenden möchte.
Wie machst du die Bildausgabe?
Mir ist die Scilabbildausgabe zu langsam, auserdem stürzt die irgendwann ab, wenn man zu viele Bilder in ein Fenster übereinander zeichnet. Weil ich möchte mein Bildausgabe nach jedem Programmdurchlauf aktuallisieren, damit ich immer sehe, wie die Bilderkennung funktioniert.
Ich habe bisher immer in die gleiche Datei gespeichert, aber ich habe noch kein Bildbetrachtungsprogramm gefunden, welches ständig das Bild aktuallisiert.
MfG Jeffrey
NumberFive
27.04.2006, 07:13
Hallo jeffrey,
die DLL kann mit ein grösseren Bild format nicht umgehen. an der stelle ich einfach noch zuviel hardcodiert. Ich denke das man das Umbauen könnte.
Ich muß zu geben das ich den algo zum rot suche einfach kopiert habe aber nicht verstanden das ist wohl das problem. du hast die Bild ausgabe mit scilab ist sehr langsam hat mich auch schon geärgert / genervt nur so konnte ich sicher sein das die daten stimmig sind. Könnte ja noch ein funktion in die DLL machen das man dort bilder anzeigen kann was hälst du davon. Im gegezug hilfst du mir bei verstehen des algo. ich denke nämlich wenn den passenden dann hat un den in c++ aus programmiert das er dann schneller sein müsste. Das bild über die Platte anzuzeigen halte ich für nicht sin voll.
Reicht ein Bildanzeige Fenster oder braucht man mehr ?
Gruß
Hi,
bei mir funktioniert es übrigends immer noch nicht, sowohl demo als auch demo2 geben ein schwarzes bild aus. demo gibt 0.02 zurück, demo2 0.09
leider sind meine ganzen scilab dateien gelöscht worden, so dass ich jetzt alle bildverarbeitungs sachen nochmal programmieren muss.
der algorithmus den du verwendest ist nicht von mir, aber ich hab ja oben scho geschrieben, was ich denke, wie er funktioniert.
mfg jeffrey
edit:
zum thema bildausgabe: wäre es möglich das direkt in videocapture einzubauen, so dass z.b links ein bild aktuallisiert wird, und rechts das bild der kamera läuft, dann kann man es gut vergleichen
NumberFive
27.04.2006, 19:54
also das wird nicht klappen aber ds fenster kannst du ja dann danehmen schieben das ist dann fast das gleiche.
Hallo Zusammen,
aus irgeneinem Grund habe ich keine Benachrichtigungsmail gekriegt, dass der Thread weiter geht. Ist es vielleicht, weil zuviel Zeit seit dem letzen Posting vergangen ist ?
ich versteh nicht ganz, warum du beim Betrag am Ende +1 machst. wenn ich dein Programm richtig verstehe soll es so funktionieren, dass du rot durch den Betrag teilst, und das 1 ergibt, wenn nur rot da war, und die anderen 0 waren. Setz doch mal deinen Schwellenwert etwas runter.
Die +1 verhindert die Division durch Null und damit ein Programmende, wenn die Helligkeitswerte alle Null sind.
Ansonsten ist die Transformation von RBG nach HSV natürlich einfacher. Obigen Programmteil hatte ich nur gepostet, weil Mike in seiner Scilab-Version kein rgb2hsv hatte.
Ansonsten:
Eine schneller Bildausgabe als die in Scilab eingebaute wäre sehr nützlich.
Gruss,
stochri
NumberFive
28.04.2006, 08:58
So habe jetzt noch mal die Dateien Aktualiesiert.
Die dll schreibt jetzt ein lock file (C:\) damit wir endlich raus bekommen
warum das bei euch nicht tut.
@jeffrey ein auto start ist nicht Nötig (Bitmapablage) wenn getBitmap auch bei dir Tut. damit mache ich die Funktion nicht. Auch das Ändern der Größe mache ich erst dann wenn alles tut. Bitte verstehe mich erst die grundfunktion sicher dann die Küre.
Wann muß du abgeben ? bekomme ich das Ding zu lesen ?
Gruß
hi,
die studienarbeit muss bis zum 14.5.06 gebaut und programmiert sein, geschrieben wird sie dann danach. deswegen bin ich etwas unter zeitdruck. das problem ist, dass bei mir videocapture standartmaßig mit 640x480 startet, und man deshalb immer die auflösung umstellen muss. und später soll das projekt ohne meine betreuung laufen, und deshlab sollte man da so wenig wie möglich umstellen müssen, deshlab meine fvrage nach dem autostart, weil besser es funktioniert mit einem bild pro sekunde, als gar nicht.
mfg jeffrey
Hallo Number5,
hast Du mittlerweile die Rot-Extraktion aus dem Bild geschaft ? Falls nicht, hier mal ein Code-Beispiel:
x=shotpicture();
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);
bw=1-im2bw(colorerror,0.3);
xset('window',2);
xbasc
imshow(bw);
damit sollte es eigentlich funktionieren. ( shotpicture durch Deine Bildaufnahme ersetzen ). Poste doch mal das Ergebnis, wenn's klappt.
@jeffrey
beim wiederholten Zeichnen des Bildes sollte man das vorherige Bild mit xbasc ( siehe Beispiel ) löschen, dann sollte die kontinuierliche Bilddarstellung ohne Absturz gehen.
Was ist denn das Thema Deiner Studienarbeit ?
Gruss,
stochri
@number5
hi number5,
jetzt geht es bei mir, macht jetzt allerdings immer das analyse debug fenster auf.
@stochri
hi stochri,
bei meiner studienarbeit muss ich einen roboter bauen, der auf einer fläche von 3x3 meter fährt ohne irgendwo anzustoßen, außerdem durch künstliche maisreihen fährt und noch in geraden linien hin und her fährt. zusätzlich muss er wenn sein akku leer wird automatisch zurück zur ladestation fahren. der roboter bekommt noch eine kamera, die ein bild per funk zu einem pc überträgt. dort läuft dann eine bilderkennung und auswerteung, das ergebnis wird dann wieder zum roboter geschickt.
das ganze soll als demonstationsstand auf das wissenschaftsschiff ms wissenschaft und werbung für die uni hohenheim und www.fieldrobot.com machen. deswegen soll das ganze auch möglichst automatisch starten, wenn man den rechner einschaltet, ohne dass man noch großaertig eionstellkungen machen muss. wie kann man einer verknüpfung zu einer scilab datei sagen, dass die datei ausgeführt werden soll und nich im editor geöffnet werden soll?
mfg jeffrey
NumberFive
29.04.2006, 02:12
will sehen was ich tun kann.
kannst es vielleicht ja testen und mir das Log per Mail schicken.
will ja nicht da du probs wegen mir hast. Aber ich kann nix versprechen.
da ich jetzt gleich auf die Arbeit muß und ich nicht weiß wann ich dieses we wieder heim komme.
Gruß
deswegen soll das ganze auch möglichst automatisch starten, wenn man den rechner einschaltet, ohne dass man noch großaertig eionstellkungen machen muss. wie kann man einer verknüpfung zu einer scilab datei sagen, dass die datei ausgeführt werden soll und nich im editor geöffnet werden soll?
Genau weis ich das leider auch nicht. Ich könnte mir aber 2 Möglichkeiten vorstellen:
1. kleines Batchfile schreiben ( test.bat)
scilab wunschdatei.sci
2. Für Scilab git es ein startup file, das scilab am anfan initialisiert.
Dort einfach am Ende die Wunschdatei eintragen, dann sollte sie beim Start automatisch loslaufen.
Gruss,
stochri
Hi,
also die Bildaufnahme funktioniert jetzt in Farbe und in Grau. Jetzt sollte halt die debug Funktion wieder weg, da das Fenster doch etwas stört.
Danke für den Tipp mit der Start file, wenn ich da exec irgendwas anfüge, wird die Datei beim starten von Scilab automatisch ausgeführt.
Jetzt muss ich nur noch eine Verknüpfung zu Scilab in den Autostart kopieren und das Programm startet sobald der PC an geht.
MfG Jeffrey
NumberFive
30.04.2006, 08:12
@jeffrey
ich denke du woltest ein fenster wo du hin zeichen kannst.
das war der erste Teil da zu. ich wollte jetzt in die dll noch ein funktion rein machen das du dort dein bild anzeigen kannst.
Ok die debug funktion mache ich abschalt bar (log datei). Was ist mit dem Fenster ?
Gruß
hi,
ok, die debug funktion an sich stört mich nicht, ich dachte das fenster würde da dazu gehören. ich habe mir die ausgabe jetzt über die festplatte gemacht, indem ich das bild immer mit dem gleichen namen gespeichert habe und dann eine html seite gemacht, die sich jede sekunde aktuallisiert. für meine zwecke reicht das also erst mal. also ^wegen mir musst du dir da keinen zusätzlichen aufwand deswegen machen.
ich perönlich würde es dann eher sinnvoll finden, wenn man auch größere bilder verwenden könnte, z.b. 640x480.
aber das programm ist so auch schon super, danke für das was du da programmiert hast.
mfg jeffrey
PabloEscoba
11.05.2006, 08:23
HAllo
Kann mir vieleicht nochmal einer zusammenfassen welche Software bzw Tools ich bracuhe damit ich eure schritte ein wenig nachvolziehen kann
Thx Pablo
NumberFive
25.05.2006, 09:12
Du brauchst:
SciLab 4.0
ImageMagick 6.2.5 Q16
Und meine Software die Gibt es hier:
www.i-do-more.de/mine-robo/download/VideoCapture.zip
Es ist ein bissle Fummel arbeit bis es läuft aber dann machst spass.
Viel Glück
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.