想要将检测到的裁剪图像存储在文件中

时间:2018-01-30 15:23:52

标签: java opencv image-processing

我在opencv中使用haarcascade成功检测到人脸。我已经运行了一个循环,它将仅裁剪检测到的图像部分并存储到系统中。但它只能裁剪一个检测到的脸部,其余的脸部不会被裁剪并保存到系统中。我附上了我的代码。请帮忙解决我的问题。例如。如果图像包含4个人,那么haarcascade会检测4个面部,但是循环只能裁剪一个检测到的图像,其余3个图像不会被裁剪..!

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.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;

public class FaceDetection
{

public static void main(String[] args)
{

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);


    CascadeClassifier faceDetector = new CascadeClassifier();

 faceDetector.load("G:\\haarcascade_frontalface_alt.xml");
    //System.out.println ( "Working" );
    // Input image
    Mat image = Imgcodecs.imread("G:\\sample.jpg");

    // Detecting faces
    MatOfRect faceDetections = new MatOfRect();
    faceDetector.detectMultiScale(image, faceDetections);
    System.out.println(String.format("Detected %s faces", 
            faceDetections.toArray().length));
    // Creating a rectangular box showing faces detected
    Rect rectCrop=null;
    for (Rect rect : faceDetections.toArray())
    {
        Imgproc.rectangle(image, new Point(rect.x, rect.y),
         new Point(rect.x + rect.width, rect.y + rect.height),
                                       new Scalar(0, 255, 0),2);
        rectCrop = new Rect(rect.x, rect.y, rect.width, rect.height);

    }

    Rect[] count = faceDetections.toArray();
    System.out.println(""+count.length);

    // Saving the output image
    String filename = "Ouput.jpg";
    Imgcodecs.imwrite("G:\\"+filename, image);

    Mat markedImage = new Mat(image,rectCrop);

    Imgcodecs.imwrite("G:\\crop1.jpg",markedImage );

}
}

1 个答案:

答案 0 :(得分:0)

您的代码循环遍历所有这些代码并选择最后一张脸然后保存该脸部。你需要它来a)单独裁剪它们并添加将它们标记在一起的元,或者b)将它们全部裁剪在一起。

对于选项a,在循环内,您需要单独保存每个文件。只需将文件代码保存到循环中并进行调整即可。

对于选项b,您可能需要一些其他软件来将所有面部裁剪在一起。这可以通过多种方式完成。您可以连接所有a)pixle数组,或b)单个字节。然后,当您需要在人与人之间找到联系时,您只需再次在文件上运行人脸识别软件。