PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java and images 2



nomad
14-02-2002, 14:53
huubs da ist was mit dem anhaengsl was passiert
hier nochmals von neuem.

hi leute,

hab ein kleines problemchen
mit java.
das programm kann mit hilfe der maus,
im bild pro prixel die farbe (rgb) erkennen.
da die bilder von einer webcam kommen (win & logitech),
hab ich nur die jpgfiles.
klappt auch alles prima.
nur moechte ich nicht nur ein bild testen sondern
sondern, mehrere bilder.
in der form
" armImg=new Image[10];
MediaTracker mt = new MediaTracker(this);
Toolkit tk = getToolkit();
int i = 1;
do
{
armImg[i-1] = tk.getImage("c:/Dokumente/QuickCam/AutoCapture/arm"+1+".jpg");
mt.addImage(armImg[i-1],0);
actimage = -i;
++i;
repaint();
}(while.....
"
/**

// test.java -achtung- pgm ist lauffaehig mit javac test.java , run java test



import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;

public class test
extends Frame
{
public static void main(String Args[])
{
test wnd = new test();
wnd.setSize(600,600);
wnd.show();
}

public test()
{
super("PixelGrabber vers. 0.0.4.1.4.8.");
Label label = new Label();
add("North", label);
add("Center", new ImageCanvas(getToolkit().getImage("armbild1.jpg"),label));
boolean DONE; // for notclear the right scanning pic
DONE = false; // after scanning
//WindowListener
addWindowListener(
new WindowAdapter()
{
public void windowClosing(WindowEvent event)
{
setVisible(false);
dispose();
System.exit(0);
}
}
);

}
}

class ImageCanvas extends Canvas
{
Image image;
Label label;
int[] pixels;
int targetPixelValue;
Color col;
Color picCol;
Color picCol_1;
int antx,anty,b_antx,b_anty;
int count, clicked;
int bc;
boolean InClicked;
boolean OutClicked;
boolean paintTargetPixels;
boolean doneCalibrate;
boolean DONE;
boolean timeout;
boolean targetFound;

ImageCanvas(Image image, Label label)
{
this.image = image;
this.label = label;
}


void paintPixels(Graphics g, int w, int h)
{
g.setColor(Color.red);

for(int y=0; y<h; y++)
{
for(int x=0; x<w; x++)
{
antx = x;
anty = y;
int p = pixels[anty * w + antx];
if(p == targetPixelValue)
{
b_antx = x+w+10;
b_anty = y;
g.fillRect(b_antx,b_anty,1,1);


}
}
}
}

public void update(Graphics g)
{
paint(g);
}
public void paint(Graphics g)
{
g.setColor(Color.black);
g.drawRect(45,145,10,10); // scanfeld
g.drawRect(45,170,100,20); // pseudoButton
g.drawString("Calibrate",50,184);

if(image != null)
{
g.drawImage(image,0,0,this);
int w = image.getWidth(this);
int h = image.getHeight(this);

if(DONE == false)
{
// do something
}
if(DONE == true)
{
// do nothing
}

if(w < 0 || h < 0) return;
if(paintTargetPixels)
{
// ist verantwortlich fuer picCol in Scannfeld
g.setColor(picCol);
paintPixels(g, w, h);
}

if(pixels == null)
{
// Create a pixel grabber and retrieve the pixels.
pixels = new int[w * h];
try
{
PixelGrabber pg = new PixelGrabber(image, 0, 0, w, h, pixels, 0, w);
pg.grabPixels();

// Check for errors.
if((pg.status() & ImageObserver.ABORT) != 0)
{
System.err.println("Error while fetching image");
System.exit(1);
}
} catch (Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
}
}

public boolean mouseMove(Event evt, int x, int y)
{
Graphics g = getGraphics();

if(pixels == null || x >= image.getWidth(this) || y >= image.getHeight(this))
{
// do something

return false;
}

ColorModel cm = ColorModel.getRGBdefault();
int p = pixels[y * image.getWidth(this) + x];

// The pixel value is translated into a color using
// the default color model.
label.setText(x + "," + y + ": " + cm.getRed(p) + " "
+ cm.getGreen(p) + " " + cm.getBlue(p)
+ " a("+cm.getAlpha(p) + ")"); return true;
}

public boolean mouseDown(Event evt, int x, int y)
{
Graphics g = getGraphics();

if(pixels == null || x >= image.getWidth(this) || y >= image.getHeight(this))
{
if(x >=45 || x <= 145 || y >=170 || y<= 190)
{
if(count == 1)
{
// do something
}
}

return false;
}


targetPixelValue = pixels[y * image.getWidth(this) + x];
paintTargetPixels = true;

if(doneCalibrate && clicked == 1)
{
if(x <= image.getWidth(this) || y <= image.getHeight(this))
{
if(count == 2)
{
// do something
}
}
}

int w = image.getWidth(this);
int h = image.getHeight(this);

// do something
if(doneCalibrate && count == 2 && InClicked)
{
// do something
}


// hopping from Sim.java
do
{
ColorModel cm = ColorModel.getRGBdefault();
int p = pixels[anty * image.getWidth(this) + antx];

// do something

}while(!DONE);
// repaint();

return true;

}


public boolean mouseUp(Event evt, int x, int y)
{
//paintTargetPixels = false;
//repaint();
return true;
}
}

**/


da dass ganze pgm fast 3000 zeilen umfasst, ist das pgm als geruest
gedacht.
wer koennte mir da helfen
mfg nomad

Doc Maverick
15-02-2002, 10:33
Hi,
hm, Dein Programm sieht irgendwie so aus als liefe es nach dem Motto: Mit Kanonen auf Spatzen schießen. ;)
Versuche mal Dich mit BufferedImage anzufreunden - das sollte Dir eine Menge Mühe ersparen.
Leide wird aus Deiner Fragestellung nicht ganz klar, ob Du mehrere Bilder nicht darstellen kannst oder ob Du nicht weißt, wie man das am günstigsten in Deinem Prog macht. :(
Tschüß.

nomad
16-02-2002, 11:07
hi doc,
das problem ist, dass ich's nicht schaff unter der Class ImageCanvas
mehrere bilder anzuzeigen, mit einem Bild gehts prima.
" Image [] images;

String[] dateiname{"arm"+i+".jpg"}
Image[] images = new Image[6];

g.drawImage(images[i],0,0);

also irgendwie in dieser art.
wegen den Spatzen,
das pgm sucht automatisch im bild mehrere TargetColors (rgb), errechnet einen Cluster und versucht bildstrukturen zu erkennen, was auch funktioniert.


waere froh, wenn du mir einen tip geben koenstest
gruss nomad

Doc Maverick
17-02-2002, 18:12
Hi,
hm, vielleicht seh ich den Wald vor lauter Bäumen nicht, aber Du kannst doch in der Klasse ImageCanvas ein Array vom Typ Image anlegen und einen Konstruktor festlegen, der als Parameter eben ein solches Array erwartet.
Wäre es auch möglich, daß Du Deine Programm-Sources als Anhang postest? Dann könnte ich mal schauen, wo es eigentlich hakt.
Tschüß.

nomad
18-02-2002, 11:08
Hi doc,
danke fuer Deine Antwort,
da ich in java noch neu bin,....
das mit dem array also sorum "Image[] images; oder
Image images = new Image[10]";
dass fuehrte zu diversen fehlermeldungen.

als anhaengsel bekommst du noch test.txt (= test.java)
das waer das grundgeruest fuer mein pgm.
falls das mit dem anhaengsl nicht geklappt hat,
in meiner anfrage steht das pgm zwischen /**....*/
ich freu mich schon auf deine antwort
mfg
nomad

Doc Maverick
18-02-2002, 21:26
Hi,
ich habe mir mal Dein Prog angeschaut und muß Dir leider sagen, daß die Klasse Canvas wohl nur mit einem Bild verträgt. :-(
Als Ausweg würde ich vorschlagen einfach mehrere Instanzen zu erzeugen, d.h. mehrere Zeichenflächen, was mir aber nicht so recht gelingen wollt.
Ehrlich gesagt fühle ich mich mit Swing viel wohler, weil einem viele Kleinigkeiten abgenommen werden. Vielleicht stellst Du Dein Prog aus Swing statt AWT um?
Tschüß.

nomad
19-02-2002, 08:15
hi doc,
3 bloede fragen:

1) wie erzeug ich mehrere Instanzen von Image?

2) hab auf meiner linbox java 1.1.2. unter Suse 6.1.
wo bekomme ich die swing unterstuetzung her.
(erlauben swing components (ImageCanvas)?

3) koennte man es ev. mit runnable und filename machen;
also

int imageTracker=1;
String filename;

filename = "c:/Dokumente/QuickCam/AutoCapture/arm"+(imageTracker)+".jpg";
add("Center", new ImageCanvas(getToolkit().getImagefilename),label)) ;


obige statements in start()

dann einen veraenderten (filename) in einem while-loop?

danke fuer deine antwort,
gruss nomad

Doc Maverick
20-02-2002, 18:07
Hi,
tut mir leid, daß ich mit etwas Verspätung antworte. :(
Also zu Deiner ersten Frage:


Image img[]=new Image[2];
img[0]=new Image(); // hier sollte was "richtiges" stehen
img[1]=new Image();


Zu Deiner zweiten:
Swing gibt es erst ab JAVA 2 (d.h. Versionen ab 1.2, wobei 1.4 aktuell ist).
Soweit ich weiß wird dabei kein ImageCanvas verwendet - was aber nicht unbedingt ein Verlust sein muß. ;)

Und zu Deiner dritten Frage:
Wäre möglich, daß man das auch als separaten Thread laufen lassen kann, aber im Allgemeinen muß man vorsichtig sein, denn AWT ist nicht Thread-Sicher.

Ich versuche mal bei Gelegenheit Dein Prog auf Swing zu konvertieren.
Tschüß.

nomad
21-02-2002, 05:56
hi doc,
danke fuer deine tips,
zu 1) ich glaube, dass , soweit ichs versteh, es in meinen pgm dann zuviele
instanzen von Images geben wuerde.
1 bild pro sec == 3600

