内容
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}");
                }
            }









