如何使用JAVACV创建访问网络摄像头的Java Applet

时间:2013-08-31 05:17:20

标签: java opencv webcam japplet javacv

我使用JavaCV创建了一个Java应用程序,并且它已成功运行。现在我需要创建一个Applet来访问Web Cam。我知道需要applet签名才能访问Web Cam。我的问题是我尝试使用以下代码创建applet。但它没有用。即GUI没有创建,IDE中没有错误消息。

    import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_8U;
import static com.googlecode.javacv.cpp.opencv_core.cvAbsDiff;
import static com.googlecode.javacv.cpp.opencv_core.cvFlip;
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_CHAIN_APPROX_SIMPLE;
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_GAUSSIAN;
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_RETR_LIST;
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_RGB2GRAY;
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_THRESH_BINARY;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvCvtColor;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvFindContours;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvSmooth;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvThreshold;

import java.awt.Color;
import java.awt.event.WindowEvent;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;


import com.googlecode.javacpp.Loader;
import com.googlecode.javacv.FrameGrabber;
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.FrameGrabber.Exception;
import com.googlecode.javacv.cpp.opencv_core.CvContour;
import com.googlecode.javacv.cpp.opencv_core.CvMemStorage;
import com.googlecode.javacv.cpp.opencv_core.CvSeq;
import com.googlecode.javacv.cpp.opencv_core.IplImage;


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author samp
 */
public class VismanWeb extends javax.swing.JApplet 
{

    /**
     * Initializes the applet NewJApplet
     */

    private String server="";
    private String secur="";
    private String ipaddr="";
    IplImage frame;

    private boolean captFlag=false;
    public void start()
    {


        FrameGrabber grabber = new OpenCVFrameGrabber("");  
        int height=240,width=320;
        grabber.setImageHeight(height);
        grabber.setImageWidth(width); 

         try {      

          //Start grabber to capture video
          grabber.start();      

          //Declare img as IplImage
          IplImage img;

          while (true) {

           //inser grabed video fram to IplImage img
           img = grabber.grab();



           if (img != null) {      
             //Flip image horizontally
             cvFlip(img, img, 1);
            //Show video frame in canvas
             capturePnl.getGraphics().drawImage(img.getBufferedImage(), 0, 0, 320, 240, null);
            }
           }
          }
         catch (Exception e) {      
         }


    }
    @Override
    public void init() {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(VismanWeb.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(VismanWeb.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(VismanWeb.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(VismanWeb.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {
                public void run() {
                    initComponents();
                }
            });
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * This method is called from within the init() method to initialize the
     * form. WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        capturePnl = new javax.swing.JPanel();
        imagePnl = new javax.swing.JPanel();
        captureBtn = new javax.swing.JButton();
        getContentPane().setBackground( Color.WHITE );
        setMaximumSize(new java.awt.Dimension(360, 560));
        setMinimumSize(new java.awt.Dimension(360, 560));
        setPreferredSize(new java.awt.Dimension(360, 560));

        capturePnl.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        capturePnl.setMaximumSize(new java.awt.Dimension(320, 240));
        capturePnl.setMinimumSize(new java.awt.Dimension(320, 240));
        capturePnl.setPreferredSize(new java.awt.Dimension(320, 240));

        javax.swing.GroupLayout capturePnlLayout = new javax.swing.GroupLayout(capturePnl);
        capturePnl.setLayout(capturePnlLayout);
        capturePnlLayout.setHorizontalGroup(
            capturePnlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 318, Short.MAX_VALUE)
        );
        capturePnlLayout.setVerticalGroup(
            capturePnlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 238, Short.MAX_VALUE)
        );

        imagePnl.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(38, 21, 248)));
        imagePnl.setMaximumSize(new java.awt.Dimension(320, 240));
        imagePnl.setMinimumSize(new java.awt.Dimension(320, 240));