zu 2) ich kuemmere mich mal um java 2. buecher und sw .
wuerde mich ueber eine ev.konvertierung deinerseits freuen.

zu threads: ich hatte mir das so vorgestellt:
- 1 masterTh ueber das ganze pgm
- master startet loadTh
- if loadTH = done -> start calcTh
- if calcTh = done -> start armControlTh
etc....

zum Pgm:
hab jetzt eventuell eine moeglichkeit gefunden ohne ImageCanvas das ganze ding zu pgm. es hapert aber noch gewaltig,

tschuess nomad

Doc Maverick
25-02-2002, 12:31
Hi,
ich habe Dein Prog mal etwas geändert - und möglicherweise fehlen auch ein paar Sachen. Sorry.
Generell war Dein Ansatz wohl etwas problematisch, weshalb ich die Darstellung der Bilder von der Verarbeitung entkoppelt habe.
Tschüß.

nomad
27-02-2002, 05:43
hi doc,
danke fuer deine muehen, hab das pgm runtergeladen und gucks mir an.
habe auch erste erfahrungen mit java 2 & swing gemacht.
die sachen bieten doch einiges.
meld mich, nochmals dank
nomad

ps. es lebt:p
jetzt muss ich nur noch herausfinden wie das ganze funktioniert.
also nochmals vielen dank fuer deine portierung, man lernt nie aus.
tschuess nomad

nomad
28-02-2002, 14:44
hi doc,
entschuldige, dass ich schon wieder da bin.
da im augenblick meine linuxbox einwenig kraenkelt. thsss die HD ?
muss ich leider win benuetzen,
also wenn ich das pgm starte, laeuft es,
aber nach beendigung haengt sich win ueberrschend auf.
da hilft nur ein kaltstart.
vermutlich hat das mit dem for-loop zu tun, da ich urspruenglich
erst nach der bearbeitung vom image ein weiteres image anzeigen
moechte. also das ist kein problem.
aber:
ich probiere meinen PixelGrabber zu instanzieren ss. test.txt.
java beschwert sich mit folgender meldung:

cannot resolve symbol,
symbol PixelGrabber (javax.swing.ImageIcon, int,int,int, int[],int,int);

location class java.awt.image.PixelGrabber
PixelGrabber pg = new PixelGrabber(image,0,0,w,h,pixels,0,w);

muesste ich das anders formulieren?

gruss nomad

Doc Maverick
28-02-2002, 15:42
Hi,
Du mußt wahrscheinlich einen Typecast durchführen à la
PixelGrabber pg = new PixelGrabber((Image)image,0,0,w,h,pixels,0,w);

Der for Loop ist in einem extra Thread und soll alle vorhandenen JPEGs darstellen - es war nur als Anregung gedacht. Ich findes es aber wirklich eigenartig, das sich Dein Windoofs aufhängt, da ich den Thread ausdrücklich als "Daemon" deklariert habe, d.h. er wird sofort beendet, sobald das Programm beendet wird, sonst müßte das Programm auf den Thread warten. Wie gesagt, das ist nur als Anregung gedacht gewesen.
Tschüß.

PS: Du kannst mir auch eMails schicken, falls Dir das Posting zu umständlich wird. ;)