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

青岛开办公司要做网站吗宝塔建设网站域名进不去

青岛开办公司要做网站吗,宝塔建设网站域名进不去,管理制度,云南建设投资集团网站首页C# YOLOv5目标检测代码详细分析 概述 使用C#和OpenCvSharp库部署YOLOv5目标检测模型,可以对静态图像和视频流(包括摄像头和视频文件)进行目标检测。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d1cf3e24c9fc472db766689c59800905.png 依赖库 usi…

C# YOLOv5目标检测代码详细分析

概述

使用C#和OpenCvSharp库部署YOLOv5目标检测模型,可以对静态图像和视频流(包括摄像头和视频文件)进行目标检测。
在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d1cf3e24c9fc472db766689c59800905.png

依赖库

using OpenCvSharp;           // OpenCV的C#封装库
using OpenCvSharp.Dnn;       // 深度神经网络模块
using OpenCvSharp.Extensions; // 扩展方法
using System.Drawing;        // .NET图像处理
using System.Windows.Forms;  // Windows窗体应用

数据结构定义

DetParam 结构体

检测参数配置结构体,用于控制模型推理行为:

public struct DetParam
{public int modelWidth;           // 模型输入宽度(通常320, 416, 640等)public int modelHeight;          // 模型输入高度(通常320, 416, 640等)public double confidenceThreshold; // 置信度阈值(0.0-1.0)public bool outResultBmp;       // 是否输出带检测框的结果图像
}

DetResult 结构体

检测结果结构体,存储单个检测目标的信息:

public struct DetResult
{public int index;        // 类别索引public string label;     // 类别标签名称public double confidence; // 检测置信度public Rect box;         // 边界框坐标(x, y, width, height)
}

CvDet 核心检测类

类成员变量

private Net net;                    // OpenCV DNN网络对象
public List<string> classNames;     // 类别名称列表
int inpHeight = 320;               // 默认输入高度
int inpWidth = 320;                // 默认输入宽度

模型加载方法

ReadModel 方法负责加载ONNX模型和类别标签文件:

public bool ReadModel(string modelPath, string classesPath)

功能流程:

  1. 使用 CvDnn.ReadNetFromOnnx() 加载ONNX格式的YOLOv5模型
  2. 从文本文件中逐行读取类别名称
  3. 异常处理确保加载过程的稳定性

注意事项:

  • 模型文件必须是ONNX格式
  • 类别文件每行一个类别名称,顺序对应模型输出的类别索引

图像检测方法

Detect 方法是核心的目标检测功能:

输入验证和预处理
Mat srcImage = BitmapConverter.ToMat(inputBmp);
if(srcImage.Channels() == 1)
{Cv2.CvtColor(srcImage, srcImage, ColorConversionCodes.GRAY2BGR);
}
  • 将Bitmap转换为OpenCV的Mat格式
  • 确保图像为3通道BGR格式
图像尺寸调整
Mat resizeMat = ResizeImage(srcImage, out newHeight, out newWidth, out paddingHeight, out paddingWidth);

调用自定义的 ResizeImage 方法,保持长宽比的同时调整到模型输入尺寸。

创建输入Blob
Mat blob = CvDnn.BlobFromImage(resizeMat, 1/255.0, new OpenCvSharp.Size(detParam.modelWidth, detParam.modelHeight), new Scalar(0, 0, 0), true, false);

参数说明:

  • 1/255.0: 像素值归一化到[0,1]范围
  • true: 交换R和B通道(BGR转RGB)
  • false: 不进行图像裁剪
模型推理
net.SetInput(blob);
Mat[] outBlobs = new Mat[3] { new Mat(), new Mat(), new Mat() };
string[] outBlobNames = net.GetUnconnectedOutLayersNames().ToArray();
net.Forward(outBlobs, outBlobNames);
  • 设置网络输入
  • 获取输出层名称
  • 执行前向推理
输出处理和解析
int numProposal = outBlobs[0].Size(0);
int nout = outBlobs[0].Size(1);
if (outBlobs[0].Dims > 2)
{numProposal = outBlobs[0].Size(1);nout = outBlobs[0].Size(2);outBlobs[0] = outBlobs[0].Reshape(0, numProposal);
}

适配不同版本YOLOv5的输出格式。

