Java 如何从OpenCv中的图像识别人

Java 如何从OpenCv中的图像识别人,java,opencv,Java,Opencv,我制作了一个从图像中检测人脸的程序: 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.highgui.Highgui; import org.open

我制作了一个从图像中检测人脸的程序:

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.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;

class DetectFaceDemo {
public void run() {
System.out.println("\nRunning DetectFaceDemo");

CascadeClassifier faceDetector = new CascadeClassifier("C:\\Users\\HM\\Documents\\NetBeansProjects\\vision\\src\\lbpcascade_frontalface.xml");
Mat image = Highgui.imread("C:\\Users\\HM\\Downloads\\john-lennon.jpg");

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

System.out.println(String.format("Faces detected: %s ", 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), 3);
}

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

public class image {
public static void main(String[] args) {
// Load the native library.
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
new DetectFaceDemo().run();
    }
}
我得到了这个:

想通过程序识别图像中的那个人,并在后面显示他的名字


计算机:这家伙是约翰。

< P>这是我以前在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}
创建图像向量和标签向量,如下所示:

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);
cv::Ptr model=createEigenFaceRecognitor();
模型->列车(图像、标签);
int预测;
双重信心;
模型->预测(框架、预测、置信度);

抱歉,用C++回答,但我肯定有类似的答案。另外,确定你使用的是OpenCV版本。

< P>这是我以前在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
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);

    }
}
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}
创建图像向量和标签向量,如下所示:

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);
cv::Ptr model=createEigenFaceRecognitor();
模型->列车(图像、标签);
int预测;
双重信心;
模型->预测(框架、预测、置信度);

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

您是否创建了列车组?我是指你的应用程序决定在其中搜索的搜索区域。不,我是初学者。我已经在某个地方看到过这个主题,但我不知道如何做到这一点——你的意思是什么。就你而言,约翰·列侬、罗伯特·德尼罗等等。。这叫做训练阶段。然后,你可以告诉你的应用程序决定哪个人最有可能是约翰·列侬。它能自信地预测人脸,这被称为预测阶段。我明白了,你能给我举个例子吗?你创造了火车吗?我是指你的应用程序决定在其中搜索的搜索区域。不,我是初学者。我已经在某个地方看到过这个主题,但我不知道如何做到这一点——你的意思是什么。就你而言,约翰·列侬、罗伯特·德尼罗等等。。这叫做训练阶段。然后,你可以告诉你的应用程序决定哪个人最有可能是约翰·列侬。它预测了脸上的自信,这就是所谓的预测阶段。我看,你能给我一个例子吗?我试过了,但我停留在最后一步,我不知道如何把C++代码传递给java。你看到过一个网络上的程序例子,你可以使用URLWhich OpenCV版本吗?明白了,你不使用OpenCV3。你可以在java代码中调用C++代码的方法很多。如果你在桌面上。因此,我建议在C++中编写代码。有很多例子教你如何做到这一点。如果你在Android中编码,就有整个故事的变化。我试过了,但我最后一步,我不知道如何把C++代码传递给java。你看到过一个网络上的程序例子,你可以使用URLWhich OpenCV版本吗?明白了,你不使用OpenCV3。你可以在java代码中调用C++代码的方法很多。如果你在桌面上。因此,我建议在C++中编写代码。有很多例子教你如何做到这一点。如果你是在安卓系统中编写代码,那么整个故事都会发生变化。
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);

    }
}