- Labornetzteil AliExpress         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 33

Thema: Java: Objekterkennung für Anfänger

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    15.09.2005
    Alter
    94
    Beiträge
    11
    Anzeige

    LiFePo4 Akku selber bauen - Video
    wenn das mal nicht so teuer wäre....
    leider!
    mfg

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.10.2004
    Ort
    Rheinstetten
    Alter
    41
    Beiträge
    357
    Leih es dir doch in der Bücherei!!

    Ich habs mir in der Uni-Bücherei ausgeliehen...
    Unwissenheit ist ein Segen

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hi,
    hab ne Frage:
    Wie kann man ein Webcambild in eine Applikation einbauen?
    Gruß Michi

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    In Java? Schau dir mal folgenden Link an:

    http://ltu164.ltu.edu/itseng/version.htm

    damit hats bei mir auch geklappt. Ich hab jetzt allerdings nen neues Problem: Ich hab mein Webcambild in ein Schwarzweissbild umgewandelt und die RGB-Werte jedes Pixels in ein int[][] gespeichert. (Genauer gesagt nur einen Wert, weil bei einem S/W-Bild ja R = B = G ist. Auf diesem Array wollte ich nun verschiedene Operationen testen, als erstes den Sobel.

    Hier der Code:

    Code:
    ActionListener sobelmebaby = new ActionListener()   {
    					
    					
    					public void actionPerformed(ActionEvent e) {
    						int [][] sobelarray = new int[grayImage.getWidth()][grayImage.getHeight()];
    														  
    						for(int i = 0;i<grayImage.getWidth();i++){
    							for(int j = 0;j<grayImage.getHeight();j++){
    								sobelarray [i][j] = (((grayImage.getRGB(i,j))>>16& 0xFF)+0);
    							}
    						}
    						
    						//Faltungskern:
    						//11,12,13
    						//21,22,23
    						//31,32,33
    						
    						int sobel_11 = 0;
    						int sobel_12 = -1;
    						int sobel_13 = 0;
    						int sobel_21 = -1;
    						int sobel_22 = -4;
    						int sobel_23 = -1;
    						int sobel_31 = 0;
    						int sobel_32 = -1;
    						int sobel_33 = 0;
    						int workpixel;
    						
    						if(grayImage != null){
    							for(int i = 2;i<318;i++){
    								for(int j = 2;j<238;j++){
    									//System.out.println("i: "+i+" ,j: "+j);
    									sobelarray[i][j] = sobelarray[i][j] + sobel_22;
    									
    									sobelarray[i-1][j-1] = sobelarray[i-1][j-1] + sobel_11;
    									sobelarray[i][j-1] = sobelarray[i][j-1] + sobel_12;
    									sobelarray[i+1][j-1] = sobelarray[i+1][j-1] + sobel_13;
    									sobelarray[i-1][j] = sobelarray[i-1][j] + sobel_21;
    									
    									sobelarray[i+1][j] = sobelarray[i+1][j] + sobel_23;
    									sobelarray[i-1][j+1] = sobelarray[i-1][j+1] + sobel_31;
    									sobelarray[i][j+1] = sobelarray[i][j+1] + sobel_32;
    									sobelarray[i+1][j+1] = sobelarray[i+1][j+1] + sobel_33;
    																							}
    													}
    							
    							
    											 
    						for(int i = 2;i<320;i++){
    							for(int j = 2;j<240;j++){
    								workpixel = sobelarray [i][j];
    								Color farbe = new Color (workpixel,workpixel,workpixel);
    								grayImage.setRGB(i,j,farbe.getRGB());
    													}
    												}
    						}
    						System.out.println("Sobeling... done");
    						outcanvas.repaint();
    					 }
    					};
    Also als erstes wird halt das Array aus dem Grayimage (ein BufferedImage als BYTE_GREY) erzeugt. Dann die Sobel-Operationen am Array vorgenommen und dann das Array wieder in das BufferedImage geschrieben. Ich gehe den Weg über das Array, weils übersichtlicher und Afaik auch schneller ist.

    Ich hab nun schon verschiedene Faltungskerne aus dem www probiert, darunter auch den von Wikipedia und bin bisher nur zu dem Ergebnis gekommen, dass das Bild von Schritt zu Schritt dunkeler wird... Bis mir irgendwann die Farbwerte von Color "out of bounds" gehen. Was ist an meinem Code falsch, dass das nicht funktioniert...? Ich vermute es liegt daran, WIE ich die Sobel-Faltung vornehme...

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    15.09.2005
    Alter
    94
    Beiträge
    11
    Also wenn Du Dir Deinen Code ansiehst, siehst Du ja, daß für jeden Pixel die Werte desselben und die der umgebenden ständig dekrementiert werden.
    Ein Sobel sieht meines Erachtens so aus
    für Horizontal
    1 2 1
    0 0 0
    -1 -2 -1
    und für Vertikal
    1 0 -1
    2 0 -2
    1 0 -1.
    Du willst ja die Kanten betonen. Die daraus entstehende Formel wendest du nur für den akutelle Pixel, also den Mittelpunktpixel an.
    Für ein skalierung, damit die Werte sich nicht zu stark verändern und in der Summe eins bleiben, kannst du 0.166 statt 1 und 0.333 statt 2 nehmen

    Code:
    double horiSobel = 0;
    double vertSobel = 0;
    
    vertSobel += sobelarray[i-1][j-1] * -0.1666;
    vertSobel += sobelarray[i-1][j  ] * -0.3333;
    vertSobel += sobelarray[i-1][j+1] * -0.1666;
    
    vertSobel += sobelarray[i+1][j-1] * 0.1666;
    vertSobel += sobelarray[i+1][j  ] * 0.3333;
    vertSobel += sobelarray[i+1][j+1] * 0.1666;
    
    horiSobel += sobelarray[i-1][j-1] * -0.1666;
    horiSobel += sobelarray[i  ][j-1] * -0.3333;
    horiSobel += sobelarray[i+1][j-1] * -0.1666;
    
    horiSobel += sobelarray[i-1][j-1] * 0.1666;
    horiSobel += sobelarray[i  ][j-1] * 0.3333;
    horiSobel += sobelarray[i+1][j-1] * 0.1666;
    sobelarray[i][j] = 360.0/(2.0*pi(atan(vertSobel / horiSobel)))
    Am Ende stehts hier mir dem Arcustangens, musst mal sehen wie die Werte berechnet werden,wichtig scheint die aber Fließkommaarithmetik zu sein und nicht nur Integerwerte.
    Du kannst auch nur die horiSobel- oder vertSobel-Werte in deine Matrix eintragen lassen. Dann hast du jeweils die horizontale und vertiakel Komponente. Auf jeden Fall funktioniert es so wie in Wikipedia beim Canny Operator beschrieben.
    Wenn du mal verschiedene Faltungen unter Photoshop ausprobieren unter Filter/Sonstige Filter/Eigener Filter

    Fragen?

    mfg

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    15.09.2005
    Alter
    94
    Beiträge
    11
    ah wichtig, du musst alle Sobelwerte erstmal in einer Matrix zwischenspeichern, Du willst ja nicht, daß bereits geänderte Werte der Nachbarpixel in die Berechnung des aktuellen Pixels mit einfließen. WEenn Du alle Pixel berechnet hast, kannst du sie in deine entgültige Matrix überschreiben.

  7. #17
    Gast
    ah, ok. ein weiteres prob war imho dass ich nen rgb-image und kein hsb genommen hab. afaik sobelt man auf dem b-kanal von hsb...

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.01.2004
    Alter
    35
    Beiträge
    645
    Allso meine Erfahrungen sind besser wenn man nicht vom Hue Kanal des HSB sobelt.
    In meiner Galerie befinden sich 2 Screenshots von einem Programm, dass ich mal geschrieben habe. Eins direkt vom rgb gesobelt, und eins vom Hue Kanal... Als Faltungskern wurden der vert + horz Sobeloperator addiert.
    Schauts euch mal an...
    MfG Xtreme
    RP6 Test - alles zum Nachfolger des bekannten RP5 im neuen RP6 Forum!

  9. #19
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    mmmm stimmt, das mit dem rgb is in der tat gut... ich habs nun so gemacht, dass ich halt aus nem bunten rgb nen s/w-rgb mache (R = B = G) und von jedem pixel den R-wert (ginge auch jeder andere) raushole und in nen array packe. dann sobel ich wie oben im code zu sehen. weiss jemand ob man in java 2 arrays of array direkt verwurschteln kann, damit ich den faltungskern nicht manuell einzeln verrechnen muss?

    ah wichtig, du musst alle Sobelwerte erstmal in einer Matrix zwischenspeichern, Du willst ja nicht, daß bereits geänderte Werte der Nachbarpixel in die Berechnung des aktuellen Pixels mit einfließen. WEenn Du alle Pixel berechnet hast, kannst du sie in deine entgültige Matrix überschreiben.
    weiss nicht genau, wie du das meinst. ich berechne ja alle werte, die unter dem faltungskern liegen und dann schreib ich sie direkt wieder ins gesamtarray. dann wird der kern verschoben und wieder verrechnet...

    Ein Sobel sieht meines Erachtens so aus
    für Horizontal
    1 2 1
    0 0 0
    -1 -2 -1
    und für Vertikal
    1 0 -1
    2 0 -2
    1 0 -1.
    ja, den hatte ich auch getestet. ich hab den anderen aus

    http://www-user.tu-chemnitz.de/~niko...l/tutorial.pdf

    ich muss mir das mit der faltung im allgemeinem nochmal anschauen, ich glaub ich (=mathe-noob) hab das noch nicht ganz kapiert...

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.11.2003
    Ort
    Chemnitz
    Alter
    43
    Beiträge
    129
    Zitat Zitat von Goblin
    weiss nicht genau, wie du das meinst. ich berechne ja alle werte, die unter dem faltungskern liegen und dann schreib ich sie direkt wieder ins gesamtarray. dann wird der kern verschoben und wieder verrechnet...
    Das ist aber genau der falsche Weg, vor dem ojmjakon gewarnt hat.
    Du musst die Ergebnisse des Faltungskerns in ein temporäres Array schreiben und das Originalbild unverändert lassen, bis du mit dem Faltungskern komplett durch das Bild gelaufen bist. Sonst gehen ja die geänderten Werte der schon berechneten Pixel mit in die Faltungsergebnisse der anderen Pixel ein.
    Grüße,
    zefram

    --
    www.roboking.de - Jetzt bis zum 31. Mai 2007 anmelden für die fünfte Runde des großen Roboterwettbewerbs für Schüler aus Deutschland, Österreich und der Schweiz -

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests