Avatar billede quiw Nybegynder
29. januar 2010 - 12:18 Der er 4 kommentarer og
1 løsning

JMF og drawString();

Kære eksperter, nu har jeg surfet nettet tør for eksempler, og kan ikke finde en brugbar løsning. Jeg har en lille kode som viser webcam, og som kan fortælle hvilken RGB-værdi en given pixel har, direkte på webcammet. Problemet er bare, at jeg også gerne vil tegne på webcammet, f.eks. med drawString, eller tegne nogle linjer. Har følgende kode:

import javax.media.Player;
import javax.media.CaptureDeviceInfo;
import javax.media.MediaLocator;
import javax.media.Manager;
import javax.media.Buffer;
import javax.media.format.*;
import javax.media.util.*;
import javax.media.control.*;
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;

public class Webcam{
    private CaptureDeviceInfo device;
    private Player player;
   
    private Component videoScreen;
   
    private Buffer buf = null;
    private Image img = null;
    private BufferToImage btoi = null;
   
    public void Webcam(){
        try{
                player = Manager.createRealizedPlayer(new MediaLocator("vfw://0"));
                player.start();
               
                videoScreen = player.getVisualComponent();
               
                Frame frm = new Frame();
               
                frm.setBounds(10,10,300,300);
               
                frm.add(videoScreen);
                frm.setVisible(true);
               
                FrameGrabbingControl fgc = (FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");

                buf = fgc.grabFrame();
                Thread.sleep(5000);
               
              for(int i = 0; i<10000;i++){
                    buf = fgc.grabFrame();
                    btoi = new BufferToImage((VideoFormat)buf.getFormat());
                    img = btoi.createImage(buf);
                   
                    BufferedImage image = (BufferedImage)btoi.createImage(buf);
                    System.out.println(new Color(image.getRGB(150,150)).getRed()+","+new Color(image.getRGB(150,150)).getBlue()+","+new Color(image.getRGB(150,150)).getGreen());
                }
               
                player.close();
                player.deallocate();
        }catch(Exception e){
                System.out.println(e);
        }
    }
}

Hvad gør man? Kan ikke finde nogle løsninger der virker.
Avatar billede simonvalter Praktikant
30. januar 2010 - 00:31 #1
Som jeg ser det så finder rbg fra et billede taget af videoen.... en hel masse billeder du ikke  bruger til noget.

Jeg tror du vil kunne gøre det ved at smide playeren i en JFrame og tegne på et transparent GlassPane.

http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JFrame.html#setGlassPane(java.awt.Component)

http://java.sun.com/docs/books/tutorial/uiswing/components/rootpane.html

Hvis du vil skrive til billedet for at gemme det så er det et bufferedimage du har og arbejde med.

http://www.java-tips.org/java-se-tips/java.awt.geom/how-to-draw-on-a-bufferedimage.html
Avatar billede quiw Nybegynder
30. januar 2010 - 01:20 #2
Tjaeh jeg ville gerne læse rgb på en given pixel, og dette var den løsning jeg kunne få til at virke. Er det da muligt at læse rgb-værdien direkte fra videoen, i stedet for bufferedimage? Det ville da spare en del ressourcer.
Avatar billede simonvalter Praktikant
30. januar 2010 - 10:31 #3
Nej jeg vil også mene det er rigtigt det du gør. Men du har vist byttet om på grøn og blå.
Avatar billede quiw Nybegynder
30. januar 2010 - 16:24 #4
Jeg har nu udarbejdet følgende:

import javax.media.Player;
import javax.media.CaptureDeviceInfo;
import javax.media.MediaLocator;
import javax.media.Manager;
import javax.media.Buffer;
import javax.media.format.*;
import javax.media.util.*;
import javax.media.control.*;
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;

public class Webcam{
    private CaptureDeviceInfo device;
    private Player player;
 
    private Component videoScreen;
    private JPanel drawScreen;
 
    private Buffer buf = null;
    private Image img = null;
    private BufferToImage btoi = null;
 
