2016-06-27 8 views
1

私はOpenCV 2.4.9、Java言語とEclipseを使用しています。私の顔検出コードを以下に示します。問題は、検出された顔を切り抜いてフォルダに格納する方法です。検出された顔をビデオストリーミングからトリミングし、OpenCV Javaを使用してフォルダに保存するにはどうすればよいですか?

私は努力してきましたが、必要な出力を得ることができませんでした。

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 

このクラスで使用される他のファイルのコードがある:あなたのコードで

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; 
    } 
} 

答えて

3

は、あなたがMatOfRectとして顔矩形を検出し、映像上の四角形を描画しています。

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 faceROI = new Mat(webcam_image,rect); 
Highgui.imwrite("Face_frameNumber_faceInImageNumber.jpeg", faceROI); 

また、Opencv 3.1 /最新バージョンに移行することを検討してください。あなたは、最適化や過去1年間に寄贈された多くのアルゴリズムなどの新機能の恩恵を受けるでしょう。以降

OpenCVの3

のHighGUIは今VideoIOとImgCodecsに壊れています。また、Core.rectangleのような関数がImgProcに移動しました。

+1

OpenCV 3.0以上でHighguiが削除された結果、コードを変更する必要があることに注意してください。ヘルプについては、[このSOの質問](http://stackoverflow.com/questions/25059576/highgui-is-missing-from-opencv-3-0-0-jar)を参照してください。 –

+0

@ EdwardShen:はい。私の答えを更新する。ありがとう。 – saurabheights

+0

@Mee:悪い質問を投稿してもブロックされてしまうことは承知していますか?あなたがこの質問にどのように尋ねたのか、私がコメントしているところを見てください。コードがどの程度インデントされ、比較的読みやすいかに注目してください。次に、元の/ nowDeleted質問ページのLukasが言ったように、http://stackoverflow.com/help/mcveを読んでください。最小限のコードを投稿してみてください。 git(他のVCS)を使用している場合、いくつかの行を削除することは重要ではありません。 setTitleなどのコードを削除し始めます。尋ねる前に問題が見つかるかもしれません。 – saurabheights

関連する問題