C# OnnxRuntime 部署 DAViD 深度估计
目录说明效果模型信息项目代码说明官网地址https://github.com/microsoft/DAViD效果模型信息Model Properties ------------------------- metadata{} --------------------------------------------------------------- Inputs ------------------------- nameinput tensorFloat[-1, 3, 512, 512] --------------------------------------------------------------- Outputs ------------------------- nameoutput tensorFloat[-1, 512, 512] ---------------------------------------------------------------项目代码using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace Onnx_Demo { public partial class Form1 : Form { // ----- 深度估计专用字段 ----- string fileFilter *.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.png; string image_path ; string startupPath; DateTime dt1 DateTime.Now; DateTime dt2 DateTime.Now; string model_path; Mat image; // 原始图像BGR Mat depth_color_map; // 生成的深度彩色图 SessionOptions options; InferenceSession onnx_session; Tensorfloat input_tensor; ListNamedOnnxValue input_container; IDisposableReadOnlyCollectionDisposableNamedOnnxValue result_infer; int inpHeight 512, inpWidth 512; bool inverse_depth false; // 是否反转深度近处亮 public Form1() { InitializeComponent(); } // ----- 按钮1选择图片 ----- private void button1_Click(object sender, EventArgs e) { OpenFileDialog ofd new OpenFileDialog(); ofd.Filter fileFilter; if (ofd.ShowDialog() ! DialogResult.OK) return; pictureBox1.Image null; image_path ofd.FileName; pictureBox1.Image new Bitmap(image_path); textBox1.Text ; image new Mat(image_path); pictureBox2.Image null; depth_color_map null; } // ----- 按钮2执行深度估计推理 ----- private void button2_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(image_path)) { MessageBox.Show(请先选择图片); return; } button2.Enabled false; pictureBox2.Image null; textBox1.Text ; Application.DoEvents(); // 读取原始图像BGR image new Mat(image_path); int originalWidth image.Cols; int originalHeight image.Rows; // ------------------ 预处理 ------------------ // 1. 缩放至模型输入尺寸 512x512 Mat resized new Mat(); Cv2.Resize(image, resized, new OpenCvSharp.Size(inpWidth, inpHeight)); // 2. 转换为浮点型并归一化到 [0,1] resized.ConvertTo(resized, MatType.CV_32FC3, 1.0 / 255.0); // 3. 分离 BGR 通道并按 RGB 顺序填充模型预期 RGB Mat[] channels Cv2.Split(resized); // channels[0]B, [1]G, [2]R int channelSize inpHeight * inpWidth; float[] inputData new float[3 * channelSize]; // 将 B,G,R 重新排列为 R,G,B for (int c 0; c 3; c) { float[] channelData new float[channelSize]; System.Runtime.InteropServices.Marshal.Copy(channels[c].Data, channelData, 0, channelSize); int targetIndex (c 0) ? 2 : (c 2) ? 0 : 1; // B-2, G-1, R-0 Array.Copy(channelData, 0, inputData, targetIndex * channelSize, channelSize); } // 4. 创建输入张量 input_tensor new DenseTensorfloat(inputData, new[] { 1, 3, inpHeight, inpWidth }); input_container.Clear(); input_container.Add(NamedOnnxValue.CreateFromTensor(input, input_tensor)); // ------------------ 推理 ------------------ dt1 DateTime.Now; result_infer onnx_session.Run(input_container); dt2 DateTime.Now; // 获取输出 var output result_infer.First(x x.Name output).AsTensorfloat(); var dimensions output.Dimensions.ToArray(); int outH dimensions.Length 2 ? dimensions[dimensions.Length - 2] : inpHeight; int outW dimensions.Length 1 ? dimensions[dimensions.Length - 1] : inpWidth; float[] depthFloat output.ToArray(); // 创建单通道深度 Mat (CV_32FC1) Mat depthRaw new Mat(outH, outW, MatType.CV_32FC1); System.Runtime.InteropServices.Marshal.Copy(depthFloat, 0, depthRaw.Data, depthFloat.Length); // ------------------ 后处理 ------------------ // 1. 双线性插值至原始尺寸 Mat depthResized new Mat(); Cv2.Resize(depthRaw, depthResized, new OpenCvSharp.Size(originalWidth, originalHeight), interpolation: InterpolationFlags.Linear); // 2. 反转深度使近处物体更亮 if (inverse_depth) { Cv2.Subtract(1.0, depthResized, depthResized); } // 3. 归一化深度到 [0,1] 用于彩色映射 double minVal, maxVal; Cv2.MinMaxLoc(depthResized, out minVal, out maxVal); float range (float)(maxVal - minVal); if (range 1e-6) range 1e-6f; Mat depthNorm new Mat(); depthResized.ConvertTo(depthNorm, MatType.CV_32FC1, 1.0 / range, -minVal / range); Cv2.Min(depthNorm, 1.0, depthNorm); Cv2.Max(depthNorm, 0.0, depthNorm); // 4. 转换为 8-bit 灰度图 Mat depthGray new Mat(); depthNorm.ConvertTo(depthGray, MatType.CV_8UC1, 255.0); // 5. 应用热力图Inferno 风格 depth_color_map new Mat(); Cv2.ApplyColorMap(depthGray, depth_color_map, ColormapTypes.Inferno); // 显示结果 pictureBox2.Image new Bitmap(depth_color_map.ToMemoryStream()); textBox1.Text $推理耗时: {(dt2 - dt1).TotalMilliseconds:F2} ms\n深度范围: [{minVal:F3}, {maxVal:F3}]; button2.Enabled true; } // ----- 按钮3保存深度彩色图 ----- private void button3_Click(object sender, EventArgs e) { if (depth_color_map null || depth_color_map.Empty()) { MessageBox.Show(请先执行深度估计); return; } SaveFileDialog sdf new SaveFileDialog(); sdf.Title 保存深度彩色图; sdf.Filter PNG图片 (*.png)|*.png|JPEG图片 (*.jpg)|*.jpg|BMP图片 (*.bmp)|*.bmp; sdf.FilterIndex 1; if (sdf.ShowDialog() DialogResult.OK) { Cv2.ImWrite(sdf.FileName, depth_color_map); MessageBox.Show($保存成功: {sdf.FileName}); } } // ----- 窗体加载初始化 ONNX 模型 ----- private void Form1_Load(object sender, EventArgs e) { startupPath Application.StartupPath; // 深度估计模型路径请根据实际位置修改 model_path System.IO.Path.Combine(startupPath, model, depth-model-vitb16_384.onnx); if (!System.IO.File.Exists(model_path)) { MessageBox.Show($模型文件不存在: {model_path}\n请将模型放置于 {startupPath}\\model\\ 目录下); return; } options new SessionOptions(); options.LogSeverityLevel OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO; options.AppendExecutionProvider_CPU(0); // 若需 CUDA可取消注释 // options.AppendExecutionProvider_CUDA(0); onnx_session new InferenceSession(model_path, options); input_container new ListNamedOnnxValue(); // 可选默认测试图片 string testImg System.IO.Path.Combine(startupPath, test_img, 0.jpg); if (System.IO.File.Exists(testImg)) { image_path testImg; pictureBox1.Image new Bitmap(image_path); image new Mat(image_path); } } // ----- 双击图片放大保留原功能----- private void pictureBox1_DoubleClick(object sender, EventArgs e) { Common.ShowNormalImg(pictureBox1.Image); } private void pictureBox2_DoubleClick(object sender, EventArgs e) { Common.ShowNormalImg(pictureBox2.Image); } } }引入地址

