如何在OpenCv中识别图像中的人物

时间:2016-01-15 23:31:15

标签: java opencv

我制作了一个程序,用于检测图像中的面部:

>>> x = "22.0;2016-01-16 00:16:18"
>>> x.strip().split(';')
['22.0', '2016-01-16 00:16:18']
>>> y = [word.split(' ') for word in x.split(';')]
>>> y
[['22.0'], ['2016-01-16', '00:16:18']]
>>> [item for sublist in y for item in sublist]
['22.0', '2016-01-16', '00:16:18']

我得到了这个: John lennon picture

想要通过该计划识别出Image中的人并在之后显示他的名字。

类似的东西:电脑:这个人是约翰。

2 个答案:

答案 0 :(得分:2)

package com.test8;

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;

class FaceDetection {
    // Load the native library.
    static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}

    public static void main(String[] args) {

        System.out.println("\nRunning DetectFaceDemo");

        CascadeClassifier faceDetector = new CascadeClassifier("D:\\AntonKONG\\OpenCV\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
        Mat image = Imgcodecs.imread("src//data//hkid2.png");

        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(image, faceDetections);

        System.out.println(String.format("Faces detected: %s ", faceDetections.toArray().length));

        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), 3);
        }

        String filename = "detcSuccessful.png";
        Imgcodecs.imwrite(filename, image);

    }
}

答案 1 :(得分:1)

以下是我之前在C ++的opencv 2.4中编写的代码。正如我所看到的,您正在使用JAVA-OpenCV包装器,因此您可以轻松找到JAVA等价物。在以下代码中,图像是图像矢量,标签是标签矢量。对于实际情况,请考虑您的搜索空间仅限三人:

0 : John Lenon 
    john1.png  // 100x90 px
    john2.png  // 100x90 px
    john3.png  // 100x90 px
1 : Robert DeNiro
    robert1.png      // 100x90 px
    robert2.png      // 100x90 px
    robert3.png      // 100x90 px
2 : AlPacino
    al1.png    // 100x90 px
    al2.png    // 100x90 px
    al3.png    // 100x90 px

0,1,2是标签,你可以看到有3个面对应每个标签。读取每个图像并将其存储在Mat对象中。如下:

Mat j1,j2,j3; // John Lennon's faces  :: label 0
Mat r1,r2,r3; // Robert Deniro's faces :: label 1
Mat a1,a2,a3; // Al Pacino's faces :: label 2

创建图像矢量和标签矢量,如下所示:

images:{j1,j2,j3,r1,r2,r3,a1,a2,a3}
labels:{0,0,0,1,1,1,2,2,2}

然后,将它们传递给下面的代码。

cv::Ptr<cv::FaceRecognizer> model = createEigenFaceRecognizer();
    model->train(images, labels);
    int prediction;
    double confidence;
    model->predict(Frame,prediction,confidence);

很抱歉用C ++回答,但我确信有类似的回答。此外,请确保您使用的是哪个版本的opencv。