简体   繁体   中英

Take picture using webcam in netbeans java?

I have been busy with trying to get the webcam to work within netbeans over the past few days. The problem I am having is to get the coding to activate and take a picture using the webcam.

So far I have seen that I will have to use the OpenCV and some other JAR files. Please could someone help me out by perfecting the coding I have below:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // coding for webcam and taking a picture
    OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
    try
    {
        //start of the webcam for taking the picture
        grabber.start();
        Image IM = this.takePicture();
        //stops the webcam            
        grabber.stop();      


    }
    catch (Exception e)
    {
        //displays error message if problem with webcam
        JOptionPane.showMessageDialog(null, "Problem accessing or using the Webcam!");
    }

} 

What I need is for the picture to be displayed in a label on my interface after it has taken the picture.

The Open CV has been successfully installed and now just the coding needed to get the picture taken.

Any Help would be helpful.

Okay, your coding is a bit off, it does need some changes made to it. You are on the right track however.

I do have a sample code that may be able to help you out which works:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        // coding for webcam and taking a picture
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        try
        {
            //start of the webcam for taking the picture
            grabber.start();
            //grabs teh image taken from the webcam
            IplImage img = grabber.grab();            
            //checks if the webcam has taken the picture and if the picture if mot empty
            if(img != null)
            {
                //determines where to save the picture
                cvSaveImage("C:\\User1\\PrifilePicture\\"+lbl_StudnetLogin.getText()+".jpeg", img);                         
            }
            //stops the webcam            
            grabber.stop();
            //used to resize teh picture taken in order to display picture to the user      
            Image imeResize = ImageIO.read(new File("C:\\SalVentri\\PrifilePicture\\"+lbl_StudnetLogin.getText()+".jpeg"));
            //1st ---> width _______2sn ---> height
            lbl_Profile.setIcon(new ImageIcon(imeResize.getScaledInstance(155, 100, 100)));

        }
        catch (Exception e)
        {
            //displays error message if problem with webcam
            JOptionPane.showMessageDialog(null, "Problem accessing or using the Webcam!");
        }

    } 

Hope this helps

I found that this works as well.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

import org.opencv.core.*;
import org.opencv.highgui.Highgui;        
import org.opencv.highgui.VideoCapture;        

public class JPanelOpenCV extends JPanel{

BufferedImage image;

public static void main (String args[]) throws InterruptedException{
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

    JPanelOpenCV t = new JPanelOpenCV();
    VideoCapture camera = new VideoCapture(0);

    Mat frame = new Mat();
    camera.read(frame); 

    if(!camera.isOpened()){
        System.out.println("Error");
    }
    else {                  
        while(true){        

            if (camera.read(frame)){

                BufferedImage image = t.MatToBufferedImage(frame);

                t.window(image, "Original Image", 0, 0);

                t.window(t.grayscale(image), "Processed Image", 40, 60);

                //t.window(t.loadImage("ImageName"), "Image loaded", 0, 0);

                break;
            }
        }   
    }
    camera.release();
}

@Override
public void paint(Graphics g) {
    g.drawImage(image, 0, 0, this);
}

public JPanelOpenCV() {
}

public JPanelOpenCV(BufferedImage img) {
    image = img;
}   

//Show image on window
public void window(BufferedImage img, String text, int x, int y) {
    JFrame frame0 = new JFrame();
    frame0.getContentPane().add(new JPanelOpenCV(img));
    frame0.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame0.setTitle(text);
    frame0.setSize(img.getWidth(), img.getHeight() + 30);
    frame0.setLocation(x, y);
    frame0.setVisible(true);
}

//Load an image
public BufferedImage loadImage(String file) {
    BufferedImage img;

    try {
        File input = new File(file);
        img = ImageIO.read(input);

        return img;
    } catch (Exception e) {
        System.out.println("erro");
    }

    return null;
}

//Save an image
public void saveImage(BufferedImage img) {        
    try {
        File outputfile = new File("Images/new.png");
        ImageIO.write(img, "png", outputfile);
    } catch (Exception e) {
        System.out.println("error");
    }
}

//Grayscale filter
public BufferedImage grayscale(BufferedImage img) {
    for (int i = 0; i < img.getHeight(); i++) {
        for (int j = 0; j < img.getWidth(); j++) {
            Color c = new Color(img.getRGB(j, i));

            int red = (int) (c.getRed() * 0.299);
            int green = (int) (c.getGreen() * 0.587);
            int blue = (int) (c.getBlue() * 0.114);

            Color newColor =
                    new Color(
                    red + green + blue,
                    red + green + blue,
                    red + green + blue);

            img.setRGB(j, i, newColor.getRGB());
        }
    }

    return img;
}

public BufferedImage MatToBufferedImage(Mat frame) {
    //Mat() to BufferedImage
    int type = 0;
    if (frame.channels() == 1) {
        type = BufferedImage.TYPE_BYTE_GRAY;
    } else if (frame.channels() == 3) {
        type = BufferedImage.TYPE_3BYTE_BGR;
    }
    BufferedImage image = new BufferedImage(frame.width(), frame.height(), type);
    WritableRaster raster = image.getRaster();
    DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
    byte[] data = dataBuffer.getData();
    frame.get(0, 0, data);

    return image;
}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM