1

我尝试检测眼睛和嘴巴(仅来自图像中的一个人),但没有成功,我得到了很多圆圈或指向左眼。有人可以帮助我吗?我尝试了不同的图像。

这是我的代码:

import java.io.File;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfDouble;
import org.opencv.core.MatOfInt;
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.ml.CvANN_MLP;
import org.opencv.objdetect.CascadeClassifier;

public class faceeyes  extends Application{

    private Triangle tr;
    private File file;
    Mat mat;


    public Mat eyeDetector(Mat image , MatOfRect facedetections){
        // XML Files needed for Detection

        CascadeClassifier eye_cascade= new  CascadeClassifier(
                "C:\\Users\\...\\workspace_eclipse\\...\\src\\haarcascade_eye.xml");
        CascadeClassifier mouth_cascade= new  CascadeClassifier
                ("C:\\Users\\...\\workspace_eclipse\\...\\src\\haarcascade_mcs_mouth.xml");

        MatOfRect eyedetections=new MatOfRect();
        MatOfRect mouthDetections=new MatOfRect();

        Rect[] facesArray = facedetections.toArray();

        for (int i = 0; i < facesArray.length; i++){     
            Mat faceROI = image.submat(facesArray[i]);

            eye_cascade.detectMultiScale(faceROI, eyedetections, 1.1, 1, 1, new Size(30,30), new Size());
            Rect[] eyesArray = eyedetections.toArray();
            System.out.println("Eyes Detected:" + eyesArray.length);

            for (int j = 0; j < 3; j++){

                Point center1 = new Point(facesArray[i].x + eyesArray[j].x + eyesArray[j].width * 0.5, 
                        facesArray[i].y + eyesArray[j].y + eyesArray[j].height * 0.5);
                int radius = (int) Math.round( 5 );
                Core.circle(image, center1, radius, new Scalar(255, 0, 0), 4, 8, 0);

            }
            mouth_cascade.detectMultiScale(faceROI, mouthDetections, 1.1, 1, 1, new Size(30,30), new Size());
            Rect[] mouthArray = mouthDetections.toArray();

            for (int j = 0; j < 1; j++){

                Point center1 = new Point(facesArray[i].x + mouthArray[j].x + mouthArray[j].width * 0.5, 
                        facesArray[i].y + mouthArray[j].y + mouthArray[j].height * 0.5);
                int radius = (int) Math.round( 3 );
                Core.circle(image, center1, radius, new Scalar(255, 0, 0), 4, 8, 0);
            }

        }
        return image;
    }

    public void start(Stage primaryStage){
        String url="image/pic2.png";
        File file = new File(url);


        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        CascadeClassifier faceDetector
        = new CascadeClassifier("C:\\Users\\...\\workspace_eclipse\\...\\src\\haarcascade_frontalface_alt.xml");
        System.out.println(file.getPath());
        Mat imageMat = Highgui
                .imread(file.getPath());

        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(imageMat, faceDetections, 1.1, 1, 1, new Size(30,30), new Size());

        Rect[] rect2=faceDetections.toArray();
        rect2.toString();

        mat = eyeDetector(imageMat, faceDetections);
        String eyes;
        eyes = "image/Eye.png";
        Highgui.imwrite(eyes, mat);

        File filenew = new File(eyes);

        BorderPane mainPane = new BorderPane();
        mainPane.setTop(new ImageView(new Image("file:"+filenew.toString())));
        Scene scene = new Scene(mainPane,6,50);

        primaryStage.setScene(scene);
        primaryStage.setMaximized(true);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
4

0 回答 0