Vídeo captura utilizando Java e DirectX Introdução
Transcrição
Vídeo captura utilizando Java e DirectX Introdução
Vídeo captura utilizando Java e DirectX Introdução Este documento demonstra como realizar vídeo captura de uma webCam utilizando DirectX e Java. Tecnologias utilizadas: – JDK 1.6.0_18 http://java.sun.com/javase/downloads/index.jsp – DSJ - DirectShow Java wrapper http://www.humatic.de/htools/dsj/download.htm Leandro Alves ::: Java Development ::: Bacharel em Sistemas de Informação ::: Pós graduando em Desenvolvimento de Sistemas para Web ::: Sun Certified Java Programmer 5.0 [email protected] Iniciando projeto Depois de ter feito o download do DSJ no site da Humatic, que se encontra na versão 0_8_61, copie os arquivos "dsj.jar" e "dsj.dll" para seu classpath de preferência, no meu caso utilizei "C:\Program Files\Java\jre6\lib\ext". Crie uma classe, dei o nome de "DSJApplet.java", segue o código: /** * * @author Leandro */ import de.humatic.dsj.CaptureDeviceControls; import de.humatic.dsj.DSCapture; import de.humatic.dsj.DSFilterInfo; import de.humatic.dsj.DSFiltergraph; import de.humatic.dsj.DSGraph; import javax.swing.*; import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; import javax.imageio.ImageIO; import javax.swing.event.InternalFrameAdapter; import javax.swing.event.InternalFrameEvent; /** * This program demonstrates the basics of creating a frame * user interface with a menubar. It also shows how to * add a menubar and dropdown menus to the applet, which wasn't * possible in the basic AWT heavyweight component. **/ public class DSJApplet extends JApplet implements PropertyChangeListener { private DSGraph netGraph = null; private DSFilterInfo dSFilterInfo = null; private DSCapture graph = null; private JComboBox comCameras = new JComboBox(); private JDesktopPane desPreview = new JDesktopPane(); private JInternalFrame frame = new JInternalFrame(); private List<DSFilterInfo> filterInfoList = null; private HashMap<String, DSFilterInfo> hashCams = new HashMap<String, DSFilterInfo>(); /** Build an applet interface with a menubar. A * a drop down menu includes Open/Close items * for opening and closing an instance of ParticleFrame. **/ @Override public void init() { chargeCams(); comCameras.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { comCamerasActionPerformed(evt); } }); add(java.awt.BorderLayout.NORTH, comCameras); addDesktopPane(); } // init public void addDesktopPane() { desPreview = new JDesktopPane(); desPreview.setBackground(new java.awt.Color(240, 240, 240)); desPreview.setBorder(javax.swing.BorderFactory.createTitledBorder("")); this.add(desPreview); add(java.awt.BorderLayout.CENTER, desPreview); } public List<DSFilterInfo> getVideoDevices() { DSFilterInfo[][] lista = null; try { lista = DSCapture.queryDevices(); } catch (Exception e) { e.printStackTrace(); } return Arrays.asList(lista[0]); } public void chargeCams() { try { filterInfoList = getVideoDevices(); String[] camNames = new String[filterInfoList.size()]; camNames[0] = ""; for (int i = 0; i < filterInfoList.size(); i++) { if (!filterInfoList.get(i).getName().equalsIgnoreCase("none")) { camNames[i + 1] = filterInfoList.get(i).getName(); hashCams.put(filterInfoList.get(i).getName(), filterInfoList.get(i)); } } comCameras.setModel( new javax.swing.DefaultComboBoxModel(camNames)); } catch (Exception e) { e.printStackTrace(); } } private void comCamerasActionPerformed(java.awt.event.ActionEvent evt) { String selectedCam = comCameras.getSelectedItem().toString(); if ((selectedCam != null) && (!selectedCam.trim().equals(""))) { for (JInternalFrame f : desPreview.getAllFrames()) { if (f.getTitle().equalsIgnoreCase(selectedCam)) { return; } } dSFilterInfo = hashCams.get(selectedCam); graph = new DSCapture(DSFiltergraph.RENDER_NATIVE, dSFilterInfo, false, DSFilterInfo.doNotRender(), this); frame.addInternalFrameListener( new InternalFrameAdapter() { @Override public void internalFrameClosing(InternalFrameEvent e) { finalizeFrame(); } }); frame.setTitle(hashCams.get(selectedCam).getName()); frame.setClosable(true); frame.setSize(620, 440); frame.setResizable(false); frame.add(java.awt.BorderLayout.CENTER, graph.asComponent()); frame.setVisible(true); desPreview.add(frame); JPanel jf = new JPanel(); jf.setLayout(new java.awt.GridLayout(0, 1)); CaptureDeviceControls controls = ((DSCapture) graph).getActiveVideoDevice().getControls(); if (controls != null) { for (int i = CaptureDeviceControls.BRIGHTNESS; i < CaptureDeviceControls.FOCUS; i++) { try { jf.add(controls.getController(i, 0, true)); } catch (Exception e) { System.out.println("Erro aou inserir controle: " + controls.getController(i, 0, true)); } } } frame.add(java.awt.BorderLayout.WEST, jf); jf.setVisible(true); JButton jb = new JButton("Capturar"); jb.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { try { Object image = graph.getImage(); JFileChooser jf = new JFileChooser(); jf.setMultiSelectionEnabled(false); jf.showSaveDialog(desPreview); if (jf.getSelectedFile() != null) { ImageIO.write((BufferedImage) image, "jpg", jf.getSelectedFile()); } //ImageIO.write((BufferedImage) image, "jpg", new File("C:/Users/Leandro/Desktop/image.jpg")); } catch (IOException ex) { ex.printStackTrace(); } } }); frame.add(java.awt.BorderLayout.SOUTH, jb); } } public void finalizeFrame() { frame.dispose(); graph.dispose(); graph = null; desPreview.remove(frame); } public void propertyChange(PropertyChangeEvent evt) { } } // class FrameApplet Compile a classe : – javac DSJApplet.java Serão criados 4 arquivos .class. Crie um arquivo .jar com os arquivos com os .class gerados. – jar cvf DSJApplet.jar *.class Agora para que nosso applet possa ter alguns privilégios quanto ao acesso a recursos nativos do sistema precisamos assinar nosso jar. – keytool -genkey -keystore sample.keystore -storepass storepwd -keypass keypwd -keyalg RSA -alias sample_key -validity 360 -dname "cn=SampleGroup,ou=Sample,c=Bebedouro,s=SP,c=BR" Com esta linha criamos um storage e uma chave, e é esta que utilizaremos para assinar nosso jar. Em destaque os nomes e as senhas do keystore e da chave. Assinando o jar. – jarsigner -keystore sample.keystore -storepass storepwd -signedjar DSJAppletAssigned.jar DSJApplet.jar sample_key Será solicitada a senha da chave no nosso caso "keypwd". Agora temos nosso jar assinado "DSJAppletAssigned.jar". Agora crie um html: <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>DSJApplet</title> </head> <body> <center> <applet code="DSJApplet.class" ARCHIVE="DSJAppletAssigned.jar" width="800" height="600"/> </center> </body> </html> Pronto... execute sua página html e veja o resultado, lembre-se de verificar se o .jar assinado está no mesmo nível de diretório que a página html. Você deve aceitar a exceção de segurança, lembrando que nos mesmos criamos nossa assinatura e não uma empresa certificadora. Carregando... Selecione a câmera ... E voilà !! É isso ai.... FIM Leandro Alves ::: Java Development ::: Bacharel em Sistemas de Informação ::: Pós graduando em Desenvolvimento de Sistemas para Web ::: Sun Certified Java Programmer 5.0 [email protected]
Documentos relacionados
Visualizar - Polis Educacional
comunicação utilizado e o robô precisa ser capaz de interpretar os comandos enviados pelo computador. Para o robô tipo aranha com quatro patas (AR+) desenvolvido neste projeto, são utilizados servo...
Leia mais