Processamento de Imagens usando JAI

5 respostas
VinnyJ

Pessoal, no meu programa eu estava usando Java Media Framework (JMF), agora estou migrando pra Java Advanced Image (JAI) e está dando um probleminha… gostaria que pudessem me ajudar…

import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import javax.media.*;
import javax.media.format.*;
import javax.media.util.*;
import javax.media.control.*;
import javax.media.protocol.*;
import java.util.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import com.sun.image.codec.jpeg.*;
import java.awt.Color;

import javax.imageio.ImageIO;
import java.net.URL;
import javax.media.jai.*;
 

import javax.media.jai.iterator.*;
import javax.media.jai.iterator.RandomIter;
import javax.media.jai.iterator.RandomIterFactory;
import java.awt.image.renderable.ParameterBlock;
import java.awt.image.*;

import com.sun.media.jai.widget.DisplayJAI;
 
public class SwingCapture extends Panel implements ActionListener
{
  public static Player player = null;
  public CaptureDeviceInfo di = null;
  public MediaLocator ml = null;
  public JButton capture = null;
  public Buffer buf = null;
  public Image img = null;
  public VideoFormat vf = null;
  public BufferToImage btoi = null;
  public DisplayJAI imgpanel = null;
  public SpinnerNumberModel sm1;
  public JSpinner jsp1;

 
public SwingCapture()
{
setLayout(new BorderLayout());
setSize(320,950);
 
imgpanel = new DisplayJAI();
imgpanel.setSize(320,240);
imgpanel.setLayout(null);

capture = new JButton("Executa Processamento");
capture.addActionListener(this);
sm1 = new SpinnerNumberModel();
jsp1 = new JSpinner(sm1);
this.add(jsp1,"East");
String str1 = "vfw:ICatch (VI) PC Camera:0";
String str2 = "vfw:Microsoft WDM Image Capture (Win32):1";
di = CaptureDeviceManager.getDevice(str2);
ml = di.getLocator();

 
try {
player = Manager.createRealizedPlayer(ml);
player.start();
Component comp;
 
if ((comp = player.getVisualComponent()) != null)
{
add(comp,BorderLayout.NORTH);
}
add(capture,BorderLayout.CENTER );
add(imgpanel,BorderLayout.SOUTH);
}
catch (Exception e)
{
e.printStackTrace();
}
}

public PlanarImage RGBtoGray(PlanarImage entrada){
  PlanarImage saida=null;	
 if (entrada.getNumBands() > 1)
      {
     
      double[][] matrix = {{ 0.114, 0.587, 0.299, 0 }};
      ParameterBlock pb = new ParameterBlock();
      pb.addSource(entrada);
      pb.add(matrix);
      saida = JAI.create("bandcombine", pb, null);
      
      }
      
 return saida;
}
 public PlanarImage Zoom(PlanarImage entrada,float escalaX,float escalaY){
	
	ParameterBlock pb = new ParameterBlock();
	pb.addSource(entrada);
	pb.add(escalaY);
	pb.add(escalaY);
	pb.add(0.0F); pb.add(0.0F);
	pb.add(new InterpolationNearest());
	PlanarImage scaledImage = JAI.create("scale", pb);
	
   return scaledImage;
 }
 
 public PlanarImage sobel(PlanarImage entrada){
  PlanarImage saida=null;
  	
 if (entrada.getNumBands() > 1)
      {
      System.out.println("Numero de pixels pretos: 4" );	
     float[] sobel_h_data        = { 1.0F,  0.0F, -1.0F,
                                       2.0F,  0.0F,  -2.0F,
                                       1.0F,  0.0F,  -1.0F};
     float[] sobel_v_data        = {-1.0F,  -2.0F,  -1.0F,
                                       0.0F,  0.0F,  0.0F,
                                       1.0F,  2.0F,  1.0F};

     KernelJAI kern_h = new KernelJAI(3,3,sobel_h_data);
     KernelJAI kern_v = new KernelJAI(3,3,sobel_v_data);

      	// Create the Gradient operation.
      PlanarImage im1 =(PlanarImage)JAI.create("gradientmagnitude", entrada,kern_h, kern_v);
      
      saida = im1;
      }else
      {
      	System.out.println(" else ");
      }
      
 return saida;
}

public void processaImagem(Image img, String s) {


  // Obt�m primeira imagem em preto-e-branco
  BufferedImage bi1 = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_BYTE_GRAY);

    

  

