Reputation: 760
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
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
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
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
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
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
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