内容
C#接收C++传递的结构体数组指针
c++
void AIDetectInter(void* h, uchar* data, int width, int height, int stride, int &outputResultLen, OutputSeg*& outputResult)
//void AIDetectInter(void* h, Mat img, vector<OutputSeg>& outputtotal, int& outputResultLen)
{
cv::Mat img = cv::Mat(cv::Size(width, height), CV_8UC3, data, stride);
int single = 640;
//int width = img.size().width;
//int height = img.size().height;
bool divideflagw = width % single;
int widthnum = divideflagw ? (width / single) + 1 : (width / single);
bool divideflagh = height % single;
int heightnum = divideflagh ? (height / single) + 1 : (height / single);
//int splitstride = single - 10;
vector<vector<OutputSeg>> outputtotaltmp;
vector<vector<int>> outputtotalmasktmp;
for (size_t i = 0; i < heightnum; i++) {
int singleheighttmp = (i == heightnum - 1) && divideflagh ? (height - i * single) : single;
for (size_t j = 0; j < widthnum; j++) {
int singlewidthtmp = (j == widthnum - 1) && divideflagw ? (width - j * single) : single;
Rect rect(j* single, i* single, singlewidthtmp, singleheighttmp);
Mat singleimg = img(rect);
Point point(j * single, i * single);
vector<OutputSeg> outputtmp;
AIDetect(h, singleimg, outputtmp, point);
outputtotaltmp.push_back(outputtmp);
}
}
vector<OutputSeg> outputtotal;
for (size_t i = 0; i < outputtotaltmp.size(); i++) {
outputtotal.insert(outputtotal.end(), outputtotaltmp[i].begin(), outputtotaltmp[i].end());
}
outputResultLen = outputtotal.size();
outputResult = new OutputSeg[outputResultLen];
memcpy(outputResult, &outputtotal[0], outputResultLen * sizeof(OutputSeg));
}
c#
string qwq = "D:\\c++\\tensorrt\\tensorrt\\model\\varta640_seg.engine";
string qwq1 = "seg";
IntPtr a = AIInit(qwq, qwq1);
string qwq2 = "D:\\c++\\tensorrt\\tensorrt\\test_x\\1-1.bmp";
Bitmap img = new Bitmap(qwq2);
BitmapData imgData = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);
int outLen = 0;
IntPtr outputdata = IntPtr.Zero;
int outmaskLen = 0;
IntPtr ptr;
AIDetectInter(a, imgData.Scan0, imgData.Width, imgData.Height, imgData.Stride, out outLen ,out ptr);
OutputSeg[] ads = new OutputSeg[outLen];
for (int i = 0; i < outLen; ++i)
{
ads[i] = (OutputSeg)Marshal.PtrToStructure(ptr + i * Marshal.SizeOf(typeof(OutputSeg)), typeof(OutputSeg));
}
foreach (var seg in ads)
{
Console.WriteLine($"id: {seg.id}, confidence: {seg.confidence}, box: [{string.Join(", ", seg.box)}]");
Console.WriteLine("inner segments:");
// 根据innerLen字段确定内部结构体数组的长度
byte[] innerSegs = new byte[seg.bytesize];
for (int j = 0; j < seg.bytesize; j++)
{
innerSegs[j] = (byte)Marshal.PtrToStructure(seg.boxMask + j * Marshal.SizeOf(typeof(byte)), typeof(byte));
}
// 打印内部结构体数组
foreach (var inner in innerSegs)
{
Console.WriteLine($"x: {inner}");
}
}