    Graphics2D g2d = bi1.createGraphics();
    g2d.drawImage(img, null, null);
    g2d.dispose();

  PlanarImage imagem123 = PlanarImage.wrapRenderedImage((RenderedImage)bi1);
  if (imagem123 == null)
  	System.out.println("� null" );
  	
   PlanarImage imagemRes = Zoom(imagem123, 1,1);
   imgpanel.set(imagemRes);  
    System.out.println("-----Final------------------------------------" );
}
public static void main(String[] args)
{
Frame f = new Frame("Captura de Imagem");
SwingCapture cf = new SwingCapture();
 
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
playerclose();
System.exit(0);}});
 
f.add("Center",cf);
f.pack();
f.setSize(new Dimension(320,550));
f.setVisible(true);
}
 
 
public static void playerclose()
{
player.close();
player.deallocate();
}
 
 
public void actionPerformed(ActionEvent e)
{
  JComponent c = (JComponent) e.getSource();
 
  if (c == capture)
  {
    // Capturar um Frame
    FrameGrabbingControl fgc = (FrameGrabbingControl)
    player.getControl("javax.media.control.FrameGrabbingControl");
    buf = fgc.grabFrame();
 
    // Convert�-lo para imagem
    btoi = new
    BufferToImage((VideoFormat)buf.getFormat());
    img = btoi.createImage(buf);
 
     
    // Salva a Imagem
    saveJPG(img,"c:\\Foto.jpg");
    
    // Executar os procedimentos
   processaImagem(img,"c:\\Foto.jpg");
    
          
  }

Então aparece o seguinte erro:

Exception in thread "main" java.lang.NullPointerException
        at SwingCapture.<init>(SwingCapture.java:61)
        at SwingCapture.main(SwingCapture.java:163)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 17 segundos)

Desde Já Muito Obrigado

5 Respostas

danilomunoz

Olá!

O teu erro não é com JAI não e sim com JMF.

Veja o link: http://forum.java.sun.com/thread.jspa?threadID=247253
O código muito semelhante ao seu. Não sei se vc retirou de lá. Mas eles estavam com o mesmo problema e com uma sugestão conseguiram resolver.

Até mais.

VinnyJ

Obrigado pela dica…Realmente no fórum eu consegui corrigir o problema do NullPointer…
Onde se lia:

ml = di.getlocator();

Substitui-se por:

ml = new MediaLocator("vfw://0");

Obrigado pela dica e espero ajudar outras pessoas!!

danilomunoz

E, desculpe a curriosidade, mas pq vc está usando JAI?

Estou falando pq eu fiz meu TCC com JMF e processamento de vídeo e não tive muito sucesso com a JAI. Ficava um pouco lento.
Talvez se eu tivesse mexido mais a fundo melhorasse com certeza.

Mas a dica é: dependendo o que você for fazer nem use JAI. Acho que fica mais simples.

Até mais.

VinnyJ

Valew pela ajuda…Eu tbm to usando isso no meu TCC, to trabalhando com Processamento de frames de vídeo, com a finalidade de aplicar algumas técnicas de morfologia matemática nesses frames…
A idéia inicial era JMF, mas eu tava apanhando muito e achei muito complicado a forma q ele trabalha as coisas…
Daí me sugeriram o JAI, que tbm é novidade, mas tem a vantagem de ter algumas funções prontas e ser um pouco mais fácil o intendimento…
Então agora to tentando migrar pra JAI e depois vou analisar os resultados, pois não comparei ainda…
Obrigado pelo toque…Se tiver outros por favor, sou todo ouvidos!!

Abraço…

danilomunoz

Olá kra…

realmente o JMF não é tão fácil de mexer não … no meu TCC deu um trampo legal viu.

Até mais.

Criado 10 de abril de 2008
Ultima resposta 11 de abr. de 2008
Respostas 5
Participantes 2