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

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