    public void Webcam(){
        try{
                player = Manager.createRealizedPlayer(new MediaLocator("vfw://0"));
                player.start();
               
                JFrame frm = new JFrame();
               
                frm.setBounds(10,10,300,300);
               
                videoScreen = player.getVisualComponent();
               
                drawScreen = new JPanel(){
                    protected void paintComponent(Graphics g){
                        g.setColor(new Color(0,0,0));
                        g.drawString("Dette er en test!",50,50);
                        super.paint(g);
                    }
                };
               
                frm.setGlassPane(drawScreen);
               
                frm.add(videoScreen);
                frm.add(drawScreen);
               
                frm.setVisible(true);
                drawScreen.setVisible(true);
                videoScreen.setVisible(true);
               
                FrameGrabbingControl fgc = (FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");
               
                buf = fgc.grabFrame();
                Thread.sleep(5000);
             
              for(int i = 0; i<100;i++){
                    buf = fgc.grabFrame();
                    btoi = new BufferToImage((VideoFormat)buf.getFormat());
                    img = btoi.createImage(buf);
                 
                    BufferedImage image = (BufferedImage)btoi.createImage(buf);
                    System.out.println(new Color(image.getRGB(150,150)).getRed()+","+new Color(image.getRGB(150,150)).getBlue()+","+new Color(image.getRGB(150,150)).getGreen());
                }
               
                player.close();
                player.deallocate();
        }catch(Exception e){
                System.out.println(e);
        }
    }
}

Jeg har 3 problemer:
1. Den vil ikke tegne noget.
2. Hvis jeg tager et TextArea på drawScreen, vil den ikke vise den øverst, den vil vise det bagerst (selvom at glasspane burde være øverst?)
3. Jeg får en helvedes masse exceptions når jeg kører, formodentlig noget med framgrabber.
Avatar billede quiw Nybegynder
31. januar 2010 - 22:56 #5
Jeg har nu løst et par problemer selv, den vil gerne tegne nu, og den vil også gerne lave en knap oven på webcammet. Men den vil stadig ikke tegne oven på webcammet, det bliver blot tegnet under den:

import javax.media.Player;
import javax.media.CaptureDeviceInfo;
import javax.media.MediaLocator;
import javax.media.Manager;
import javax.media.Buffer;
import javax.media.format.*;
import javax.media.util.*;
import javax.media.control.*;
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;

public class Webcam{
    private CaptureDeviceInfo device;
    private Player player;

    private Component videoScreen;
    private JPanel drawScreen;

    private Buffer buf = null;
    private Image img = null;
    private BufferToImage btoi = null;

    public void Webcam(){
        try{
                JFrame frm = new JFrame();
                frm.setBounds(10,10,800,600);
               
                player = Manager.createRealizedPlayer(new MediaLocator("vfw://0"));
                player.start();
               
             
                videoScreen = player.getVisualComponent();
             
                drawScreen = new JPanel(){
                    public void paintComponent(Graphics g){
                        g.setColor(new Color(0,0,0));
                        g.drawString("AAAAAAAAAAAAAAAA",50,50);
                    }
                };
               
                JButton test = new JButton();
                drawScreen.add(test);
               
                frm.add(videoScreen);
                frm.add(drawScreen);
                frm.setGlassPane(drawScreen);
                frm.setVisible(true);
               
               
                drawScreen.setVisible(true);
                videoScreen.setVisible(true);
             
                FrameGrabbingControl fgc = (FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");
             
                buf = fgc.grabFrame();
                Thread.sleep(10000);
                Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, new Boolean(true));
                for(int i = 0; i<300;i++){
                    buf = fgc.grabFrame();
                    btoi = new BufferToImage((VideoFormat)buf.getFormat());
                    img = btoi.createImage(buf);
               
                    BufferedImage image = (BufferedImage)btoi.createImage(buf);
                    System.out.println(new Color(image.getRGB(150,150)).getRed()+","+new Color(image.getRGB(150,150)).getBlue()+","+new Color(image.getRGB(150,150)).getGreen());
                }
             
                player.close();
                player.deallocate();
        }catch(Exception e){
                System.out.println(e);
        }
    }
}


Jeg læste at man med Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, new Boolean(true)); men det ser ikke ud til at virke.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester