Web Cam em Swing

18 respostas
F

Estou precisando armazernar fotos tiradas de um web cam utilizando swing alguém já faz e pode dar uma dica ?
obs: já vi alguns posts mais estão confusos.
Obrigado.

18 Respostas

A

Fiz minha classe WebCamUtil com o DirectShow Java (DSJ para os intimos :) ). O DSJ é bem fácil de usar e tem exemplos completos de como implementar.

Vou postar a parte mais importante da minha implementação e anexar ela completa pra você se basear, ok?
public class WebCamUtil extends javax.swing.JDialog{
    private static DSCapture player;
    private BufferedImage frame;
    
    public WebCamUtil(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        setLocationRelativeTo(null);
        pnlPlayer.setSize(640, 480);
        pnlPlayer.add(player.asComponent());
    }
    
    /**
     * Inicia a conexão com a WebCam
     */
    public static void iniciarWebCam(){
        try {
            File f = new File("lib\\dsj.dll");
            DSFilterInfo[][] dsi = null;
            try {
                if(f.exists())
                    DSEnvironment.setDLLPath(f.getAbsoluteFile().toString());
                 dsi = DSCapture.queryDevices();
            } catch (UnsatisfiedLinkError u) {
                JOptionPane.showMessageDialog(null, "O Arquivo \"dsj.dll\" Não Foi Encontrado Em\n"+f.getAbsolutePath().replace("\\dsj.dll", ""),
                                                    "Atenção", JOptionPane.ERROR_MESSAGE);
            }
            if(dsi[0][0].getName().equalsIgnoreCase("PC Camera"))
                dsi[0][0].setPreferredFormat(2);
            player = new DSCapture(DSFiltergraph.DD7, dsi[0][0], false, DSFilterInfo.doNotRender(), null);
            player.setSize(640, 480);
            player.stop();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não Foi Possível Iniciar a WebCam. Possíveis Causas:"
                                                + "\n- O Aplicativo  Esta Sendo Executado (Gerenciador de Tarefas -> Processos -> javaw.exe)"
                                                + "\n- A WebCam Está Desconectada"
                                                + "\n- O Windows Não Reconheceu a WebCam",
                                                "Atenção", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    /**
     * Retorna o frame capturado
     * @return BufferedImage
     */
    public BufferedImage getFoto() {
        return frame;
    }
    
    /**
     * Redimensiona a foto
     * @param foto
     * @param w
     * @param h
     * @return Image
     */
    public static Image resizeFoto(BufferedImage foto, int w, int h){
        return foto.getScaledInstance(w, h, 0);
    }
    
    /**
     * Salva a foto e retorna o caminho
     * @param foto
     * @param tipo
     * @return String
     */
    public static void salvarFoto(BufferedImage foto, File path){
        try {
            if(!path.exists())
                local.mkdirs();
            ImageIO.write(foto, "PNG", path);
        } catch (IOException e) { }
    }
    
    private void btnCapturarActionPerformed(java.awt.event.ActionEvent evt) {
        btnOutra.setEnabled(true);
        btnAceitar.setEnabled(true);
        btnCapturar.setEnabled(false);
        try {
            player.stop();
        } catch (Exception e) { }
            frame = player.getImage();
	}

    private void btnAceitarActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            player.stop();
        } catch (Exception e) { }
            setVisible(false);
	}

    private void btnOutraActionPerformed(java.awt.event.ActionEvent evt) {
        btnOutra.setEnabled(false);
        btnAceitar.setEnabled(false);
        btnCapturar.setEnabled(true);
        frame = null;
        btnCapturar.grabFocus();
        try {
            player.play();
        } catch (Exception e) { }
    }

    private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            player.stop();
        } catch (Exception e) { }
        setVisible(false);
    }

    private void formWindowActivated(java.awt.event.WindowEvent evt) {
        btnOutra.setEnabled(false);
        btnAceitar.setEnabled(false);
        btnCapturar.setEnabled(true);
        try {
            player.play();
        } catch (Exception e) { }
        btnCapturar.grabFocus();
    }
    
    // ...
}

OBS 1: A classe (anexo) é uma implementação do JDialog. Basta instancia-la que já estará funcionando (teoriacamente :D )
OBS 2: Adicione os arquivos dsj.jar e dsj.dll (download) na pasta lib
OBS 3: OS métodos estáticos resizeFoto() e salvarFoto() podem ajudar

Qualquer dúvida estamos ai!

V

Legal, outra possibilidade creio que seja usar a JavaCv:
http://code.google.com/p/javacv/

V

Legal, não conhecia o projeto.
Eu não usaria hoje a JMF. Foi abandonada, é difícil de usar.

A

Eu sofri bastante com o JMF antes de conhecer o DSJ. Era muita incompatibilidade e o código não era “gatinho” :smiley:

F

Obrigado vini e adriel, vou implatar a classe depois dou feedback.
Força e Avante.

F

Só uma pergunta adriel eu posso colocar essas dll dentro do meu projeto, ou tenho que colocar na pasta Java ?

A

Essa DLL pode ficar na pasta System32 do Windows ou onde você desejar, basta carregá-la pela aplicação.
Se você olhar no método [color=blue]iniciarWebCam()[/color] você vai encontrar as seguintes linhas:

File f = new File("lib\\dsj.dll"); // ... if(f.exists()) DSEnvironment.setDLLPath(f.getAbsoluteFile().toString());
Precisamos carregar a DLL com o [color=blue]DSEnvironment.setDLLPath()[/color], escolhi guardá-la na pasta LIB. Isso fica a seu critério.

F

A tá massa eim, porque senão na hora de instalar o sistema ficar chato.
Valeu mesmo cara.

A

tentei implementar mas ta dando o seguinte erro

Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException

at WebCamUtil.(WebCamUtil.java:24)

at WebCamUtil$1.run(WebCamUtil.java:152)

at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)

at java.awt.EventQueue.access$000(EventQueue.java:101)

at java.awt.EventQueue$3.run(EventQueue.java:666)

at java.awt.EventQueue$3.run(EventQueue.java:664)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:12

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

não faço a minima ideia o que seja mas espero que seja coisa bouba

C

Olá amigos tb estou com o mesmo erro.
e agora? :?

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at visual.WebCamUtil.<init>(WebCamUtil.java:24)
	at visual.WebCamUtil$1.run(WebCamUtil.java:152)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
R

Estava vendo essa aplicação, o problema do nullpointer Excetion é o

public WebCamUtil(java.awt.Frame parent, boolean modal) {

super(parent, modal);

initComponents();

iniciarWebCam();//NECESSÁRIO INICIAR A WEBCAM PARA CONSEGUIR USAR OS RECURSOS.

setLocationRelativeTo(null);

pnlPlayer.setSize(640, 480);

pnlPlayer.add(player.asComponent());

}

Ricardo

V

Vocês chamaram o método estático iniciarWebcam antes do construtor?

C

Boa noite amigos o meu ficou 100%

Obrigado a todos…

Agora quero implementar um “crop” na foto… :smiley:

meu construtor ficou assim:

public WebCamUtil(java.awt.Frame parent, boolean modal) {
      
        super(parent, modal);
        initComponents();
        setLocationRelativeTo(null);
        iniciarWebCam(); // ESSE É O METODO
        pnlPlayer.setSize(640, 480);
        pnlPlayer.add(player.asComponent());
    }
D

Galera, o meu deu o seguinte erro:

java.lang.UnsatisfiedLinkError: C:\Users\eliton\Documents\Workspace\APS\APS\lib\dsj.dll: Can’t load IA 32-bit .dll on a AMD 64-bit platform, Make sure the dsj.dll is on the library path & DirectX9 and WindowsMediaPlayer 9 or greater are installed

o que pode ser?
Valeuu

C

dodge, acho que vc deve usar a dsj.dll para 64 … e não a 32.
:slight_smile:

D

putz era isso mesmo !!! falta de atenção minha!!
valeu pela ajuda cara ^^

R

Boa Noite pessoal, estou com problema ao usar o código anexo, ele não dá nenhum erro apenas não exibe a imagem da webcam, detalhe quando executa o play ou stop a webcam desliga.

eu uso um not com webcan integrada, pode ser esse o motivo?

preciso muito de ajuda para carregar a imagem.

S

Galera,

Usei o código acima e com uns pequenos ajustes funcionou beleza, ta salvando as fotos e tudo.

O problema é que a Imagem não aparece no JDialog! É assim mesmo?

Criado 5 de janeiro de 2012
Ultima resposta 3 de dez. de 2014
Respostas 18
Participantes 9