相关新闻

UE5第三人称相机系统:从弹簧臂组件到实战调优

UE5第三人称相机系统:从弹簧臂组件到实战调优

1. 项目概述:为什么第三人称相机是UE5项目的基石在虚幻引擎5(UE5)里鼓捣过角色控制的开发者,十有八九都跟相机系统“搏斗”过。尤其是第三人称视角,它远不止是把镜头拉到角色背后那么简单。一个手感糟糕、动不动穿墙或…

2026/7/15 9:28:50 阅读更多 →
从太空俯瞰家乡:高清卫星地图下的村镇变迁与免费获取攻略

从太空俯瞰家乡:高清卫星地图下的村镇变迁与免费获取攻略

1. 卫星地图:从太空俯瞰家乡的魔法之窗第一次在电脑上打开卫星地图时,我盯着屏幕足足愣了五分钟——原来从400公里高空看家乡的稻田,会呈现出如此规律的几何图案,像一块块深浅不一的绿色拼图。这种"上帝视角"带来的震撼…

2026/7/15 9:28:50 阅读更多 →
Python环境搭建与PyCharm专业版完整配置指南

Python环境搭建与PyCharm专业版完整配置指南

最近在技术社区看到很多Python初学者在环境搭建环节就被卡住,特别是PyCharm专业版的安装和配置问题。作为Python开发的核心工具,PyCharm的专业版确实提供了更强大的功能,但官方授权费用对学习阶段的开发者不太友好。本文将整合一套完整的解决…

