ITPub博客

首页 > 应用开发 > > C#调用第三方DLL(C++)的数据结构转换出错

C#调用第三方DLL(C++)的数据结构转换出错

作者:choubou 时间:2019-08-09 14:44:00 0 删除 编辑

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数据结构转换有问题。

///

/// 多人脸信息

///

[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)]publicstructMRECT{publicintleft;publicinttop;publicintright;publicintbottom;}

[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);

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4548/viewspace-3150083/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-10-08

  • 博文量
    175
  • 访问量
    10711