I'm trying to develop a Face Recognition app on Android and since I don't want to use NDK on the project (simply don't have the time to switch), I'm sticking to develop the whole app with Java and therefor I'm having some problems :
It seems the Contrib Module isn't included in OpenCV 2.4.2 . is there anyway to use it in the project ?
I tried using JavaCV to use the Contrib Module's "FaceRecognizer" class. there are two classes available called "FaceRecognizer" & "FaceRecognizerPtr". does anybody know what the difference between these two is ?
The classes mentioned above have a method called "Train" which (In C++) receives two Vectors of types "Mat & Integer" ( model->train(images,labels) & train(Vector theImages, Vector theLabels) . I tried passing them ArrayList & ArrayList and Vectors in Java but it seems that the method explicitly accepts the "CvArr" Data type which I'm not sure how to acquire... Here is the error :
The method train(opencv_core.CvArr, opencv_core.CvArr) in the type opencv_contrib.FaceRecognizer is not applicable for the arguments (ArrayList, ArrayList)
Does anyone know how to change my ArrayList to CvArr ?!
This is my first post and I wasn't sure whether to ask all three questions in one post or in three posts so sorry for any inconveniences... If you need any other Information about the project, feel free to ask.
android opencv javacv face-recognition
share
improve this question
edited
Jul 25 '13 at 18:11
Will
95.5k41233337
asked
Jul 28 '12 at 9:13
Cypher
1141111
1
Any reason why do you need to use OpenCV? Android SDK has built in android.media.FaceDetector class. Check this sample project: developer.com/ws/android/programming/… – yurilo
Jul 28 '12 at 9:28
1
Actually I'm looking for a Face Recognition library rather than only a mere Face Detection library and because of that I can't only use Android SDKs Face Detection... – Cypher
Jul 28 '12 at 9:48
add a comment
2 Answers
active oldest votes
up vote
5 down vote
accepted
Update
The following article was written by Petter Christian Bjelland, so all credit is his. I am posting it here, because his blog seems to be in Maintenance mode at the moment, but I think it is worth sharing.
Doing face recognition with JavaCV (from http://pcbje.com)
I couldn’t find any tutorial on how to perform face recognition using OpenCV and Java, so I decided to share a viable solution here. The solution is very inefficient in its current form as the training model is built at each run, however it shows what’s needed to make it work.
The class below takes two arguments: The path to the directory containing the training faces and the path to the image you want to classify. Not that all images has to be of the same size and that the faces already has to be cropped out of their original images (Take a look here if you haven’t done the face detection yet).
For the simplicity of this post, the class also requires that the training images have filename format: . For example:
Quoting from my reply on http://answers.opencv.org/question/865/the-contrib-module-problem.
Without ever having used javacv, let's see how far we can get by just looking at the interfaces! The project is on googlecode, which makes it easy to browse the code: http://code.google.com/p/javacv.
First have a look at how cv::FaceRecognizer has been wrapped (opencv_contrib.java, line 845 at time of writing this):
Aha, so you need to pass a MatVector for the images! You can pass the labels in a CvArr (one row or one column). The MatVector is defined in opencv_core, line 4629 (at time of writing this) and it looks like this:
Again just by looking at the code, I guess it can be used like this:
int numberOfImages =10;// Allocate some memory:MatVector images =newMatVector(numberOfImages);// Then fill the MatVector, you probably want to do something useful instead:for(int idx =0; idx < numberOfImages; idx++){// Load an image:CvArr image = cvLoadImage("/path/to/your/image");// And put it into the MatVector:
images.put(idx, image);}
You probably want to write yourself a method that does the conversion from a Java ArrayList to a MatVector (if such a function does not exist in javacv yet).
Now to your second question. FaceRecognizer is the equivalent to cv::FaceRecognizer. The native OpenCV C++ classes return a cv::Ptr, which is a (Smart) Pointer to a cv::FaceRecognizer. This has to be wrapped as well. See a pattern here?
The interface of FaceRecognizerPtr now looks like this:
So you can either get a FaceRecognizer from this class or put a FaceRecognizer into. You should only be concerned about the get(), as the Pointer is filled by the method creating the concrete FaceRecognizer algorithm:
So once you have got the FaceRecognizerPtr, you can do things like:
// Holds your training data and labels:MatVector images;CvArr labels;// Do something with the images and labels... Probably fill them?// ...// Then get a Pointer to a FaceRecognizer (FaceRecognizerPtr).// Java doesn't have default parameters, so you have to add some yourself,// if you pass 0 as num_components to the EigenFaceRecognizer, the number of// components is determined by the data, for the threshold use the maximum possible// value if you don't want one. I don't know the constant in Java:FaceRecognizerPtr model = createEigenFaceRecognizer(0,10000);// Then train it. See how I call get(), to get the FaceRecognizer inside the FaceRecognizerPtr:
model.get().train(images, labels);
This learns you an Eigenfaces model. And that's it!
share
improve this answer
edited
Dec 20 '12 at 22:58
answered
Jul 28 '12 at 11:35
bytefish
3,10311426
Thanks Philipp... But I'm having a little trouble trying to load data into CvArr... I already have the labels as strings of data... but I can't seem to find a way to insert these labels as an array to CvArr... let's call it a lack of OpenCV knowledge... can anybody help me with this issue ?! – Cypher
Aug 7 '12 at 11:32
Either use one QA page or the other, asking me on both is a bit of overkill. I can only write what I said on the OpenCV QA page. I can tell how to do it in OpenCV C++ sure, but you what you are asking is JavaCV. So such questions are best asked on the JavaCV mailing list, which is available at:https://groups.google.com/forum/?fromgroups#!forum/javacv – bytefish
Aug 7 '12 at 19:59
Thanks ! Will do... – Cypher
Aug 9 '12 at 7:51
I want to know if this ever worked? I have tried to implement this before but from what I could tell JavaCV didn't implement the facerec library porperly – Daniel Jonker
Dec 20 '12 at 4:23
Please see the updated answer for a full source code example. – bytefish
Dec 20 '12 at 22:59
范型参数不仅仅可以用于类型的声明上,例如
package com.tom.lang.generics;
import java.util.List;
public class Generics<T> {
private T value;
public Generics(T value) {
this.value =
How to generate a globally unique identifier in Java
http://stackoverflow.com/questions/21536572/generate-unique-id-in-java-to-label-groups-of-related-entries-in-a-log
http://stackoverflow
SHOW [FULL] TABLES [FROM db_name] [LIKE 'pattern']
SHOW TABLES列举了给定数据库中的非TEMPORARY表。您也可以使用mysqlshow db_name命令得到此清单。
本命令也列举数据库中的其它视图。支持FULL修改符,这样SHOW FULL TABLES就可以显示第二个输出列。对于一个表,第二列的值为BASE T
web framework层出不穷,特别是ruby/python,各有10+个,php/java也是一大堆 根据我自己的经验写了一个to do list,按照这个清单,一条一条的学习,事半功倍,很快就能掌握 一共25条,即便很磨蹭,2小时也能搞定一条,25*2=50。只需要50小时就能掌握任意一种web框架
各类web框架大同小异:现代web开发框架的6大元素,把握主线,就不会迷路
建议把本文
hostname // to display the computer name
hostname <changed name> // to change
go to: /etc/sysconfig/network, add/modify HOSTNAME=NEWNAME to change permenately
dont forget to change /etc/hosts
Java代码:
public class test03 {
public static void main(String[] args) {
int[][] a = {{1},{2,3},{4,5,6}};
System.out.println(a[0][1]);
}
}
运行结果:
Exception in thread "mai