2026/7/15 9:26:48 阅读更多 →

最新新闻

浙大博士毕业通关指南:从外审到离校的全流程材料清单

浙大博士毕业通关指南:从外审到离校的全流程材料清单

1. 外审前的准备工作 博士论文外审是毕业流程中的第一道关卡,这个阶段需要完成两项核心任务。先说读书报告审核,这是很多同学容易忽略的环节。记得我当时准备了8份读书报告,每份都要求有导师签字和博士论坛的盖章。吴海梅老师审核时特别仔细&…

2026/7/15 10:46:12 阅读更多 →
app-bundle-samples进阶:使用SplitInstallManager管理动态功能模块加载的终极指南

app-bundle-samples进阶:使用SplitInstallManager管理动态功能模块加载的终极指南

app-bundle-samples进阶:使用SplitInstallManager管理动态功能模块加载的终极指南 【免费下载链接】app-bundle-samples Multiple samples showing the best practices in app bundles on Android. 项目地址: https://gitcode.com/gh_mirrors/ap/app-bundle-sampl…

2026/7/15 10:44:11 阅读更多 →
WechatDecrypt终极指南:3步轻松解密微信加密数据库,重新掌控聊天记录

WechatDecrypt终极指南:3步轻松解密微信加密数据库,重新掌控聊天记录

WechatDecrypt终极指南:3步轻松解密微信加密数据库,重新掌控聊天记录 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾因微信聊天记录加密而无法查看重要信息?是…

2026/7/15 10:44:11 阅读更多 →
终极GTA5线上工具:免费开源的游戏体验增强神器

终极GTA5线上工具:免费开源的游戏体验增强神器

终极GTA5线上工具:免费开源的游戏体验增强神器 【免费下载链接】GTA5OnlineTools GTA5线上小助手 项目地址: https://gitcode.com/gh_mirrors/gt/GTA5OnlineTools 还在为GTA5线上模式的繁琐操作而烦恼吗?想要快速定制角色外观、优化载具性能、提升…

2026/7/15 10:44:11 阅读更多 →
电机工程师技术提升与职业发展全攻略

电机工程师技术提升与职业发展全攻略

1. 电机行业现状与职业挑战电机行业作为工业领域的核心支柱,近年来面临着前所未有的机遇与挑战。随着智能制造和绿色能源转型的推进,电机工程师的工作内容正在发生深刻变化。我从业15年来,见证了从传统电机设计到智能驱动系统的技术迭代全过程…

2026/7/15 10:42:10 阅读更多 →
猫抓Cat-Catch:浏览器资源嗅探的终极指南

猫抓Cat-Catch:浏览器资源嗅探的终极指南

猫抓Cat-Catch:浏览器资源嗅探的终极指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾为无法下载网页视频而烦恼&#xff1…

2026/7/15 10:42:10 阅读更多 →

日新闻

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向红外小目标检测的时空特征融合模块——STFFM,用于增强复杂背景下目标与噪声、杂波的区分能力。该方法通过拼接空间特征与时间/运动特征,并结合通道注意力、空间注意力和残差增强机制,实现对关键语义通道与疑似目标区域的…

2026/7/15 0:01:00 阅读更多 →
YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向复杂背景小目标检测的时空特征融合模块——STFFM。该模块通过空间分支与时间/运动分支的特征拼接,引入通道注意力和空间注意力对融合特征进行自适应筛选,并结合残差增强与通道压缩,突出目标区域、抑制背景噪声。我们将 S…

2026/7/15 0:01:00 阅读更多 →
行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

一、为什么减速以后扭矩会增大 旋转机械的功率、转速和扭矩之间存在以下关系: T 9550 P n 其中: T为扭矩,单位Nm; P为功率,单位kW; n为转速,单位r/min。 在功率基本不变的情况下:…

2026/7/15 0:03:00 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/14 16:53:23 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/14 14:00:13 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/14 7:15:24 阅读更多 →

月新闻