如何从“视频流”中裁剪检测到的脸部,并将其存储在使用OpenCV Java的文件夹中? [英] How can I crop Detected Face from the Video Streaming and store it in a folder using OpenCV Java?

查看:185
本文介绍了如何从“视频流”中裁剪检测到的脸部,并将其存储在使用OpenCV Java的文件夹中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用OpenCV 2.4.9,Java语言和eclipse。我的脸部检测代码如下。问题是如何裁减检测到的脸部并将其存储在文件夹中?



我努力尝试,但无法获得所需的输出。

  package code03; 
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.VideoCapture;
import org.opencv.objdetect.CascadeClassifier;

public class VideoPanel2扩展JPanel实现ActionListener
{
private static final long serialVersionUID = 1L;
// ******************************************** ************************************************** *
private BufferedImage image;
int count = 1;
// ******************************************** ************************************************** *
public VideoPanel2()
{
super();
}
// ***************************************** ************************************************** ******
public BufferedImage getimage()
{
return image;
}
// ***************************************** ************************************************** ******
public void setimage(BufferedImage newimage)
{
image = newimage;
return;
}
// ***************************************** ************************************************** ******
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if(this.image == null)return;
g.drawImage(this.image,10,492,650,43,this.image.getWidth(),this.image.getHeight(),count,count,null);
}
// ***************************************** ************************************************** ******

public void DatainIt()throws异常{
JFrame frame = new JFrame(Face Detection);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800,800);

System.loadLibrary(opencv_java249);
CascadeClassifier faceDetector = new CascadeClassifier(./ res / haarcascade_frontalface_alt.xml);
// CascadeClassifier faceDetector = new CascadeClassifier(./ res / lbpcascade_frontalface.xml);
VideoPanel2 vidPanel = new VideoPanel2();
frame.setContentPane(vidPanel);

// BUTTON
JButton save = new JButton(添加新人);
//save.setBounds(2,2,30,80);
JPanel pbutton = new JPanel();
pbutton.add(save);
// TextField
JTextField p_name = new JTextField(25);
frame.add(p_name);
frame.add(pbutton);
frame.setVisible(true);
save.addActionListener(this);

Mat webcam_image = new Mat();
MatToBufImg mat2Buf = new MatToBufImg();

VideoCapture capture = new VideoCapture(0);
if(capture.isOpened())
{
线程.sleep(100); //给网络摄像头时间初始化
while(true)
{
capture.read(webcam_image);
if(!webcam_image.empty())
{
frame.setSize(webcam_image.width()+ 40,webcam_image.height()+ 60);
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(webcam_image,faceDetections);
(Rect rect:faceDetections.toArray())
{
Core.rectangle(webcam_image,new Point(rect.x,rect.y)),新的Point(rect.x + rect .width,rect.y + rect.height),新的Scalar(0,255,0));
// Mat croppedImage = setimage(rect);

}
mat2Buf.setMatrix(webcam_image,.jpg);

//Highgui.imwrite(\"webcam_image.jpg,faceDetections);
// File file = new File(Image+。+.jpg);
//ImageIO.write((RenderedImage)webcam_image,.jpg,file);
vidPanel.setimage(mat2Buf.getBufferedImage());
vidPanel.repaint();

//获取视频流
// BufferedImage bi = mat2Buf.getBufferedImage(); // getimage();
//bi.getSubimage(arg0,arg1,arg2,arg3);
// File outputfile = new File(D:\\Java Project\\FaceRecognition\\src\\code03\\Face Database\\\saved.jpg );
//ImageIO.write((RenderedImage)bi,jpg,outputfile);

}
else
{
System.out.println(WebCam Capture的问题);
break;
}
}
} // end if
capture.release();
} // end DatainIt()
// ********************************* ************************************************** ************
public static void main(String arg [])throws Exception {
VideoPanel2 vid = new VideoPanel2();
vid.DatainIt();
} // end main
// ************************************* ************************************************** **********
public void actionPerformed(ActionEvent arg0){

}

} //类结束

此课程中使用的其他文件的代码是:

  package code03; 
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.InputStream;

import javax.imageio.ImageIO;

import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.highgui.Highgui;

public class MatToBufImg {
Mat矩阵;
MatOfByte暴徒
String fileExten;
public MatToBufImg(){

}

public MatToBufImg(Mat amatrix,String fileExt){
matrix = amatrix;
fileExten = fileExt;
}
public void setMatrix(Mat amatrix,String fileExt){
matrix = amatrix;
fileExten = fileExt;
mob = new MatOfByte();
}
public BufferedImage getBufferedImage(){
Highgui.imencode(fileExten,matrix,mob);
byte [] byteArray = mob.toArray();
BufferedImage bufImage = null;
try {
InputStream in = new ByteArrayInputStream(byteArray);
bufImage = ImageIO.read(in);
} catch(Exception e){
e.printStackTrace();
}
return bufImage;
}
}


解决方案

你的代码,你正在检测Face矩形作为MatOfRect并在视频上绘制一个矩形。

  Core.rectangle(webcam_image,new Point (rect.x,rect.y),新的Point(rect.x + rect.width,rect.y + rect.height),新的Scalar(0,255,0)); 

在这里,您已经拥有所需的图像。因此,将框架的一部分作为:

  Mat faceROI = new Mat(webcam_image,rect); 
Highgui.imwrite(Face_frameNumber_faceInImageNumber.jpeg,faceROI);

此外,请考虑移动到Opencv 3.1 /最新版本。您将受益于过去一年推出的新功能,如优化和许多算法。



OPENCV 3开始



