这是c++的函数定义:
这是一个检测图片中关键目标的函数
int HXDetect(BYTE* pImage,TargetPos* pfps);
这是结构体的定义:
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
struct FaceAngle
{
int yaw;
int pitch;
int roll;
float confidence;
};
struct TargetPos
{
RECT rcFace;
POINT ptLeftEye;
FaceAngle fAngle;
int nQuality;
BYTE pFacialData[512];
TargetPos()
{
memset(&rcFace,0,sizeof(RECT));
memset(&ptLeftEye,0,sizeof(POINT));
memset(&fAngle,0,sizeof(FaceAngle));
nQuality=0;
memset(pFacialData, 0, 512);
}
};
这是调用的代码:
TargetPos ptfp[10];
HXDetect(im.data,ptfp); //im.data是图片的rgb24 buffer,ptfp是用来接收函数检测到目标的信息
==============================================================================
以上c++代码结束:
下面是我封装的c#的结构体和调用函数
检测接口的调用函数:
[DllImport(DLLName, EntryPoint = "HXDetect")]
public static extern int HXDetect(IntPtr pImage,IntPtr pos);
c#转换的结构体:
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential,
CharSet = System.Runtime.InteropServices.CharSet.Ansi,
Pack =1)]
public struct TargetPos
{
public RECT rcFace;
public POINT ptLeftEye;
public FaceAngle fAngle;
int nQuality;
byte[] pFacialData;
public void init()
{
rcFace = new RECT();
ptLeftEye = new POINT();
fAngle = new FaceAngle();
nQuality = 0;
pFacialData = new byte[512];
}
};
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential,
CharSet = System.Runtime.InteropServices.CharSet.Ansi)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential,
CharSet = System.Runtime.InteropServices.CharSet.Ansi)]
public struct POINT
{
public int x;
public int y;
}
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential,
CharSet = System.Runtime.InteropServices.CharSet.Ansi)]
public struct FaceAngle
{
int yaw;
int pitch;
int roll;
float confidence;
};
c#调用检测函数的代码:
void detect(){
int arraySize = 10;
TargetPos[] PosArray = new TargetPos[arraySize];
for (int i = 0; i < PosArray.Length; i++)
{
var facePos = PosArray[i];
facePos.init();
}
IntPtr facePtr = MarshalArray(PosArray);
int faceNum = HXDetect(bmpDataPtr, facePtr);
}
unsafe private static IntPtr MarshalArray(TargetPos[] bodies)
{
int iSizeOfOneBodyPos = Marshal.SizeOf(typeof(TargetPos));
int iTotalSize = iSizeOfOneBodyPos * bodies.Length;
IntPtr pUnmanagedBodies = Marshal.AllocHGlobal(iTotalSize);
byte* pbyUnmanagedBodies = (byte*)(pUnmanagedBodies.ToPointer());
for (int i = 0; i < bodies.Length; i++, pbyUnmanagedBodies += (iSizeOfOneBodyPos))
{
IntPtr pOneBodyPos = new IntPtr(pbyUnmanagedBodies);
Marshal.StructureToPtr(bodies[i], pOneBodyPos, false);
}
return pUnmanagedBodies;
}
c++的函数可以正常运行,c#调用的时候会报以下错误:
“System.AccessViolationException”类型的未经处理的异常在 mscorlib.dll 中发生
其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
怀疑是TargetPos这个结构体的定义和内存空间的申请代码有问题,往有经验的朋友能够帮忙解答,
很惭愧,一点微小的积分奉上不成敬意。