Reason for this document:
When calling the ScanFaceEx function, some user wants to save or view the WARPED image directly (to verify that FACE has been saved after ScanFace)
How to use & sample code :
The image is stored in that path in {0}-{1}.jpg format.
if (Util.IsYes())
{
Console.WriteLine("How many faceEx would you like to register?");
Console.Write(">> ");
int numOfFace = Util.GetInput(1);
if (0 < numOfFace)
{
int structSize = Marshal.SizeOf(typeof(BS2FaceExWarped));
BS2FaceExWarped[] faceEx = Util.AllocateStructureArray<BS2FaceExWarped>(1);
userBlob[0].faceExObjs = Marshal.AllocHGlobal(structSize * numOfFace);
IntPtr curFaceExObjs = userBlob[0].faceExObjs;
cbFaceOnReadyToScan = new API.OnReadyToScan(ReadyToScanForFace);
for (int index = 0; index < numOfFace;)
{
sdkResult = (BS2ErrorCode)API.BS2_ScanFaceEx(sdkContext, deviceID, faceEx, (byte)BS2FaceEnrollThreshold.THRESHOLD_DEFAULT, cbFaceOnReadyToScan);
if (BS2ErrorCode.BS_SDK_SUCCESS != sdkResult)
Console.WriteLine("BS2_ScanFaceEx call failed: %d", sdkResult);
else
{
Console.WriteLine("Do you want to save warpped image? [y/n]");
Console.Write(">> ");
if (Util.IsYes())
{
int written = 0;
int size = (int)faceEx[0].imageLen;
IntPtr imgPtr = Marshal.AllocHGlobal(size);
Marshal.Copy(faceEx[index].imageData, 0, imgPtr, size);
FileStream file = new FileStream(String.Format("{0}-{1}.jpg", userID, index), FileMode.Create, FileAccess.Write);
WriteFile(file.Handle, imgPtr, (int)faceEx[index].imageLen, out written, IntPtr.Zero);
file.Close();
}
userBlob[0].user.numFaces++;
index++;
faceEx[0].faceIndex = (byte)index;
Marshal.StructureToPtr(faceEx[0], curFaceExObjs, false);
curFaceExObjs += structSize;
Thread.Sleep(100);
}
}
cbFaceOnReadyToScan = null;
}
}Result:
Please download the attached file and refer to this sample code.