Asha
Asha

Reputation: 760

how to crop the detected face image in opencv java

I detected the face in the image using opencv 2.4.10 in java

I put my face detection code.

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.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;

public class FaceDetector {

public static void main(String[] args)throws Exception {
    int x,y,height,width;

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    System.out.println("\nRunning FaceDetector");

    //CascadeClassifier faceDetector = new CascadeClassifier(FaceDetector.class.getResource("haarcascade_frontalface_alt.xml").getPath());
    CascadeClassifier faceDetector=new CascadeClassifier();
    faceDetector.load("C:/opencv-2.4.10/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");
    //System.out.println(""+faceDetector);
   // Mat image = Highgui .imread(FaceDetector.class.getResource("D:/shekar.jpg").getPath());
    Mat image = Highgui .imread("D:/Eclipse - New Juno/New Juno Projects/detectface/man1.jpg");
    MatOfRect faceDetections = new MatOfRect();
    faceDetector.detectMultiScale(image, faceDetections);

    System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));

    for (Rect rect : faceDetections.toArray()) {
        Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
                new Scalar(0, 255, 0));
    }
    String filename = "china.jpg";
    System.out.println(String.format("Writing %s", filename));
    Highgui.imwrite(filename, image);


}

}

Now i want to crop the detected face and save it as new jpg image in opencv java.

Crop code is

 Rect rectCrop = new Rect(x, y, width, height);
 Mat image_roi = image(rectCrop);
        image_roi.copyTo(cropimage);
        imwrite("cropimage.jpg",image_roi);

The error is

The method image(Rect) is undefined for the type FaceDetector The method imwrite(String, Mat) is undefined for the type FaceDetector

Please anyone help me to solve this.

Thanks

Upvotes: 11

Views: 27605

Answers (6)

dhvani
dhvani

Reputation: 156

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.core.Size;
import org.opencv.highgui.Highgui;
import static org.opencv.highgui.Highgui.imwrite;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;

public class FaceDetector {
    private static Mat cropImage;

public static void main(String[] args)throws Exception {
    int x = 0,y = 0,height = 0,width = 0;

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        System.out.println("\nRunning FaceDetector");

//CascadeClassifier faceDetector = new CascadeClassifier(FaceDetector.class.getResource("haarcascade_frontalface_alt.xm    l").getPath());
CascadeClassifier faceDetector = new CascadeClassifier(Snapshot.class.getResource("haarcascade_frontalface_alt.xml").getPath().substring(1));
Mat image = Highgui.imread("C:\\image.jpg");

faceDetector.detectMultiScale(image, face_Detections);
System.out.println(String.format("Detected %s faces",  face_Detections.toArray().length));

Rect rect_Crop=null;
for (Rect rect : face_Detections.toArray()) {
    Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
            new Scalar(0, 255, 0));
    rectCrop = new Rect(rect.x, rect.y, rect.width, rect.height);
}
       
 Mat image_roi = new Mat(image,rectCrop);
  Highgui.imwrite("C:\\cropimage_912.jpg",image_roi);

}}

Upvotes: 14

I.Tyger
I.Tyger

Reputation: 795

 Rect[] facesArray = faces.toArray();
    for (int i = 0; i < facesArray.length; i++) {
        Rect rect = facesArray[i];
        Imgproc.rectangle(frame, rect.tl(), rect.br(), new Scalar(0, 255, 0), 2);
        Mat submat = frame.submat(facesArray[i]);
        imwrite("./face" + i + ".jpg", submat);
    }

This looks like the smartest way to do it .

Upvotes: 0

itsfreeandtakesminute
itsfreeandtakesminute

Reputation: 41

 int detectedFaces = faceDetections.toArray().length;
        Rect rect_Crop=null;

        // Draw a bounding box around each face.
        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));
            rect_Crop = new Rect(rect.x, rect.y, rect.width, rect.height);


            Mat image_roi = new Mat(image,rect_Crop);
            StringBuilder sb = new StringBuilder("outputimage");
            sb.append(detectedFaces).append(".jpg");
            Imgcodecs.imwrite(sb.toString(),image_roi);
            detectedFaces--;
        }

This is for people asking how to crop multiple faces with openCV java.

Upvotes: 0

Rubaiyat Jahan Mumu
Rubaiyat Jahan Mumu

Reputation: 4127

Try this. This one works just fine.

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("D:\\OpenCv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
        System.out.println ( "Working" );
        // Input image
        Mat image = Imgcodecs.imread("D:\\input.jpg");

        // Detecting faces
        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(image, faceDetections);

        // 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));
            rectCrop = new Rect(rect.x, rect.y, rect.width, rect.height);
        }

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

        Mat markedImage = new Mat(image,rectCrop);
        Imgcodecs.imwrite("D:\\cropimage.jpg",markedImage );
    }
}

Upvotes: 2

Amirul
Amirul

Reputation: 21

how to crop multiple faces? dhvani.

for (Rect rect : face_Detections.toArray()) {
    Core.rectangle(
        image,
        new Point(rect.x, rect.y),
        new Point(rect.x + rect.width, rect.y + rect.height),
        new Scalar(0, 255, 0));
    rectCrop = new Rect(rect.x, rect.y, rect.width, rect.height);
}

Mat image_roi = new Mat(image,rectCrop);
    Highgui.imwrite("C:\\cropimage_912.jpg",image_roi);
}}

Upvotes: 2

GPPK
GPPK

Reputation: 6666

OpenCV has region of interest functions which you may find useful. If you are using the cv::Mat then you could use something like the following.

// Take your Final Detected Image
image;

// These values need to be your determined face rect values
cv::Rect myROI(x, y,width, height);

// Crop the full image to that image contained by the rectangle myROI
// Note that this doesn't copy the data
cv::Mat croppedImage = image(myROI);

Upvotes: 3

Related Questions