如何使用Java在CascadeClassifier中设置裁剪大小

2019年6月1日 24点热度 0条评论

public BufferedImage detectAndDisplay(BufferedImage img, CascadeClassifier faceCascade) {
    Mat frameGray = new Mat();
    BufferedImage imgout = null;

    Mat image = ImagePreProcessing.bufferedImageToMat(img);

    // -- Detect faces
    MatOfRect faces = new MatOfRect();
    faceCascade.detectMultiScale(image, faces);

    List<Rect> listOfFaces = faces.toList();
    for (Rect face : listOfFaces) {
        Point center = new Point(face.x + face.width / 2, face.y + face.height / 2);
        Imgproc.ellipse(image, center, new Size(face.width / 2, face.height / 2), 0, 0, 360,
                new Scalar(255, 0, 255), 3);

        Mat faceROI = image.submat(face);
        imgout = ImagePreProcessing.Mat2BufferedImage(faceROI);
        System.out.println("OpenCV: " +center);

    }
    return imgout;
}

该代码我有..但是我不知道设置裁剪输出图像的代码在哪里。

我想让图片像带有圆圈模板的原始版本。

可以给我建议,请:)

输入:

输出:

解决方案如下:

在您的代码中,您返回了原始图像的裁剪图像,因此,如果您想要原始图像,请绘制圆并将其转换为BufferedImage并返回。

for (Rect face : listOfFaces) {
        Point center = new Point(face.x + face.width / 2, face.y + face.height / 2);
        Imgproc.ellipse(image, center, new Size(face.width / 2, face.height / 2), 0, 0, 360,
                new Scalar(255, 0, 255), 3);

        // dot not crop!!!
        /*Mat faceROI = image.submat(face);
        imgout = ImagePreProcessing.Mat2BufferedImage(faceROI);*/

        System.out.println("OpenCV: " +center);
        imgout = ImagePreProcessing.Mat2BufferedImage(image);

    }