候选框提取(核心算法)
unsafe
{float* pdata = (float*)outBlobs[0].Data;for (int n = 0; n < numProposal; n++){float boxScore = pdata[4];  // 目标存在概率if (boxScore >= detParam.confidenceThreshold){// 获取类别概率Mat scores = outBlobs[0].Row(rowIndex).ColRange(5, nout);Cv2.MinMaxLoc(scores, out minVal, out maxVal, out minLoc, out maxLoc);maxVal = maxVal * boxScore;  // 最终置信度if (maxVal >= detParam.confidenceThreshold){// 坐标还原float cx = (pdata[0] - paddingWidth) * Math.Max(ratiow, ratioh);float cy = (pdata[1] - paddingHeight) * Math.Max(ratiow, ratioh);float w = pdata[2] * Math.Max(ratiow, ratioh);float h = pdata[3] * Math.Max(ratiow, ratioh);int left = (int)(cx - 0.5 * w);int top = (int)(cy - 0.5 * h);// 保存检测结果confidences.Add((float)maxVal);boxes.Add(new Rect(left, top, (int)w, (int)h));classIds.Add(classIndex);}}pdata += nout;  // 指针移动到下一个候选框}
}

YOLOv5输出格式解析:

  • pdata[0], pdata[1]: 中心点坐标 (cx, cy)
  • pdata[2], pdata[3]: 宽度和高度 (w, h)
  • pdata[4]: 目标存在概率 (objectness score)
  • pdata[5:]: 各类别概率分布
非极大值抑制(NMS)
float nmsThreshold = 0.5f;
CvDnn.NMSBoxes(boxes, confidences, (float)detParam.confidenceThreshold, nmsThreshold, out indices);

消除重叠的检测框,保留最优结果。

结果可视化
if(detParam.outResultBmp)
{Cv2.Rectangle(resultImage, /* 绘制边界框 */);Cv2.PutText(resultImage, /* 添加标签文本 */);
}

视频检测方法

DetectVedio 方法与图像检测基本相同,主要区别:

  • 输入参数为 Mat 而非 Bitmap
  • 输出为 Mat 类型的结果图像
  • 适用于视频流的实时处理

图像预处理方法

ResizeImage 方法实现保持长宽比的图像缩放:

核心算法
float hw_scale = (float)srch / srcw;
if (hw_scale > 1)  // 图像高度大于宽度
{newh = inpHeight;neww = (int)(inpWidth / hw_scale);// 左右填充left = (int)((inpWidth - neww) * 0.5);Cv2.CopyMakeBorder(dstimg, dstimg, 0, 0, left, inpWidth - neww - left, BorderTypes.Constant);
}
else  // 图像宽度大于高度
{newh = (int)(inpHeight * hw_scale);neww = inpWidth;// 上下填充top = (int)((inpHeight - newh) * 0.5);Cv2.CopyMakeBorder(dstimg, dstimg, top, inpHeight - newh - top, 0, 0, BorderTypes.Constant);
}

填充策略:

  • 计算长宽比例
  • 按比例缩放到合适尺寸
  • 使用黑色像素填充剩余区域
  • 确保输出尺寸符合模型要求

使用示例

// 初始化检测器
CvDet detector = new CvDet();// 加载模型
bool success = detector.ReadModel("yolov5s.onnx", "coco.names");// 设置检测参数
DetParam param = new DetParam
{modelWidth = 640,modelHeight = 640,confidenceThreshold = 0.5,outResultBmp = true
};// 执行检测
Bitmap inputImage = new Bitmap("test.jpg");
List<DetResult> results = detector.Detect(inputImage, param, out Bitmap resultImage);// 处理检测结果
foreach(var result in results)
{Console.WriteLine($"类别: {result.label}, 置信度: {result.confidence:F2}");
}

关键技术要点

1. 坐标变换

代码实现了从模型输出坐标到原图坐标的正确变换,考虑了:

  • 图像缩放比例
  • 填充偏移量
  • 中心点坐标转换为左上角坐标

2. 内存安全

使用 unsafe 代码块直接操作内存指针,提高了数据访问效率。

3. 异常处理

在模型加载和推理过程中都有适当的异常处理机制。

4. 性能优化

  • 使用指针直接访问输出数据
  • 避免不必要的数据拷贝
  • 合理的内存管理

后续优化

  1. 批处理支持: 当前实现为单张图像处理,可扩展支持批量处理
  2. GPU加速: 可配置使用CUDA或OpenCL后端加速推理
  3. 多线程: 对于视频处理场景,可实现多线程并行处理
  4. 动态模型尺寸: 支持运行时调整模型输入尺寸
  5. 更多后处理选项: 添加跟踪、计数等高级功能

总结

上述代码提供了一个完整、高效的YOLOv5 C#部署方案,适用于Windows平台的目标检测应用。代码结构清晰,功能完整。

http://www.yayakq.cn/news/477098/

相关文章:

  • 务川网站建设网站建设控制面板怎么设置
  • 网站运营工作计划建筑培训网首页安全员
  • 做视频网站审核编辑有假么手机wordpress加载图片慢
  • 公司要找网站公司动漫设计专升本考什么
  • 网页设计与网站建设的目的wordpress 删除 wordpress.org
  • h5是什么网站上面做的沃尔玛公司网站建设案例分析
  • asp响应式h5网站源码微信端网站设计规范
  • 做律师网站安徽省城乡建设厅网站
  • 怎样做才能让网站有排名做网站从哪里做
  • 沈阳网站制作思路网络河南省工程信息网官网
  • php企业网站源码 漂亮个人网站备案转公司备案
  • 浙江建设厅网站施工员报名凡客诚品衬衫
  • wdcp网站备份php网站模板制作工具
  • 用什么系统程序做评测网站中装建设为什么不涨
  • 邯郸网站建设策划方案html实例百度网页制作代码
  • 简单公司网站模版正规的网站建设学习网
  • 网站怎么做图片按按钮跳转龙岩网站推广营销
  • 网站建设说明书模板电影网站建设方案
  • 佛山定制网站建设少儿编程加盟品牌有哪些
  • 网站建站费用深圳二手房在售房源量持续增加
  • 建设的网站都是怎么赚钱某男神去年年底来某网站做见面会_竟要求安保人数超过两位数
  • 模板网站下载莱阳有网站建设推广的吗
  • 建网站推广百度热门关键词
  • 论坛创建搜索引擎优化报告
  • 威胁网站检测平台建设wordpress编辑html
  • 网站cms系统 开源it培训机构学费
  • linux建设视频网站苏州360推广网站建设
  • 设计网站建设合同书6酷站 房地产的网站设计参 案例
  • 玉山县建设局的网站wordpress 登录流程
  • 好医生网站怎么做不了题目了莱芜雪野湖天气