[JMF] Bilder von Webcam zwischenbearbeiten und dann anzeigen

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hallo zusammen,

mal wieder plag mich ein kompliziertes Problem: wie in meinem letzten Eintrag beschrieben arbeite ich gerade an meinem EAN-Scanner via Webcam. Statische Bilder kann ich schon relativ gut erkennen. Doch nun müssen bewegte Bilder her von der Webcam. Und da klingelt es bei mir: Java Media Framework.

Ein bisschen Google-Magie angewand und schon findet man eine Java-Klasse (siehe unten), die das kann: Bilder von der Webcam werden auf den Bildschirm gebracht.

Meine Frage ist folgende: Wie kann ich eine Methode dazwischenschieben, die mit dem Bild etwas macht (also den EAN ausließt und die Zahl auf das Bild schreibt)?
Code:
public static BufferedImage bearbeite(BufferedImage img) {
...
}
Also alle x Millisekunden wird die Methode bearbeite(...) dazwischen geschoben und das verabeitete Bild angezeigt.

Ich bitte :( dringenst um Hilfe oder Rat,
CPU

(EDIT: siehe Anhang für Beispiel)
 

Anhänge

  • bsp0.txt
    3,5 KB · Aufrufe: 199
Zuletzt bearbeitet: (Beispiel in den Anhang verschoben)
In der actionPerformed-Methode ist ja Code um ein Bild abzuholen und zu speichern. Also so in etwa:
Code:
public void captureIMG(){
      FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
      Buffer mybuf = fgc.grabFrame();      
      Image myimg= new BufferToImage((VideoFormat)mybuf.getFormat()).createImage(mybuf);
      BufferedImage mybi = new BufferedImage(myimg.getWidth(null), myimg.getHeight(null), BufferedImage.TYPE_INT_RGB);
      int[] imgAsRGBArray =  new int[mybi.getWidth() * mybi.getHeight()];
      mybi.getRGB(0,0,mybi.getWidth(), mybi.getHeight(),imgAsRGBArray,0,mybi.getWidth());
}
Zusätzlich brauchst du nen Thread, der diese Funktion in einer unendlich laufenden while-Schleife aufruft und anschließend immer x Millisekunden schläft.

Und dann eben diese RGB-Werte irgendwie weiterverarbeiten wie auch immer um den Barcode zu erkennen ;) Wie das genau geht kann ich dir leider auch nicht sagen.
 
Zuletzt bearbeitet:
BerniG schrieb:
Und dann eben diese RGB-Werte irgendwie weiterverarbeiten wie auch immer um den Barcode zu erkennen ;) Wie das genau geht kann ich dir leider auch nicht sagen.
Das habe ich mir ja schon selbst zusammengebastelt ...

Klappt nicht! Ich habe mal ein bisschen dran rumeditiert ... keine Chance ... Das System.out.println() wird nur dann aufgerufen, wenn der Code, den Du gepostet hast raus genommen wird ...
(EDIT: Code siehe Anhang)
 

Anhänge

  • bsp1.txt
    5,5 KB · Aufrufe: 162
Zuletzt bearbeitet: (Ab den Code in den Anhang gelegt - sonst ist die Seite so groß ;-))
Das habe ich mir ja schon selbst zusammengebastelt ...
Und warum schreibst du das dann nicht vorher? Ich habe nur den - laut deiner Aussage - kopierten Code gesehen.

Und was heißt eigentlich "Klappt nicht"? Erklär doch mal genau. Welches System.out.println() von den beiden meinst du?

Generell ist es aber auf jeden Fall sehr schlecht den "CallThread" zu starten bevor du das Device initialisiert hast.

Ich hatte auch nen kleinen Fehler in meinem Code: buf => mybuf , habs oben korrigiert.
 
Zuletzt bearbeitet:
Ein kleiner Erfolg - aber immer noch zwei Fragen offen

Hallo,

ich hab's geschafft! Mit dem untenstehenden Code kann man sich die Bilder holen und dann abspeichern bzw. machen was man will mit den Bildern. Die liegen nämlich als BufferedImage vor (in "captureIMG()").
Nun kann ich die weiter verarbeiten und die EAN auslesen - hab ich auch schon gemacht und hat auch mittelmäßig funktioniert. D.h. er erkennt im Moment noch EANs wo garkeine sind. Ich muss davor also noch einen EAN-Detektor schalten ... mal sehen wie ich das mache ...

Aber hier noch meine zwei offenen Fragen:
  1. Für den Endbenutzer möchte ich noch über das Kamerabild auf dem Bildschirm ein "Visier" bzw. eine gedachte Scannerlinie malen. Wie kann ich das Bild, das dann auf dem Bildschirm angezeigt wird manipulieren (oder muss ich dazu das ausgelesene BufferedImage ändern und dieses anzeigen)?
  2. Wie kann ich dafür sorgen, dass auf dem Bildschirm kein Bild mehr angezeigt wird, sondern nurnoch intern damit gearbeitet wird?

Vielen Dank für's lesen,
CPU

Hier der Code des funktionierenden Beispiels: (EDIT: siehe Anhang)
 

Anhänge

  • funktionsfaehiges-beispiel.txt
    4,7 KB · Aufrufe: 272
Zuletzt bearbeitet:
Zurück
Oben