Leih es dir doch in der Bücherei!!
Ich habs mir in der Uni-Bücherei ausgeliehen...
wenn das mal nicht so teuer wäre....
leider!
mfg
Leih es dir doch in der Bücherei!!
Ich habs mir in der Uni-Bücherei ausgeliehen...
Unwissenheit ist ein Segen
Hi,
hab ne Frage:
Wie kann man ein Webcambild in eine Applikation einbauen?
Gruß Michi
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:
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.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(); } };
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...
-> MEIN PROJEKTBLOG <-
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
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.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)))
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
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.
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...
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!
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?
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...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.
ja, den hatte ich auch getestet. ich hab den anderen ausEin 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.
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...
-> MEIN PROJEKTBLOG <-
Das ist aber genau der falsche Weg, vor dem ojmjakon gewarnt hat.Zitat von Goblin
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 -
Lesezeichen