当前位置: 首页 > news >正文

[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);//输入Tensorinput_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];}//输入Tensorinput_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);

相关文章:

  • 【python报错】‘XXX‘ object is not callable
  • 性能基础之硬盘性能知识必知必会
  • 电容电阻电感关于封装的选型
  • 每天一个数据分析题(四百九十三)- 主成分分析与因子分析
  • C++ STL find 用法
  • Linux 部署YUM仓库及NFS共享服务
  • spring低版本设置cookie的samesite属性
  • roles
  • 力扣热题100_回溯_22_括号生成
  • openstack基本操作
  • windows平台的postgresql主从数据库流备份
  • UNiapp之微信小程序导出Excel
  • PCIe学习笔记(25)
  • OpenHarmony基础组件—图片加载ImageKnife
  • 登录 k8s-Dashboard 显示 Your connection is not private
  • [译] React v16.8: 含有Hooks的版本
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • canvas 高仿 Apple Watch 表盘
  • Java小白进阶笔记(3)-初级面向对象
  • js继承的实现方法
  • Markdown 语法简单说明
  • mysql innodb 索引使用指南
  • mysql 数据库四种事务隔离级别
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Netty源码解析1-Buffer
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 编写符合Python风格的对象
  • 如何用vue打造一个移动端音乐播放器
  • 异步
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (~_~)
  • (6)添加vue-cookie
  • (pojstep1.1.2)2654(直叙式模拟)
  • (pycharm)安装python库函数Matplotlib步骤
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (回溯) LeetCode 78. 子集
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (四)Controller接口控制器详解(三)
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)h264中avc和flv数据的解析
  • (转)VC++中ondraw在什么时候调用的
  • (状压dp)uva 10817 Headmaster's Headache
  • ***检测工具之RKHunter AIDE
  • **PHP分步表单提交思路(分页表单提交)