[C#]将opencvsharp的Mat对象转成onnxruntime的inputtensor的3种方法

第一种方法:在创建tensor时候直接赋值改变每个tensor的值,以下是伪代码:

复制代码
            var image = new Mat(image_path);
            inpWidth = image.Width;
            inpHeight = image.Height;
            //将图片转为RGB通道
            Mat image_rgb = new Mat();
            Cv2.CvtColor(image, image_rgb, ColorConversionCodes.BGR2RGB);
            //输入Tensor
            input_tensor = new DenseTensor<float>(new[] { 1, 3, inpHeight, inpWidth });
            for (int y = 0; y < image_rgb.Height; y++)
            {
                for (int x = 0; x < image_rgb.Width; x++)
                {
                    input_tensor[0, 0, y, x] = image_rgb.At<Vec3b>(y, x)[0] / 255f;
                    input_tensor[0, 1, y, x] = image_rgb.At<Vec3b>(y, x)[1] / 255f;
                    input_tensor[0, 2, y, x] = image_rgb.At<Vec3b>(y, x)[2] / 255f;
                }
            }

            //将 input_tensor 放入一个输入参数的容器,并指定名称
            input_container.Add(NamedOnnxValue.CreateFromTensor("input", input_tensor));

            //运行 Inference 并获取结果
            result_infer = onnx_session.Run(input_container);

第2种通过不安全指针进行赋值以下是伪代码:

复制代码
            var image = new Mat(image_path);

            Mat dstimg = new Mat();

            Cv2.Resize(image, dstimg, new OpenCvSharp.Size(inpWidth, inpHeight));

            dstimg.ConvertTo(dstimg, MatType.CV_32FC3, 1 / 127.5, -1.0);

            float* pdata = (float*)dstimg.Data;
            float[] input_tensor_data = new float[1 * 3 * inpWidth * inpHeight];
            for (int i = 0; i < 1 * 3 * inpWidth * inpHeight; i++)
            {
                input_tensor_data[i] = pdata[i];
            }

            //输入Tensor
            input_tensor = new DenseTensor<float>(input_tensor_data, new[] { 1, inpHeight, inpWidth, 3 });

            //将 input_tensor 放入一个输入参数的容器,并指定名称
            input_container.Add(NamedOnnxValue.CreateFromTensor("input_1", input_tensor));
            //运行 Inference 并获取结果
            result_infer = onnx_session.Run(input_container);

第3种通过不安全指针进行赋值,本质和第2种方法一样,但是这个是通过图像指针直接赋值以下是伪代码:

示范代码1:

复制代码
            var image = new Mat(image_path);
 
            Mat resize_image = new Mat();
            Cv2.Resize(image, resize_image, new OpenCvSharp.Size(512, 512));
 
            float h_ratio = (float)image.Rows / 512;
            float w_ratio = (float)image.Cols / 512;
 
            int row = resize_image.Rows;
            int col = resize_image.Cols;
            float[] input_tensor_data = new float[1 * 4 * row * col];
            int k = 0;
            for (int i = 0; i < row; i++)
            {
                for (int j = 0; j < col; j++)
                {
                    for (int c = 0; c < 3; c++)
                    {
                        float pix = ((byte*)(resize_image.Ptr(i).ToPointer()))[j * 3 + c];
                        input_tensor_data[k] = pix;
                        k++;
                    }
                    input_tensor_data[k] = 1;
                    k++;
                }
            }
 
            input_tensor = new DenseTensor<float>(input_tensor_data, new[] { 1, 512, 512, 4 });
 
            //将 input_tensor 放入一个输入参数的容器,并指定名称
            input_container.Add(NamedOnnxValue.CreateFromTensor("input_image_with_alpha:0", input_tensor));
 
            //运行 Inference 并获取结果
            result_infer = onnx_session.Run(input_container);

示范代码2:

复制代码
            var image = new Mat(image_path);
 
            int img_height = image.Rows;
            int img_width = image.Cols;
 
            Mat resize_image = new Mat();
            Cv2.Resize(image, resize_image, new OpenCvSharp.Size(inpWidth, inpHeight));
 
            int row = resize_image.Rows;
            int col = resize_image.Cols;
 
            float[] input_tensor_data = new float[1 * 3 * inpHeight * inpWidth];
            for (int c = 0; c < 3; c++)
            {
                for (int i = 0; i < row; i++)
                {
                    for (int j = 0; j < col; j++)
                    {
                        float pix = ((byte*)(resize_image.Ptr(i).ToPointer()))[j * 3 + c];
                        input_tensor_data[c * row * col + i * col + j] = (float)((pix / 255.0 - mean[c]) / std[c]);
                    }
                }
            }
            input_tensor = new DenseTensor<float>(input_tensor_data, new[] { 1, 3, inpHeight, inpWidth });
 
            //将 input_tensor 放入一个输入参数的容器,并指定名称
            input_ontainer.Add(NamedOnnxValue.CreateFromTensor("input", input_tensor));
            //运行 Inference 并获取结果
            result_infer = onnx_session.Run(input_ontainer);
相关推荐
OPEN-F3 小时前
C++进阶教程:继承与多态
开发语言·c++
luj_17685 小时前
大律师考核应重能力与科技素养
c语言·开发语言·c++·经验分享·算法
leonkay6 小时前
C# 特性(Attribute)——【1】基础讲解
开发语言·青少年编程·面试·c#·.net·个人开发
harmful_sheep6 小时前
java group by常见用法
java·开发语言·python
SKH.6 小时前
Linux软件编程(6)线程间通信
java·开发语言·数据库
whcyhhh7 小时前
头歌实践教学平台:数据科学与大数据技术导论(十六)
大数据·开发语言·python
萌动的小火苗7 小时前
数据结构面试题【无答案】
c语言·开发语言·数据结构·链表
宸津-代码粉碎机7 小时前
AI工程化高阶实战|从Demo到生产落地核心架构、全套源码与避坑指南
java·大数据·开发语言·人工智能·python·架构
CSDN_RTKLIB7 小时前
数据库七大符号表
c#
XR1234567888 小时前
办公网自主创新建设怎么选?信创办公场景的选型逻辑
开发语言·php