C#调C++的接口,给C++传结构体数组
1、背景
C#软件创建了一个结构体数组用来存储图像的区域信息,分别是矩形框的左上像素的xy坐标和矩形框右下像素的xy坐标。需要传入给调用的C++函数的参数列表中,我们选择使用C#传入一个结构体数组指针的方式,C++的参数列表中也使用数组指针来接收这个变量。
2、实现
首先要保证C#和C++两边定义的结构体要完全一致。这里给出我在C++中的定义:
cpp
struct MaskDataStruct
{
int leftTop_X;
int leftTop_Y;
int rightDown_X;
int rightDown_Y;
};
然后是C++函数接口的定义:
cpp
CPPDLL_API int Detect(..., MaskDataStruct* MaskList, ...)
{
...;
MaskDataStruct MaskData;
for(int ii = 0; ii < 4; ii++)
{
MaskDataStruct accept = *(MaskList + ii);
MaskData.leftTop_X = accept.leftTop_X;
MaskData.leftTop_Y = accept.leftTop_Y;
MaskData.rightDown_X = accept.rightDown_X;
MaskData.rightDown_Y = accept.rightDown_Y;
int delta_h = MaskData.rightDown_Y - MaskData.leftTop_Y;
int delta_w = MaskData.rightDown_X - MaskData.leftTop_X;
cv::Rect no_roi1(MaskData.leftTop_X, MaskData.leftTop_Y, delta_w, delta_h);
frame(no_roi1).setTo(cv::Scalar(0, 0, 0));
}
...;
}
c#中该结构体的定义:
csharp
namespace CommonElement
{
public class MaskDataStruct
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MaskData_Str
{
public int leftTop_X;//左上角X坐标
public int leftTop_Y;//左上角Y坐标
public int rightDown_X;//右下角X坐标
public int rightDown_Y;//右下角Y坐标
}
}
}