How to crop detected face image in opencv java

I detected a face in an image using opencv 2.4.10 in java

I set the 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 a new jpg image in opencv java.

Cropping Code

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

Error

Image of (Rect) method undefined for FaceDetector type imwrite (String, Mat) method is undefined for FaceDetector type

Please help me solve this problem.

thanks

+6
source share
4 answers
 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); }} 
+5
source

OpenCV has an area of ​​interest that you may find useful. If you use cv :: Mat, you can 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); 
+1
source

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); }} 
0
source

Try it. It works great.

 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 ); } } 
0
source

Source: https://habr.com/ru/post/981748/


All Articles