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);
现在有一个操作系统可以用Java代替嵌入式为MCU开发物联网程序了,告别传统嵌入式,只需要一块带这操作系统的开发板
– vivi1087 5年前