private
readonly
IFaceServiceClient faceServiceClient =
new
FaceServiceClient(
"<PLACE_YOUR_SERVICE_KEY_HERE>"
);
async Task<Face[]> UploadAndDetectFaces(
string
imageFilePath)
{
try
using
(Stream imageFileStream = File.OpenRead(imageFilePath))
var faces = await faceServiceClient.DetectAsync(imageFileStream,
true
,
FaceAttributeType[] {
FaceAttributeType.Gender,
FaceAttributeType.Age,
FaceAttributeType.Emotion
});
return
faces.ToArray();
}
catch
(Exception ex)
MessageBox.Show(ex.Message);
Face[0];
async
void
btnProcess_Click(
object
sender, EventArgs e)
Face[] faces = await UploadAndDetectFaces(_imagePath);
if
(faces.Length > 0)
var faceBitmap =
Bitmap(imgBox.Image);
(var g = Graphics.FromImage(faceBitmap))
// Alpha-black rectangle on entire image
g.FillRectangle(
SolidBrush(Color.FromArgb(200, 0, 0, 0)), g.ClipBounds);
var br =
SolidBrush(Color.FromArgb(200, Color.LightGreen));
// Loop each face recognized
foreach
(var face
in
faces)
var fr = face.FaceRectangle;
var fa = face.FaceAttributes;
// Get original face image (color) to overlap the grayed image
var faceRect =
Rectangle(fr.Left, fr.Top, fr.Width, fr.Height);
g.DrawImage(imgBox.Image, faceRect, faceRect, GraphicsUnit.Pixel);
g.DrawRectangle(Pens.LightGreen, faceRect);
// Loop face.FaceLandmarks properties for drawing landmark spots
var pts =
List<Point>();
Type type = face.FaceLandmarks.GetType();
(PropertyInfo property
type.GetProperties())
g.DrawRectangle(Pens.LightGreen, GetRectangle((FeatureCoordinate)property.GetValue(face.FaceLandmarks,
null
)));
// Calculate where to position the detail rectangle
int
rectTop = fr.Top + fr.Height + 10;
(rectTop + 45 > faceBitmap.Height) rectTop = fr.Top - 30;
// Draw detail rectangle and write face informations
g.FillRectangle(br, fr.Left - 10, rectTop, fr.Width < 120 ? 120 : fr.Width + 20, 25);
g.DrawString(
.Format(
"{0:0.0} / {1} / {2}"
, fa.Age, fa.Gender, fa.Emotion.ToRankedList().OrderByDescending(x => x.Value).First().Key),
this
.Font, Brushes.Black,
fr.Left - 8,
rectTop + 4);
imgBox.Image = faceBitmap;
fa.Emotion.ToRankedList().OrderByDescending(x => x.Value).First().Key
await faceServiceClient.CreatePersonGroupAsync(_groupId, _groupName);
CreatePersonResult person = await faceServiceClient.CreatePersonAsync(_groupId,
"Person 1"
(
imagePath
Directory.GetFiles(
"<PATH_TO_PHOTOS_OF_PERSON_1>"
))
(Stream s = File.OpenRead(imagePath))
await faceServiceClient.AddPersonFaceAsync(_groupId, person.PersonId, s);
await faceServiceClient.TrainPersonGroupAsync(_groupId);
TrainingStatus trainingStatus =
;
while
)
trainingStatus = await faceServiceClient.GetPersonGroupTrainingStatusAsync(_groupId);
(trainingStatus.Status != Status.Running)
break
await Task.Delay(1000);
MessageBox.Show(
"Training successfully completed"
var faceIds = faces.Select(face => face.FaceId).ToArray();
(var identifyResult
await faceServiceClient.IdentifyAsync(_groupId, faceIds))
(identifyResult.Candidates.Length != 0)
var candidateId = identifyResult.Candidates[0].PersonId;
var person = await faceServiceClient.GetPersonAsync(_groupId, candidateId);
// user identificated: person.name is the associated name
else
// user not recognized
btnBrowse_Click(
(var od =
OpenFileDialog())
od.Filter =
"All files(*.*)|*.*"
(od.ShowDialog() == DialogResult.OK)
_imagePath = od.FileName;
imgBox.Load(_imagePath);
btnAddUser_Click(
(txtNewUser.Text ==
""
listUsers.Items.Add(txtNewUser.Text);
btnCreateGroup_Click(
_groupId = txtGroupName.Text.ToLower().Replace(
" "
await faceServiceClient.DeletePersonGroupAsync(_groupId);
{ }
await faceServiceClient.CreatePersonGroupAsync(_groupId, txtGroupName.Text);
(var u
listUsers.Items)
CreatePersonResult person = await faceServiceClient.CreatePersonAsync(_groupId, u.ToString());
Directory.GetFiles(txtImageFolder.Text +
"\\"
+ u.ToString()))
"Group successfully created"
MessageBox.Show(ex.ToString());
btnTrain_Click(
btnIdentify_Click(
idList.Items.Clear();
// Writes name above face rectangle
var x = faces.FirstOrDefault(y => y.FaceId == identifyResult.FaceId);
(x !=
g.DrawString(person.Name,
.Font, Brushes.White, x.FaceRectangle.Left, x.FaceRectangle.Top + x.FaceRectangle.Height + 15);
idList.Items.Add(person.Name);
idList.Items.Add(
"< Unknown person >"
"Identification successfully completed"