
com.github.mhendred.face4j.model.Face Maven / Gradle / Ivy
/*
* Copyright (c) 2010 Marlon Hendred
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.github.mhendred.face4j.model;
import static com.github.mhendred.face4j.model.Point.fromJson;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.NoSuchElementException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Holds "Tag" JSON object
*
* @author mhendred
*
*/
public class Face
{
private final boolean confirmed;
private final boolean manual;
private final float width;
private final float height;
private final float yaw;
private final float roll;
private final float pitch;
private final int threshold;
private final int faceConfidence;
private final Point center;
private final Point leftEye;
private final Point rightEye;
private final Point mouthLeft;
private final Point mouthRight;
private final Point mouthCenter;
private final Point leftEar;
private final Point rightEar;
private final Point chin;
private final Point nose;
private final Rect faceRect;
private final String tid;
private final List guesses;
private boolean smiling;
private boolean glasses;
private Gender gender;
private String label;
private String mood;
private String lips;
private int ageEst;
private int ageMax;
private int ageMin;
public Face(JSONObject jObj) throws JSONException
{
tid = jObj.getString("tid");
label = jObj.optString("label");
confirmed = jObj.getBoolean("confirmed");
manual = jObj.getBoolean("manual");
width = (float) jObj.getDouble("width");
height = (float) jObj.getDouble("height");
yaw = (float) jObj.getDouble("yaw");
roll = (float) jObj.getDouble("roll");
pitch = (float) jObj.getDouble("pitch");
threshold = jObj.optInt("threshold");
center = fromJson(jObj.optJSONObject("center"));
leftEye = fromJson(jObj.optJSONObject("eye_left"));
rightEye = fromJson(jObj.optJSONObject("eye_right"));
leftEar = fromJson(jObj.optJSONObject("ear_left"));
rightEar = fromJson(jObj.optJSONObject("ear_right"));
chin = fromJson(jObj.optJSONObject("chin"));
mouthCenter = fromJson(jObj.optJSONObject("mouth_center"));
mouthRight = fromJson(jObj.optJSONObject("mouth_right"));
mouthLeft = fromJson(jObj.optJSONObject("mouth_left"));
nose = fromJson(jObj.optJSONObject("nose"));
guesses = Guess.fromJsonArray(jObj.optJSONArray("uids"));
// Attributes
jObj = jObj.getJSONObject("attributes");
if (jObj.has("smiling"))
smiling = jObj.getJSONObject("smiling").getBoolean("value");
if (jObj.has("glasses"))
glasses = jObj.getJSONObject("glasses").getBoolean("value");
if (jObj.has("gender"))
gender = Gender.valueOf(jObj.getJSONObject("gender").getString("value"));
if(jObj.has("mood"))
mood = jObj.getJSONObject("mood").getString("value");
if(jObj.has("lips"))
lips = jObj.getJSONObject("lips").getString("value");
if(jObj.has("age-est"))
ageEst = jObj.getJSONObject("age-est").getInt("vaule");
if(jObj.has("age-min"))
ageMin = jObj.getJSONObject("age-min").getInt("vaule");
if(jObj.has("age-max"))
ageMax = jObj.getJSONObject("age-max").getInt("vaule");
faceConfidence = jObj.getJSONObject("face").getInt("confidence");
faceRect = new Rect(center, width, height);
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getUids()
*/
public List getGuesses ()
{
return guesses;
}
/**
* @return the {@link Guess} with the highest confidence for this face
*/
public Guess getGuess ()
{
try
{
return Collections.max(guesses);
}
catch (NoSuchElementException nsee)
{
return new Guess();
}
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getWidth()
*/
public double getWidth ()
{
return width;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getHeight()
*/
public double getHeight ()
{
return height;
}
public int getFaceConfidence()
{
return faceConfidence;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getLabel()
*/
public String getLabel ()
{
return label;
}
public String getLips ()
{
return lips;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getTID()
*/
public String getTID ()
{
return tid;
}
public String getMood()
{
return mood;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getThreshHold()
*/
public int getThreshHold ()
{
return threshold;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#isConfirmed()
*/
public boolean isConfirmed ()
{
return confirmed;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#isManual()
*/
public boolean isManual ()
{
return manual;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getCenter()
*/
public Point getCenter ()
{
return center;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getLeftEye()
*/
public Point getLeftEye ()
{
return leftEye;
}
public Point getLeftEar ()
{
return leftEar;
}
public Point getRightEar ()
{
return rightEar;
}
public Point getChin ()
{
return chin;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getRightEye()
*/
public Point getRightEye ()
{
return rightEye;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getMouthCenter()
*/
public Point getMouthCenter ()
{
return mouthCenter;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getMouthRight()
*/
public Point getMouthRight ()
{
return mouthRight;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getMouthLeft()
*/
public Point getMouthLeft ()
{
return mouthLeft;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#isFace()
*/
public boolean isFace ()
{
return faceConfidence > 50;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#isWearingGlasses()
*/
public boolean isWearingGlasses ()
{
return glasses;
}
public float getYaw ()
{
return yaw;
}
public float getRoll ()
{
return roll;
}
public float getPitch ()
{
return pitch;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#isSmiling()
*/
public boolean isSmiling ()
{
return smiling;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getGender()
*/
public Gender getGender ()
{
return gender;
}
/*
* (non-Javadoc)
*
* @see com.face.api.client.model.Face#getNose()
*/
public Point getNose ()
{
return nose;
}
public Rect getRectangle ()
{
return faceRect;
}
public void setLabel (final String label)
{
this.label = label;
}
public int getAgeEstimate()
{
return ageEst;
}
public int getAgeMaximum()
{
return ageMax;
}
public int getAgeMinimum()
{
return ageMin;
}
static List fromJsonArray (JSONArray jArr) throws JSONException
{
final List faces = new LinkedList();
for (int i = 0; i < jArr.length(); i++)
{
faces.add(new Face(jArr.getJSONObject(i)));
}
return faces;
}
@Override
public String toString ()
{
StringBuilder builder = new StringBuilder();
builder.append("Face [center=").append(center)
.append(", chin=").append(chin)
.append(", confirmed=").append(confirmed)
.append(", faceConfidence=").append(faceConfidence)
.append(", faceRect=").append(faceRect)
.append(", gender=").append(gender)
.append(", glasses=").append(glasses)
.append(", guesses=").append(guesses)
.append(", height=").append(height)
.append(", label=").append(label)
.append(", leftEar=").append(leftEar)
.append(", leftEye=").append(leftEye)
.append(", manual=").append(manual)
.append(", mouthCenter=").append(mouthCenter)
.append(", mouthLeft=").append(mouthLeft)
.append(", mouthRight=").append(mouthRight)
.append(", nose=").append(nose)
.append(", pitch=").append(pitch)
.append(", rightEar=").append(rightEar)
.append(", rightEye=").append(rightEye)
.append(", roll=").append(roll)
.append(", smiling=").append(smiling)
.append(", threshold=").append(threshold)
.append(", lips=").append(lips)
.append(", mood=").append(mood)
.append(", tid=").append(tid)
.append(", width=").append(width)
.append(", yaw=").append(yaw)
.append("]");
return builder.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy