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