C# 圖片人臉識別


此程序基於 虹軟人臉識別進行的開發


前提條件從虹軟官網下載獲取ArcFace引擎應用開發包,及其對應的激活碼(App_id, SDK_key)
將獲取到的開發包導入到您的應用中

App_id與SDK_key是在初始化的時候需要使用基本類型所有基本類型在平台庫中有定義。 定義規則是在ANSIC 中的基本類型前加上字母“M”同時將類型的第一個字母改成大寫。例如“long” 被定義成“MLong”數據結構與枚舉


AFR_FSDK_FACEINPUT
描述: 臉部信息
定義
typedef struct{
MRECT rcFace;
AFR_FSDK_OrientCode lOrient;
} AFR_FSDK_FACEINPUT, *LPAFR_FSDK_FACEINPUT;

 

成員描述
rcFace臉部矩形框信息
lOrient臉部旋轉角度
AFR_FSDK_FACEMODEL
描述: 臉部特征信息
定義
typedef struct{
MByte *pbFeature;
MInt32 lFeatureSize;
} AFR_FSDK_FACEMODEL, *LPAFR_FSDK_FACEMODEL;

 

成員描述
pbFeature提取到的臉部特征
lFeatureSize特征信息長度
AFR_FSDK_VERSION
描述: 引擎版本信息
定義
typedef struct{
MInt32 lCodebase;
MInt32 lMajor;
MInt32 lMinor;
MInt32 lBuild;
MInt32 lFeatureLevel;
MPChar Version;
MPChar BuildDate;
MPChar CopyRight;
} AFR_FSDK_VERSION, *LPAFR_FSDK_VERSION;

 

成員描述
lCodebase代碼庫版本號
lMajor主版本號
lMinor次版本號
lBuild編譯版本號,遞增
lFeatureLevel特征庫版本號
Version字符串形式的版本號
BuildDate編譯時間
CopyRight版權

 

枚舉AFR_FSDK_ORIENTCODE
描述: 基於逆時針的臉部方向枚舉值
定義
enum AFR_FSDK_ORIENTCODE{
AFR_FSDK_FOC_0 = 0x1,
AFR_FSDK_FOC_90 = 0x2,
AFR_FSDK_FOC_270 = 0x3,
AFR_FSDK_FOC_180 = 0x4,
AFR_FSDK_FOC_30 = 0x5,
AFR_FSDK_FOC_60 = 0x6,
AFR_FSDK_FOC_120 = 0x7,
AFR_FSDK_FOC_150 = 0x8,
AFR_FSDK_FOC_210 = 0x9,
AFR_FSDK_FOC_240 = 0xa,
AFR_FSDK_FOC_300 = 0xb,
AFR_FSDK_FOC_330 = 0xc
};

 

成員描述
AFR_FSDK_FOC_00 度
AFR_FSDK_FOC_9090度
AFR_FSDK_FOC_270270度
AFR_FSDK_FOC_180180度
AFR_FSDK_FOC_3030度
AFR_FSDK_FOC_6060度
AFR_FSDK_FOC_120120度
AFR_FSDK_FOC_150150度
AFR_FSDK_FOC_210210度
AFR_FSDK_FOC_240240度
AFR_FSDK_FOC_300300度
AFR_FSDK_FOC_330330度


支持的顏色格式
描述: 顏色格式及其對齊規則


定義
ASVL_PAF_I420 8-bit Y層,之后是8-bit的2x2 采樣的U層和V層
ASVL_PAF_YUYV Y0, U0, Y1, V0
ASVL_PAF_RGB24_B8G8R8 BGR24, B8G8R8

 

API ReferenceAFR_FSDK_InitialEngine
描述: 初始化引擎參數
原型
MRESULT AFR_FSDK_InitialEngine(
MPChar AppId,
MPChar SDKKey,
Mbyte *pMem,
MInt32 lMemSize,
MHandle *phEngine
);

 

參數
AppId[in] 用戶申請SDK時獲取的App Id
SDKKey[in] 用戶申請SDK時獲取的SDK Key
pMem[in] 分配給引擎使用的內存地址
lMemSize[in] 分配給引擎使用的內存大小
phEngine[out] 引擎handle

 