        javax.swing.GroupLayout imagePnlLayout = new javax.swing.GroupLayout(imagePnl);
        imagePnl.setLayout(imagePnlLayout);
        imagePnlLayout.setHorizontalGroup(
            imagePnlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 320, Short.MAX_VALUE)
        );
        imagePnlLayout.setVerticalGroup(
            imagePnlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 240, Short.MAX_VALUE)
        );

        captureBtn.setText("Capture");
        captureBtn.setMaximumSize(new java.awt.Dimension(320, 30));
        captureBtn.setMinimumSize(new java.awt.Dimension(320, 30));
        captureBtn.setPreferredSize(new java.awt.Dimension(320, 30));
        captureBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                imagePnl.getGraphics().drawImage(frame.getBufferedImage(), 0, 0,imagePnl.getWidth(), imagePnl.getHeight(), null);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(imagePnl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addComponent(captureBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(capturePnl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(20, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(capturePnl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(captureBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(imagePnl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
    }//                        



    // Variables declaration - do not modify                     
    private javax.swing.JButton captureBtn;
    private javax.swing.JPanel capturePnl;
    private javax.swing.JPanel imagePnl;
    // End of variables declaration                   

}

请帮我找一个解决方案。或者建议我另一种创建Applet的方法。我使用V4L4J库创建了applet。但它只适用于Linux。我需要在Windows和Linux中工作

1 个答案:

答案 0 :(得分:2)

您必须以多线程方式从Applet的start()方法将bufferedimage添加到任何其他SWING组件的CPanel

public class VismanWeb extends javax.swing.JApplet 
{

    /**
     * Initializes the applet NewJApplet
     */

    private String server="";
    private String secur="";
    private String ipaddr="";
    IplImage frame;
    OpenCVFrameGrabber grabber;


    private boolean captFlag=false;
    public void start()
    {

            Runnable run=new Runnable(){

                @Override
                public void run()
                {
                    // TODO Auto-generated method stub
                    grabber = new OpenCVFrameGrabber(0);
                    try {
                        grabber.start();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    //IplImage grabbedImage = null;
                    try {
                        frame = grabber.grab();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    //CanvasFrame canvasFrame = new CanvasFrame("Cam");
                   // canvasFrame.setCanvasSize(grabbedImage.width(), grabbedImage.height());
                     grabber.setFrameRate(10);
                    System.out.println("fraamerate = " + grabber.getFrameRate());
                      try {
                        while (capturePnl.isVisible() && (frame = grabber.grab()) != null) {
                            capturePnl.getGraphics().drawImage(frame.getBufferedImage(), 0, 0, 320, 240, null);
                            //System.out.print("inside\n");
                        }
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                      try {
                        grabber.stop();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

            };
            Thread capture=new Thread(run);
            capture.start();



    }






    @Override
    public void init() {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */



        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(VismanWeb.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(VismanWeb.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(VismanWeb.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(VismanWeb.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the applet */
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {
                public void run() {
                    initComponents();
                }
            });
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * This method is called from within the init() method to initialize the
     * form. WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        capturePnl = new javax.swing.JPanel();
        imagePnl = new javax.swing.JPanel();
        captureBtn = new javax.swing.JButton();
        getContentPane().setBackground( Color.WHITE );
        setMaximumSize(new java.awt.Dimension(360, 560));
        setMinimumSize(new java.awt.Dimension(360, 560));
        setPreferredSize(new java.awt.Dimension(360, 560));

        capturePnl.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        capturePnl.setMaximumSize(new java.awt.Dimension(320, 240));
        capturePnl.setMinimumSize(new java.awt.Dimension(320, 240));
        capturePnl.setPreferredSize(new java.awt.Dimension(320, 240));

        javax.swing.GroupLayout capturePnlLayout = new javax.swing.GroupLayout(capturePnl);
        capturePnl.setLayout(capturePnlLayout);
        capturePnlLayout.setHorizontalGroup(
            capturePnlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 318, Short.MAX_VALUE)
        );
        capturePnlLayout.setVerticalGroup(
            capturePnlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 238, Short.MAX_VALUE)
        );

        imagePnl.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(38, 21, 248)));
        imagePnl.setMaximumSize(new java.awt.Dimension(320, 240));
        imagePnl.setMinimumSize(new java.awt.Dimension(320, 240));

        javax.swing.GroupLayout imagePnlLayout = new javax.swing.GroupLayout(imagePnl);
        imagePnl.setLayout(imagePnlLayout);
        imagePnlLayout.setHorizontalGroup(
            imagePnlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 320, Short.MAX_VALUE)
        );
        imagePnlLayout.setVerticalGroup(
            imagePnlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 240, Short.MAX_VALUE)
        );

        captureBtn.setText("Capture");
        captureBtn.setMaximumSize(new java.awt.Dimension(320, 30));
        captureBtn.setMinimumSize(new java.awt.Dimension(320, 30));
        captureBtn.setPreferredSize(new java.awt.Dimension(320, 30));
        captureBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                imagePnl.getGraphics().drawImage(frame.getBufferedImage(), 0, 0,imagePnl.getWidth(), imagePnl.getHeight(), null);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(imagePnl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addComponent(captureBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(capturePnl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(20, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(capturePnl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(captureBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(imagePnl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
      //  capt();
    }//                        




//-----------------------------------------------------------------



//-----------------------------------------------------------------




    // Variables declaration - do not modify                     
    private javax.swing.JButton captureBtn;
    private javax.swing.JPanel capturePnl;
    private javax.swing.JPanel imagePnl;
    // End of variables declaration                   

}