# Bilder von Webcam darstellen



## totix800 (6. Nov 2007)

Hi,

mit folgendem Code lade ich per Webcam ca. 15 mal pro sekunde ein Bild in den Buffer umd dann daraus die RGB werte von verschiedenen Pixeln auszulesen. Ich würde das Bild was im Buffer liegt gleichzeitig auch gerne in einem GUI ausgeben, damit ich die Ausgabe nachvollziehen kann.


```
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.media.*;
import javax.media.control.*;
import javax.media.format.*; 
import javax.media.util.*;
import com.sun.image.codec.jpeg.*;
import com.sun.media.protocol.v4l.DataSource;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.media.Buffer;

import javax.imageio.ImageIO;
 
/**
 *
 * @author Google, NetBeans
 */
public class Main extends Canvas
{
    
    public static void main(String[] args) throws Exception
    {
        // Device festlegen
        CaptureDeviceInfo deviceInfo = CaptureDeviceManager.getDevice("v4l:Logitech QuickCam EC:0");
        if(deviceInfo == null)
        {
            System.out.println("no device found");
        }
        Player player = Manager.createRealizedPlayer(deviceInfo.getLocator());
        player.start();
 
        // Kurz warten, soll sonst angeblich lags bringen
        Thread.sleep(2500);
        System.out.println("Wait: Ende");
        while(true)
        {
            // FrameGrab
            FrameGrabbingControl frameGrabber = (FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");
            Buffer buf = frameGrabber.grabFrame();

            // Als Bild in en Buffer schieben
            Image img = (new BufferToImage((VideoFormat)buf.getFormat()).createImage(buf));
            BufferedImage buffImg = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
            Graphics2D g = buffImg.createGraphics();
            g.drawImage(img, null, null);
    
            
            /* Als PNG oder Jpeg spichern
            ImageIO.write(buffImg, "png", new File("test.png")); */
  
            int left = buffImg.getRGB(20, 110);
		Color leftc = new Color(left);
            int right = buffImg.getRGB(300, 110);
		Color rightc = new Color(right);
                
                if((leftc.getGreen() < 20) && (rightc.getGreen() > 20))
                {
                    System.out.println("Links");  
            
                }
                if((rightc.getGreen() < 20) && (leftc.getGreen() > 20))
                {
                    System.out.println("Rechts");
                }
                if((rightc.getGreen() > 20) && (leftc.getGreen() > 20))
                {
                    System.out.println("Gerade aus");
                }
                
             /*	System.out.println("Red: " + c.getRed());
		System.out.println("Green: " + c.getGreen()); 
		System.out.println("Green: " + c.getGreen()); */

        }
            

 
     /* Alles stoppen
        player.close();
        player.deallocate();
        System.exit(0); */
    }


    
}
```

Ich habe leider keine erfahrung mit dem Schreiben von GUI's, weswegen ich euch gerne fragen wollte. Wie kann ich mir das Bild aus dem Buffer jede 1/10 Sekunde in einem GUI erneuernd wiedergeben?
Ich würde mich über Hilfe sehr freuen und bedank mich schon einmal.

Gruß toti [/code]


----------



## wayne (6. Nov 2007)

jede lösung, die es ermöglicht, die bilder anzuzeigen, wird nicht so schnell sein, wie wenn du von deinem player mittels getVisualComponent() die anzeige geben lässt und diese auf einer oberfläche darstellst. soweit ich mich mit JMF auskenne sollte das bei einem realized-player-objekt doch möglich sein, oder?

von der methode würdest du eine Component zurück erhalten. eine sehr simple art, diese darzustellen wäre an geeigneter stelle folgendes auszuführen:

```
JFrame frame = new JFrame("Display");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(20,20,400,300); // position bleibt dir überlassen, höhe und breite kannst du der größe der bilder anpassen
frame.getContentPane().add(player.getVisualComponent());
frame.setVisible(true);
```
dannach sollte nach durchlaufen dieser zeilen ein fenster auf deinem bildschirm erscheinen, auf dem die wiedergabe der bilder stattfindet. durch schließen dieses fensters sollte das programm beendet werden, allerdings ohne eine deallokierung des von JMF belegten speichers. ggf. müsstest du noch per Runtime.getRuntime().addShutdownHook(...) einen extra code implementieren, der das notfalls noch tut.

viel erfolg

wayne


----------



## wayne (6. Nov 2007)

jede lösung, die es ermöglicht, die bilder anzuzeigen, wird nicht so schnell sein, wie wenn du von deinem player mittels getVisualComponent() die anzeige geben lässt und diese auf einer oberfläche darstellst. soweit ich mich mit JMF auskenne sollte das bei einem realized-player-objekt doch möglich sein, oder?

von der methode würdest du eine Component zurück erhalten. eine sehr simple art, diese darzustellen wäre an geeigneter stelle folgendes auszuführen:

```
JFrame frame = new JFrame("Display");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(20,20,400,300); // position bleibt dir überlassen, höhe und breite kannst du der größe der bilder anpassen
frame.getContentPane().add(player.getVisualComponent());
frame.setVisible(true);
```
dannach sollte nach durchlaufen dieser zeilen ein fenster auf deinem bildschirm erscheinen, auf dem die wiedergabe der bilder stattfindet. durch schließen dieses fensters sollte das programm beendet werden, allerdings ohne eine deallokierung des von JMF belegten speichers. ggf. müsstest du noch per Runtime.getRuntime().addShutdownHook(...) einen extra code implementieren, der das notfalls noch tut.

viel erfolg

wayne


----------



## totix800 (6. Nov 2007)

Vielen Dank, das war was ich gebraucht habe.


----------