返回值: 成功返回MOK,否則返回失敗code。失敗codes如下所列:
MERR_INVALID_PARAM 參數輸入非法
MERR_NO_MEMORY 內存不足AFR_FSDK_ExtractFRFeature
描述: 獲取臉部特征參數
原型
MRESULT AFR_FSDK_ExtractFRFeature (
MHandle hEngine,
LPASVLOFFSCREEN pInputImage,
LPAFR_FSDK_FACEINPUT pFaceRes,
LPAFR_FSDK_FACEMODEL pFaceModels
);

參數

 

 

hEngine[in] 引擎handle
pInputImage[in] 輸入的圖像數據
pFaceRes[in] 已檢測到的臉部信息
pFaceModels[out] 提取的臉部特征信息
返回值: 成功返回MOK,否則返回失敗code。失敗codes如下所列:
MERR_INVALID_PARAM 參數輸入非法
MERR_NO_MEMORY 內存不足AFR_FSDK_FacePairMatching
描述: 臉部特征比較
原型
MRESULT AFR_FSDK_FacePairMatching(
MHandle hEngine,
AFR_FSDK_FACEMODEL *reffeature,
AFR_FSDK_FACEMODEL *probefeature,
MFloat *pfSimilScore
);

參數
hEngine[in] 引擎handle
reffeature[in] 已有臉部特征信息
probefeature[in] 被比較的臉部特征信息
pfSimilScore[out] 臉部特征相似程度數值
返回值: 成功返回MOK,否則返回失敗code。失敗codes如下所列:
MERR_INVALID_PARAM 參數輸入非法
MERR_NO_MEMORY 內存不足
AFR_FSDK_UninitialEngine
描述: 銷毀引擎,釋放相應資源
原型
MRESULT AFR_FSDK_UninitialEngine(
MHandle hEngine
);

參數
hEngine[in] 引擎handle
返回值: 成功返回MOK,否則返回失敗code。失敗codes如下所列:
MERR_INVALID_PARAM 參數輸入非法
AFR_FSDK_GetVersion
描述: 獲取SDK版本信息參數
原型
const AFR_FSDK_VERSION * AFR_FSDK_GetVersion(
MHandle hEngine
);

 

