如何使用OpenCV和Java保存面部和识别?

时间:2018-03-13 05:34:24

标签: java opencv javacv

我是OpenCV的新手。我能够从webCam中检测到脸部。我有点困惑如何保存检测到的脸,如何保存和识别再次那个人再次来到相机前。

检测代码

private void detectAndDisplay(Mat frame)
{
    MatOfRect faces = new MatOfRect();
    Mat grayFrame = new Mat();

    // convert the frame in gray scale
    Imgproc.cvtColor(frame, grayFrame, Imgproc.COLOR_BGR2GRAY);
    // equalize the frame histogram to improve the result
    Imgproc.equalizeHist(grayFrame, grayFrame);

    // compute minimum face size (20% of the frame height, in our case)
    if (this.absoluteFaceSize == 0)
    {
        int height = grayFrame.rows();
        if (Math.round(height * 0.2f) > 0)
        {
            this.absoluteFaceSize = Math.round(height * 0.2f);
        }
    }

    // detect faces
    this.faceCascade.detectMultiScale(grayFrame, faces, 1.1, 2, 0 | Objdetect.CASCADE_SCALE_IMAGE,
            new Size(this.absoluteFaceSize, this.absoluteFaceSize), new Size());

    // each rectangle in faces is a face: draw them!
    Rect[] facesArray = faces.toArray();
    for (int i = 0; i < facesArray.length; i++)
        Imgproc.rectangle(frame, facesArray[i].tl(), facesArray[i].br(), new Scalar(0, 255, 0), 3);

}

2 个答案:

答案 0 :(得分:2)

如果您想保存检测到的脸部图像,也许您可​​以尝试这样的事情

for (int i = 0; i < facesArray.length; i++)
{   
     Imgproc.rectangle(frame, facesArray[i].tl(), facesArray[i].br(), new Scalar(0, 255, 0), 3);
     Rect rect(facesArray[i].tl().x, facesArray[i].tl().y, facesArray[i].br().x - facesArray[i].tl().x, facesArray[i].br().y - facesArray[i].tl().y);
     Mat cropFace = frame(rect);
     imwrite("./face"+i+".jpg", cropFace);
}

答案 1 :(得分:0)

我得到了解决方案

      for (Rect rect : facesArray) {
            Imgproc.rectangle(frame, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
                    new Scalar(0, 255, 0)); // frame is Mat
            rectCrop = new Rect(rect.x, rect.y, rect.width, rect.height);

            Mat image_roi = new Mat(frame,rectCrop);
             Imgcodecs.imwrite("./face"+ i +".jpg",image_roi);
             i++;
        }

现在,我可以裁剪多个面孔