ARCSoft人臉識別只有C++和JAVA版本,只賴本人不會C++,想用C#呼叫C++的DLL,所以需要進行資料結構轉換,轉到人臉檢測的時候,總是報錯(其他資訊: 嘗試讀取或寫入受保護的記憶體。這通常指示其他記憶體已損壞。),不知道怎么回事,據我判斷,應該是MultiFaceInfo資料結構轉換定義有問題,望高手解答, 萬分感謝!!!
下方為C++介面說明:
--------------------------------------------------------------------------------------------------------
MRESULT ASFDetectFaces(
MHandle hEngine,
MInt32 width,
MInt32 height,
MInt32 format,
MUInt8* imgData,
LPASF_MultiFaceInfo detectedFaces
);
功能描述 功能描述
人臉檢測
引數
hEngine [in] 引擎句柄
width [in] 圖片寬度,為4的倍數
height [in] 圖片高度,YUYV/I420/NV21/NV12格式為2的倍數;BGR24/GRAY/DEPTH_U16格式無限制
format [in] 顏色空間格式
imgData [in] 圖片資料
detectedFaces [out] 檢測到的人臉資訊
--------------------------------------------------------------------------------------------------------
結構體描述:
多人臉資訊
定義:
typedef struct {
MRECT* faceRect; // 人臉框陣列
MInt32* faceOrient; // 人臉角度陣列
MInt32 faceNum; // 檢測到的人臉個數
MInt32* faceID; // 在 VIDEOVIDEO 模式下有效,IMAGE模式下為空
}ASF_MultiFaceInfo, *LPASF_MultiFaceInfo;
==============================================================
下方為示例代碼中的定義:
typedef struct __tag_rect
{
MInt32 left;
MInt32 top;
MInt32 right;
MInt32 bottom;
} MRECT, *PMRECT;
--------------------------------------------------------------------------------------------------------
//多人臉資訊
typedef struct {
MRECT* faceRect; // 人臉框資訊
MInt32* faceOrient; // 輸入影像的角度,可以參考 ArcFaceCompare_OrientCode .
MInt32 faceNum; // 檢測到的人臉個數
MInt32* faceID; // face ID,IMAGE模式下不回傳FaceID
}ASF_MultiFaceInfo, *LPASF_MultiFaceInfo;
--------------------------------------------------------------------------------------------------------
ASF_MultiFaceInfo detectedFaces1 = { 0 };
IplImage* cutImg1 = cvCreateImage(cvSize(img1->width - img1->width % 4, img1->height), IPL_DEPTH_8U, img1->nChannels);
CutIplImage(img1, cutImg1, 0, 0);
res = ASFDetectFaces(handle, cutImg1->width, cutImg1->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)cutImg1->imageData, &detectedFaces1);
==============================================================
下方為C#代碼,據我判斷,應該是MultiFaceInfo資料結構轉換有問題。
/// <summary>
/// 多人臉資訊
/// </summary>
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct ASF_MultiFaceInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10, ArraySubType = System.Runtime.InteropServices.UnmanagedType.Struct)]
public MRECT[] faceRect; // 人臉框陣列
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10, ArraySubType = System.Runtime.InteropServices.UnmanagedType.I4)]
public int[] faceOrient; // 人臉角度陣列
public int faceNum; // 檢測到的人臉個數
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10, ArraySubType = System.Runtime.InteropServices.UnmanagedType.I4)]
public int[] faceID;// 在 VIDEOVIDEO 模式下有效,IMAGEIMAGE 模式下為空
}
--------------------------------------------------------------------------------------------------------
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct MRECT
{
public int left;
public int top;
public int right;
public int bottom;
}
--------------------------------------------------------------------------------------------------------
[System.Runtime.InteropServices.DllImportAttribute("libarcsoft_face_engine.dll", EntryPoint = "ASFDetectFaces", CallingConvention = CallingConvention.Cdecl)]
public static extern int ASFDetectFaces(IntPtr hEngine, int width, int height, int format, IntPtr imgData, ref ASF_MultiFaceInfo detectedFaces);
--------------------------------------------------------------------------------------------------------
ASF_MultiFaceInfo detectedFaces = new ASF_MultiFaceInfo();
resultCode = ASF_Functions.ASFDetectFaces(hEngine, width, height, ASVL_PAF_RGB24_B8G8R8, imgData, ref detectedFaces);
--------------------------------------------------------------------------------------------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/132258.html
標籤:C#
上一篇:請教大俠們VS2005(VB.NET)+ActiveReports3報表的自定義紙張問題
下一篇:企業付款到零錢