Highgui现在已经破坏了VideoIO和ImgCodecs。另外,像函数的Core.rectangle已经移动到ImgProc。


I am using OpenCV 2.4.9, Java language and eclipse. My Face Detection code is given below. The question is how can I crop out the detected face and store it in a folder?

I've trying hard for it but couldn't get the required output.

package code03;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.VideoCapture;
import org.opencv.objdetect.CascadeClassifier;

public class VideoPanel2 extends JPanel implements ActionListener
{
    private static final long serialVersionUID = 1L;
    //***********************************************************************************************
    private BufferedImage image;
    int count = 1;
    //***********************************************************************************************
    public VideoPanel2()
    {
        super();
    }
    //***********************************************************************************************
    public BufferedImage getimage()
    {
        return image;
    }
    //***********************************************************************************************
    public void setimage(BufferedImage newimage)
    {
        image = newimage;
        return;
    }
    //***********************************************************************************************
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);   
        if (this.image==null) return;         
         g.drawImage(this.image,10,492,650,43,this.image.getWidth(),this.image.getHeight(), count, count, null);
    }
    //***********************************************************************************************

    public void DatainIt() throws Exception{
        JFrame frame = new JFrame("Face Detection");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800,800);

        System.loadLibrary("opencv_java249");
        CascadeClassifier faceDetector = new CascadeClassifier("./res/haarcascade_frontalface_alt.xml");
        //CascadeClassifier faceDetector = new CascadeClassifier("./res/lbpcascade_frontalface.xml");
        VideoPanel2 vidPanel = new VideoPanel2();
        frame.setContentPane(vidPanel);

        //BUTTON
        JButton save = new JButton("Add a new Person");
        //save.setBounds(2, 2, 30, 80);
        JPanel pbutton = new JPanel();
        pbutton.add(save);
        //TextField
        JTextField p_name = new JTextField(25);
        frame.add(p_name);
        frame.add(pbutton);
        frame.setVisible(true);
        save.addActionListener(this);

        Mat webcam_image = new Mat();
        MatToBufImg mat2Buf = new MatToBufImg();

        VideoCapture capture = new VideoCapture(0);
        if(capture.isOpened())
        {
            Thread .sleep(100); //Give time to webcam to initialize itself
            while(true)
            {
                capture.read(webcam_image);
                if(!webcam_image.empty())
                {
                    frame.setSize(webcam_image.width()+40, webcam_image.height()+60);
                    MatOfRect faceDetections = new MatOfRect();
                    faceDetector.detectMultiScale(webcam_image, faceDetections);
                    for(Rect rect : faceDetections.toArray())
                    {
                        Core.rectangle(webcam_image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255,0));
                        //Mat croppedImage = setimage(rect);

                    }
                    mat2Buf.setMatrix(webcam_image, ".jpg");

                    //Highgui.imwrite("webcam_image.jpg", faceDetections);
                    //File file = new File("Image" + "." + ".jpg");
                    //ImageIO.write((RenderedImage) webcam_image, ".jpg", file);
                    vidPanel.setimage(mat2Buf.getBufferedImage());
                    vidPanel.repaint();

                    // get the video stream
                    //BufferedImage bi = mat2Buf.getBufferedImage();//getimage();
                    //bi.getSubimage(arg0, arg1, arg2, arg3);
                    //File outputfile= new File("D:\\Java Project\\FaceRecognition\\src\\code03\\Face Database\\saved.jpg");
                    //ImageIO.write((RenderedImage) bi, "jpg", outputfile);

                }
                else
                {
                    System.out.println("Problems with WebCam Capture");
                    break;
                }
            }
        }//end if
        capture.release();
    }//end DatainIt()
    //***********************************************************************************************
    public static void main(String arg[]) throws Exception{
        VideoPanel2 vid = new VideoPanel2();
        vid.DatainIt();
    }//end main
    //***********************************************************************************************   
    public void actionPerformed(ActionEvent arg0) {

    }

}//end of class

The code of other file used in this class is:

package code03;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.InputStream;

import javax.imageio.ImageIO;

import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.highgui.Highgui;

public class MatToBufImg{
    Mat matrix;
    MatOfByte mob;
    String fileExten;
public MatToBufImg(){

}

public MatToBufImg(Mat amatrix, String fileExt){
    matrix = amatrix;
    fileExten = fileExt;
}
public void setMatrix(Mat amatrix, String fileExt){
    matrix = amatrix;
    fileExten = fileExt;
    mob = new MatOfByte();
}
public BufferedImage getBufferedImage(){
    Highgui.imencode(fileExten, matrix, mob);
    byte[] byteArray = mob.toArray();
    BufferedImage bufImage = null;
    try{
        InputStream in = new ByteArrayInputStream(byteArray);
        bufImage = ImageIO.read(in);
    }catch(Exception e){
        e.printStackTrace();
    }
    return bufImage;
    }
}

解决方案

In your code, you are detecting Face rectangles as MatOfRect and drawing a rectangle on the video.

Core.rectangle(webcam_image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255,0));

Here, you already have the roi of the image you need. So crop the roi part of the frame as:

Mat faceROI = new Mat(webcam_image,rect);
Highgui.imwrite("Face_frameNumber_faceInImageNumber.jpeg", faceROI);

Also, please consider moving to Opencv 3.1/latest version. You will benefit from the new features such as optimisations and many algorithms which have been contributed over past year.

OPENCV 3 onwards:

Highgui is now broken to VideoIO and ImgCodecs. Also, Core.rectangle like functions has moved to ImgProc.

这篇关于如何从“视频流”中裁剪检测到的脸部,并将其存储在使用OpenCV Java的文件夹中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