0
点赞
收藏
分享

微信扫一扫

C#接收C++的结构体数组指针

内容

C#接收C++传递的结构体数组指针

c++

C#接收C++的结构体数组指针_结构体数组传递

C#接收C++的结构体数组指针_结构体数组传递_02

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#

C#接收C++的结构体数组指针_结构体数组传递_03

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

举报

相关推荐

0 条评论