2015-01-30 11 views
6

ho rilevato il volto nell'immagine utilizzando OpenCV 2.4.10 in javacome ritagliare l'immagine del volto rilevato in OpenCV java

ho messo il mio codice di rilevamento del volto.

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); 


} 

}

Ora voglio ritagliare il viso rilevato e salvarla nuova immagine jpg in OpenCV Java come.

codice colture è

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

L'errore è

L'immagine metodo (Rect) è definito per il tipo FaceDetector Procedimento imwrite (String, Mat) è definito per il tipo FaceDetector

Per favore qualcuno mi aiuti a risolvere questo.

Grazie

risposta

4
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); 



}} 
+1

Grazie mille @dhvani funziona bene. l'ho fatto in un altro modo il metodo è Mat crop = new Mat(); crop = srcImg.submat (y, height, x, width); Highgui.imwrite ("screen3.jpg", ritaglio); – Asha

+0

Alcune modifiche in opencv: Highgui.imwrite() ---> Imgcodecs.imwrite(); Core.rectangle() ---> Imgproc.rectangle(); – Nikola

1

OpenCV ha regione di funzioni di interesse che si possono trovare utili. Se stai usando il cv :: Mat allora potresti usare qualcosa come il seguente.

// 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); 
+0

Grazie a @ GPPK. Ho modificato il mio codice per favore vedere il mio codice modificato. Ha anche un errore nell'immagine (rectCrop) – Asha

+0

Great! Per favore accetta la mia risposta – GPPK

+0

Non sto utilizzando cv :: Mat. Puoi aiutare a risolvere questo in un altro modo ... Grazie per la tua risposta @ GPPk – Asha

0

Come tagliare più facce? 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

per ritagliare più facce – Asha

+0

sai tagliare più volti? – Amirul

0

Prova questa. Questo funziona bene.

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); 
    } 
} 
Problemi correlati