首页 新闻 会员 周边

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

0
悬赏园豆:100 [待解决问题]

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

Michael_Ying的主页 Michael_Ying | 初学一级 | 园豆:102
提问于:2019-07-22 23:51

现在有一个操作系统可以用Java代替嵌入式为MCU开发物联网程序了,告别传统嵌入式,只需要一块带这操作系统的开发板

vivi1087 4年前
< >
分享
所有回答(1)
0

我也遇到过这个问题。

你可以参考我的博客下面的 C# 和 C++变量对应关系表。

https://www.cnblogs.com/dacc123/p/9133749.html

Shendu.CC | 园豆:2138 (老鸟四级) | 2019-07-23 18:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册