相關事例代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ArcsoftFace
{


public struct AFD_FSDK_FACERES
{
public int nFace; // number of faces detected


public IntPtr rcFace; // The bounding box of face


public IntPtr lfaceOrient; // the angle of each face
}


}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ArcsoftFace
{
public struct AFR_FSDK_FACEINPUT
{
public MRECT rcFace;	// The bounding box of face


public int lfaceOrient; // The orientation of face
}
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ArcsoftFace
{
public struct AFR_FSDK_FACEMODEL
{
public IntPtr pbFeature;	// The extracted features


public int lFeatureSize;	// The size of pbFeature
}
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ArcsoftFace
{
public struct AFR_FSDK_Version
{
public int lCodebase;
public int lMajor;
public int lMinor;
public int lBuild;
public int lFeatureLevel;
public IntPtr Version;
public IntPtr BuildDate;
public IntPtr CopyRight;
}
}

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


namespace ArcsoftFace
{


public class AmFaceVerify
{
/**
* 初始化人臉檢測引擎
* @return 初始化人臉檢測引擎
*/
[DllImport("libarcsoft_fsdk_face_detection.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int AFD_FSDK_InitialFaceEngine(string appId, string sdkKey, IntPtr pMem, int lMemSize, ref IntPtr pEngine, int iOrientPriority, int nScale, int nMaxFaceNum);


/**
* 獲取人臉檢測 SDK 版本信息
* @return 獲取人臉檢測SDK 版本信息
*/
[DllImport("libarcsoft_fsdk_face_detection.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr AFD_FSDK_GetVersion(IntPtr pEngine);


/**
* 根據輸入的圖像檢測出人臉位置,一般用於靜態圖像檢測
* @return 人臉位置
*/
[DllImport("libarcsoft_fsdk_face_detection.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int AFD_FSDK_StillImageFaceDetection(IntPtr pEngine, IntPtr offline, ref IntPtr faceRes);

 


/**
* 初始化人臉識別引擎
* @return 初始化人臉識別引擎
*/
[DllImport("libarcsoft_fsdk_face_recognition.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int AFR_FSDK_InitialEngine(string appId, string sdkKey, IntPtr pMem, int lMemSize, ref IntPtr pEngine);


/**
* 獲取人臉識別SDK 版本信息
* @return 獲取人臉識別SDK 版本信息
*/
[DllImport("libarcsoft_fsdk_face_recognition.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr AFR_FSDK_GetVersion(IntPtr pEngine);


/**
* 提取人臉特征
* @return 提取人臉特征
*/
[DllImport("libarcsoft_fsdk_face_recognition.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int AFR_FSDK_ExtractFRFeature(IntPtr pEngine, IntPtr offline, IntPtr faceResult, IntPtr localFaceModels);


/**
* 獲取相似度
* @return 獲取相似度
*/
[DllImport("libarcsoft_fsdk_face_recognition.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int AFR_FSDK_FacePairMatching(IntPtr pEngine, IntPtr faceModels1, IntPtr faceModels2, ref float fSimilScore);


#region delete
///**
// * 創建人臉檢測引擎
// * @param [in] model_path 模型文件夾路徑
// * @param [out] engine 創建的人臉檢測引擎
// * @return =0 表示成功,<0 表示錯誤碼。
// */
//[DllImport("AmFaceDet.dll", CallingConvention = CallingConvention.Cdecl)]
//public static extern int AmCreateFaceDetectEngine(string modelPath, ref IntPtr faceDetectEngine);


///**
// * 創建人臉識別引擎
// * @param [in] model_path 模型文件夾路徑
// * @param [out] engine 創建的人臉識別引擎
// * @return =0 表示成功,<0 表示錯誤碼。
// */
//[DllImport("AmFaceRec.dll", CallingConvention = CallingConvention.Cdecl)]
//public static extern int AmCreateFaceRecogniseEngine(string modelPath, ref IntPtr facRecogniseeEngine);


///**
// * 創建人臉比對別引擎
// * @param [in] model_path 模型文件夾路徑
// * @param [out] engine 創建的人臉比對引擎
// * @return =0 表示成功,<0 表示錯誤碼。
// */
//[DllImport("AmFaceCompare.dll", CallingConvention = CallingConvention.Cdecl)]
//public static extern int AmCreateFaceCompareEngine(ref IntPtr facCompareEngine);


///**
// * 設置人臉引擎參數
// * @param [in] engine 人臉引擎
// * @param [in] param 人臉參數
// */
//[DllImport("AmFaceDet.dll", CallingConvention = CallingConvention.Cdecl)]
//public static extern void AmSetParam(IntPtr faceDetectEngine, [MarshalAs(UnmanagedType.LPArray)] [In] TFaceParams[] setFaceParams);


///**
// * 人臉檢測
// * @param [in] engine 人臉引擎
// * @param [in] bgr 圖像數據,BGR格式
// * @param [in] width 圖像寬度
// * @param [in] height 圖像高度
// * @param [in] pitch 圖像數據行字節數
// * @param [in,out] faces 人臉結構體數組,元素個數應等於期望檢測人臉個數
// * @param [in] face_count 期望檢測人臉個數
// * @return >=0 表示實際檢測到的人臉數量,<0 表示錯誤碼。
// */
//[DllImport("AmFaceDet.dll", CallingConvention = CallingConvention.Cdecl)]
//public static extern int AmDetectFaces(IntPtr faceDetectEngine, [MarshalAs(UnmanagedType.LPArray)] [In] byte[] image, int width, int height, int pitch, [MarshalAs(UnmanagedType.LPArray)] [In][Out] TAmFace[] faces, int face_count);


///**
// * 抽取人臉特征
// * @param [in] engine 人臉引擎
// * @param [in] bgr 圖像數據,BGR格式
// * @param [in] width 圖像寬度
// * @param [in] height 圖像高度
// * @param [in] pitch 圖像數據行字節數
// * @param [in] face 人臉結構體
// * @param [out] feature 人臉特征
// * @return =0 表示成功,<0 表示錯誤碼。
// */
//[DllImport("AmFaceRec.dll", CallingConvention = CallingConvention.Cdecl)]
////public static extern int AmExtractFeature(IntPtr faceEngine, [MarshalAs(UnmanagedType.LPArray)] [In] byte[] image, int width, int height, int pitch, [MarshalAs(UnmanagedType.LPArray)] [In] TAmFace[] faces, ref byte[] feature);
//public static extern int AmExtractFeature(IntPtr facRecogniseeEngine, [MarshalAs(UnmanagedType.LPArray)] [In] byte[] image, int width, int height, int pitch, [MarshalAs(UnmanagedType.LPArray)] [In] TAmFace[] faces, [MarshalAs(UnmanagedType.LPArray)] [Out] byte[] feature);


///**
// * 比對兩個人臉特征相似度
// * @param [in] engine 人臉引擎
// * @param [in] feature1 人臉特征1
// * @param [in] feature2 人臉特征2
// * @return 人臉相似度
// */
//[DllImport("AmFaceCompare.dll", CallingConvention = CallingConvention.Cdecl)]
//public static extern float AmCompare(IntPtr facCompareEngine, byte[] feature1, byte[] feature2);
#endregion
}
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


namespace ArcsoftFace
{
public struct ASVLOFFSCREEN
{
public int u32PixelArrayFormat;


public int i32Width;


public int i32Height;


[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public IntPtr[] ppu8Plane;


[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public int[] pi32Pitch;
}
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ArcsoftFace
{
public struct MRECT
{
public int left;
public int top;
public int right;
public int bottom;
}
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;
using System.Diagnostics;
using System.Threading;
using ArcsoftFace;


namespace ArcsoftFace
{


public partial class Form1 : Form
{
byte[] firstFeature;


byte[] secondFeature;


//人臉檢測引擎
IntPtr detectEngine = IntPtr.Zero;


//人臉識別引擎
IntPtr regcognizeEngine = IntPtr.Zero;


//拖拽線程
private Thread threadMultiExec;


//構造函數
public Form1()
{
InitializeComponent();
}


//把圖片轉成byte[]
private byte[] getBGR(Bitmap image, ref int width, ref int height, ref int pitch)
{
//Bitmap image = new Bitmap(imgPath);


const PixelFormat PixelFormat = PixelFormat.Format24bppRgb;


BitmapData data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, PixelFormat);


IntPtr ptr = data.Scan0;


int ptr_len = data.Height * Math.Abs(data.Stride);


byte[] ptr_bgr = new byte[ptr_len];


Marshal.Copy(ptr, ptr_bgr, 0, ptr_len);


width = data.Width;


height = data.Height;


pitch = Math.Abs(data.Stride);


int line = width * 3;


int bgr_len = line * height;


byte[] bgr = new byte[bgr_len];


for (int i = 0; i < height; ++i)
{
Array.Copy(ptr_bgr, i * pitch, bgr, i * line, line);
}


pitch = line;


image.UnlockBits(data);


return bgr;
}


//選擇第一張照片
private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog openFile = new OpenFileDialog();


openFile.Filter = "圖片文件|*.bmp;*.jpg;*.jpeg;*.png|所有文件|*.*;";


openFile.Multiselect = false;


openFile.FileName = "";


if (openFile.ShowDialog() == DialogResult.OK)
{
this.pictureBox1.Image = null;


Image image = Image.FromFile(openFile.FileName);


this.pictureBox1.Image = new Bitmap(image);


image.Dispose();


firstFeature = detectAndExtractFeature(this.pictureBox1.Image, 1);
}
}


//選擇第二張照片
private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog openFile = new OpenFileDialog();


openFile.Filter = "圖片文件|*.bmp;*.jpg;*.jpeg;*.png|所有文件|*.*;";


openFile.Multiselect = false;


openFile.FileName = "";


if (openFile.ShowDialog() == DialogResult.OK)
{
this.pictureBox2.Image = null;


Image image = Image.FromFile(openFile.FileName);


this.pictureBox2.Image = new Bitmap(image);


image.Dispose();


secondFeature = detectAndExtractFeature(this.pictureBox2.Image, 2);
}


}


//提取識別出的人臉
public static Bitmap CutFace(Bitmap srcImage, int StartX, int StartY, int iWidth, int iHeight)
{
if (srcImage == null)
{
return null;
}


int w = srcImage.Width;


int h = srcImage.Height;


if (StartX >= w || StartY >= h)
{
return null;
}
if (StartX + iWidth > w)
{
iWidth = w - StartX;
}
if (StartY + iHeight > h)
{
iHeight = h - StartY;
}
try
{
Bitmap bmpOut = new Bitmap(iWidth, iHeight, PixelFormat.Format24bppRgb);


Graphics g = Graphics.FromImage(bmpOut);


g.DrawImage(srcImage, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(StartX, StartY, iWidth, iHeight), GraphicsUnit.Pixel);


g.Dispose();


return bmpOut;
}
catch
{
return null;
}
}


//獲取相似度
private void button3_Click(object sender, EventArgs e)
{
float similar = 0f;


AFR_FSDK_FACEMODEL localFaceModels = new AFR_FSDK_FACEMODEL();


IntPtr firstFeaturePtr = Marshal.AllocHGlobal(firstFeature.Length);


Marshal.Copy(firstFeature, 0, firstFeaturePtr, firstFeature.Length);


localFaceModels.lFeatureSize = firstFeature.Length;


localFaceModels.pbFeature = firstFeaturePtr;


IntPtr secondFeaturePtr = Marshal.AllocHGlobal(secondFeature.Length);


Marshal.Copy(secondFeature, 0, secondFeaturePtr, secondFeature.Length);


AFR_FSDK_FACEMODEL localFaceModels2 = new AFR_FSDK_FACEMODEL();


localFaceModels2.lFeatureSize = secondFeature.Length;


localFaceModels2.pbFeature = secondFeaturePtr;


IntPtr firstPtr = Marshal.AllocHGlobal(Marshal.SizeOf(localFaceModels));


Marshal.StructureToPtr(localFaceModels, firstPtr, false);


IntPtr secondPtr = Marshal.AllocHGlobal(Marshal.SizeOf(localFaceModels2));


Marshal.StructureToPtr(localFaceModels2, secondPtr, false);


Stopwatch stopwatch = new Stopwatch();


stopwatch.Start();


int result = AmFaceVerify.AFR_FSDK_FacePairMatching(regcognizeEngine, firstPtr, secondPtr, ref similar);


stopwatch.Stop();


setControlText(this.label1, "相似度:" + similar.ToString() + " 耗時:" + stopwatch.ElapsedMilliseconds.ToString() + "ms");


//this.label1.Text = "相似度:" + similar.ToString() + " 耗時:" + stopwatch.ElapsedMilliseconds.ToString() + "ms";


localFaceModels = new AFR_FSDK_FACEMODEL();


Marshal.FreeHGlobal(firstFeaturePtr);


Marshal.FreeHGlobal(secondFeaturePtr);


Marshal.FreeHGlobal(firstPtr);


Marshal.FreeHGlobal(secondPtr);


localFaceModels2 = new AFR_FSDK_FACEMODEL();
}


//檢測人臉、提取特征
private byte[] detectAndExtractFeature(Image imageParam, int firstSecondFlg)
{
byte[] feature = null;


try
{
Console.WriteLine();


Console.WriteLine("############### Face Detect Start #########################");


int width = 0;


int height = 0;


int pitch = 0;


Bitmap bitmap = new Bitmap(imageParam);


byte[] imageData = getBGR(bitmap, ref width, ref height, ref pitch);


//GCHandle hObject = GCHandle.Alloc(imageData, GCHandleType.Pinned);


//IntPtr imageDataPtr = hObject.AddrOfPinnedObject();


IntPtr imageDataPtr = Marshal.AllocHGlobal(imageData.Length);


Marshal.Copy(imageData, 0, imageDataPtr, imageData.Length);


ASVLOFFSCREEN offInput = new ASVLOFFSCREEN();


offInput.u32PixelArrayFormat = 513;


offInput.ppu8Plane = new IntPtr[4];


offInput.ppu8Plane[0] = imageDataPtr;


offInput.i32Width = width;


offInput.i32Height = height;


offInput.pi32Pitch = new int[4];


offInput.pi32Pitch[0] = pitch;


AFD_FSDK_FACERES faceRes = new AFD_FSDK_FACERES();


IntPtr offInputPtr = Marshal.AllocHGlobal(Marshal.SizeOf(offInput));


Marshal.StructureToPtr(offInput, offInputPtr, false);


IntPtr faceResPtr = Marshal.AllocHGlobal(Marshal.SizeOf(faceRes));


//Marshal.StructureToPtr(faceRes, faceResPtr, false);


Console.WriteLine("StartTime:{0}", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"));


Stopwatch watchTime = new Stopwatch();


watchTime.Start();
//人臉檢測
int detectResult = AmFaceVerify.AFD_FSDK_StillImageFaceDetection(detectEngine, offInputPtr, ref faceResPtr);


watchTime.Stop();


if (firstSecondFlg == 1)
{
setControlText(this.label5, String.Format("檢測耗時:{0}ms", watchTime.ElapsedMilliseconds));


//this.label5.Text = String.Format("檢測耗時:{0}ms", watchTime.ElapsedMilliseconds);
}
else if (firstSecondFlg == 2)
{
setControlText(this.label2, String.Format("檢測耗時:{0}ms", watchTime.ElapsedMilliseconds));


//this.label2.Text = String.Format("檢測耗時:{0}ms", watchTime.ElapsedMilliseconds);
}


object obj = Marshal.PtrToStructure(faceResPtr, typeof(AFD_FSDK_FACERES));


faceRes = (AFD_FSDK_FACERES)obj;


Console.WriteLine(" Face Count:{0}", faceRes.nFace);


for (int i = 0; i < faceRes.nFace; i++)
{
MRECT rect = (MRECT)Marshal.PtrToStructure(faceRes.rcFace + Marshal.SizeOf(typeof(MRECT)) * i, typeof(MRECT));


int orient = (int)Marshal.PtrToStructure(faceRes.lfaceOrient + Marshal.SizeOf(typeof(int)) * i, typeof(int));


if (i == 0)
{
Image image = CutFace(bitmap, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);


if (firstSecondFlg == 1)
{
this.pictureBox3.Image = image;
}
else if (firstSecondFlg == 2)
{
this.pictureBox4.Image = image;
}
}


Console.WriteLine(" left:{0} top:{1} right:{2} bottom:{3} orient:{4}", rect.left, rect.top, rect.right, rect.bottom, orient);
}


Console.WriteLine(" EndTime:{0}", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"));


Console.WriteLine("############### Face Detect End #########################");


if (faceRes.nFace > 0)
{
Console.WriteLine();


Console.WriteLine("############### Face Recognition Start #########################");


AFR_FSDK_FACEINPUT faceResult = new AFR_FSDK_FACEINPUT();


int orient = (int)Marshal.PtrToStructure(faceRes.lfaceOrient, typeof(int));


faceResult.lfaceOrient = orient;


faceResult.rcFace = new MRECT();


MRECT rect = (MRECT)Marshal.PtrToStructure(faceRes.rcFace, typeof(MRECT));


faceResult.rcFace = rect;


IntPtr faceResultPtr = Marshal.AllocHGlobal(Marshal.SizeOf(faceResult));


Marshal.StructureToPtr(faceResult, faceResultPtr, false);


AFR_FSDK_FACEMODEL localFaceModels = new AFR_FSDK_FACEMODEL();


IntPtr localFaceModelsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(localFaceModels));


//Marshal.StructureToPtr(localFaceModels, localFaceModelsPtr, false);


watchTime.Start();


int extractResult = AmFaceVerify.AFR_FSDK_ExtractFRFeature(regcognizeEngine, offInputPtr, faceResultPtr, localFaceModelsPtr);


Marshal.FreeHGlobal(faceResultPtr);


Marshal.FreeHGlobal(offInputPtr);


watchTime.Stop();


if (firstSecondFlg == 1)
{
setControlText(this.label3, String.Format("抽取特征耗時:{0}ms", watchTime.ElapsedMilliseconds));


//this.label3.Text = String.Format("抽取特征耗時:{0}ms", watchTime.ElapsedMilliseconds);
}
else if (firstSecondFlg == 2)
{
setControlText(this.label4, String.Format("抽取特征耗時:{0}ms", watchTime.ElapsedMilliseconds));


//this.label4.Text = String.Format("抽取特征耗時:{0}ms", watchTime.ElapsedMilliseconds);
}


object objFeature = Marshal.PtrToStructure(localFaceModelsPtr, typeof(AFR_FSDK_FACEMODEL));


Marshal.FreeHGlobal(localFaceModelsPtr);


localFaceModels = (AFR_FSDK_FACEMODEL)objFeature;


feature = new byte[localFaceModels.lFeatureSize];


Marshal.Copy(localFaceModels.pbFeature, feature, 0, localFaceModels.lFeatureSize);


//localFaceModels = new AFR_FSDK_FACEMODEL();


Console.WriteLine("############### Face Recognition End #########################");


}


bitmap.Dispose();


imageData = null;


Marshal.FreeHGlobal(imageDataPtr);


offInput = new ASVLOFFSCREEN();


faceRes = new AFD_FSDK_FACERES();


//Marshal.FreeHGlobal(faceResPtr);
}
catch (Exception e)
{
LogHelper.WriteErrorLog("detect", e.Message + "\n" + e.StackTrace);
}
return feature;
}


//初始化
private void Form1_Load(object sender, EventArgs e)
{
#region 初始化人臉檢測引擎


int detectSize = 40 * 1024 * 1024;


IntPtr pMem = Marshal.AllocHGlobal(detectSize);


//1-1
//string appId = "4tnYSJ68e8wztSo4Cf7WvbyMZduHwpqtThAEM3obMWbE";


//1-1
//string sdkKey = "Cgbaq34izc8PA2Px26x8qqWTQn2P5vxijaWKdUrdCwYT";


//1-n
string appId = "8b4R2gvcoFQXKbC4wGtnYcqsa9Bd3FLiN3VWDFtJqcnB";


//1-n
string sdkKey = "A5Km3QjZKGuakWRmC2pSWTuNzbNbaSCnj5fFtjBBcdxm";


//人臉檢測引擎初始化


// IntPtr aaa= AFD_FSDKLibrary.AFD_FSDK_InitialFaceEngine(appId, sdkKey, pMem, detectSize, ref detectEngine, 5, 50, 1);
int retCode = AmFaceVerify.AFD_FSDK_InitialFaceEngine(appId, sdkKey, pMem, detectSize, ref detectEngine, 5, 50, 1);
//獲取人臉檢測引擎版本
IntPtr versionPtr = AmFaceVerify.AFD_FSDK_GetVersion(detectEngine);


AFR_FSDK_Version version = (AFR_FSDK_Version)Marshal.PtrToStructure(versionPtr, typeof(AFR_FSDK_Version));


Console.WriteLine("lCodebase:{0} lMajor:{1} lMinor:{2} lBuild:{3} Version:{4} BuildDate:{5} CopyRight:{6}", version.lCodebase, version.lMajor, version.lMinor, version.lBuild, Marshal.PtrToStringAnsi(version.Version), Marshal.PtrToStringAnsi(version.BuildDate), Marshal.PtrToStringAnsi(version.CopyRight));


//Marshal.FreeHGlobal(versionPtr);


#endregion


#region 初始化人臉識別引擎


int recognizeSize = 40 * 1024 * 1024;


IntPtr pMemDetect = Marshal.AllocHGlobal(recognizeSize);


//1-1
//string appIdDetect = "4tnYSJ68e8wztSo4Cf7WvbyMZduHwpqtThAEM3obMWbE";


//1-1
//string sdkKeyDetect = "Cgbaq34izc8PA2Px26x8qqWaaBHbPD7wWMcTU6xe8VRo";


//1-n
string appIdDetect = "8b4R2gvcoFQXKbC4wGtnYcqsa9Bd3FLiN3VWDFtJqcnB";


//1-n
string sdkKeyDetect = "A5Km3QjZKGuakWRmC2pSWTuW9zdndn5EkVDo4LceRxLU";


//人臉識別引擎初始化
retCode = AmFaceVerify.AFR_FSDK_InitialEngine(appIdDetect, sdkKeyDetect, pMemDetect, recognizeSize, ref regcognizeEngine);


//獲取人臉識別引擎版本
IntPtr versionPtrDetect = AmFaceVerify.AFR_FSDK_GetVersion(regcognizeEngine);


AFR_FSDK_Version versionDetect = (AFR_FSDK_Version)Marshal.PtrToStructure(versionPtrDetect, typeof(AFR_FSDK_Version));


Console.WriteLine("lCodebase:{0} lMajor:{1} lMinor:{2} lBuild:{3} lFeatureLevel:{4} Version:{5} BuildDate:{6} CopyRight:{7}", versionDetect.lCodebase, versionDetect.lMajor, versionDetect.lMinor, versionDetect.lBuild, versionDetect.lFeatureLevel, Marshal.PtrToStringAnsi(versionDetect.Version), Marshal.PtrToStringAnsi(versionDetect.BuildDate), Marshal.PtrToStringAnsi(versionDetect.CopyRight));


#endregion
}


//拖拽事件
private void Form1_DragDrop(object sender, DragEventArgs e)
{
// Extract the data from the DataObject-Container into a string list
string[] fileList = (string[])e.Data.GetData(DataFormats.FileDrop, false);


if (fileList.Length >= 2)
{
this.threadMultiExec = new Thread(new ParameterizedThreadStart(multiCompare));


this.threadMultiExec.Start(new object[] { fileList });


this.threadMultiExec.IsBackground = true;
}


}


private void Form1_DragEnter(object sender, DragEventArgs e)
{
// Check if the Dataformat of the data can be accepted
// (we only accept file drops from Explorer, etc.)
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy; // Okay
}
else
{
e.Effect = DragDropEffects.None; // Unknown data, ignore it
}
}


//多線程設置PictureBox的圖像
private void setPictureBoxControlImage(PictureBox control, Bitmap value)
{
control.Invoke(new Action<PictureBox, Bitmap>((ct, v) => { ct.Image = v; }), new object[] { control, value });
}


//多線程設置控件的文本
private void setControlText(Control control, string value)
{
control.Invoke(new Action<Control, string>((ct, v) => { ct.Text = v; }), new object[] { control, value });
}


//比對多個圖片
private void multiCompare(object args)
{
object[] objs = args as object[];


string[] fileList = (string[])objs[0];


for (int i = 0; i < fileList.Length; i++)
{


Image image = Image.FromFile(fileList[i]);


//this.pictureBox1.Image = null;


//this.pictureBox1.Image = new Bitmap(image);


setPictureBoxControlImage(this.pictureBox1, new Bitmap(image));


firstFeature = detectAndExtractFeature(image, 1);


image.Dispose();


if (firstFeature == null)
{


continue;
}


if (i + 1 >= fileList.Length)
{


continue;
}


Image image2 = Image.FromFile(fileList[++i]);


//this.pictureBox2.Image = null;


// this.pictureBox2.Image = new Bitmap(image2);


setPictureBoxControlImage(this.pictureBox2, new Bitmap(image2));


secondFeature = detectAndExtractFeature(image2, 2);


image2.Dispose();


if (secondFeature == null)
{


continue;
}


button3_Click(null, null);


setControlText(this.label6, "正在處理:" + (i + 1).ToString());


//label6.Text = "正在處理:" + (i + 1).ToString();


//this.Update();


Thread.Sleep(10);


}


}

}
}

```


 

  

USB視頻 動態畫框 源碼下載地址
https://download.csdn.net/download/zhang1244/10368237
運行效果地址
https://download.csdn.net/download/zhang1244/10368222
普通人臉照片進行關鍵點提取以及相關對比相似度

https://download.csdn.net/download/zhang1244/10368197

運行效果地址

https://download.csdn.net/download/zhang1244/10368181


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM