尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
不用 Python,C# 也能跑 YOLOv8 人像检测(附源码)
目录前言项目介绍项目功能项目特点项目技术项目代码项目效果项目源码总结前言平时做桌面应用时偶尔会遇到需要处理图像或者视频流的需求比如做一个简单的安防监控工具、人流统计的小程序或者给某个管理系统加一个摄像头拍照功能。YOLOv8 是目前比较主流的目标检测模型用它来识别人像效果不错而且 ONNX 格式可以跨平台部署。本文分享一个用WinForms 做的人像检测小工具集成了图片检测和摄像头实时检测两种模式。整套代码量不大但把界面交互、模型推理、摄像头采集这几块串了起来适合拿来作为桌面端 AI 应用的起点。项目介绍项目是一个最小可运行的 WinForms 桌面程序核心功能是利用 YOLOv8 模型ONNX Runtime 推理从图片或摄像头视频流中识别人像并在画面中把检测结果框出来。项目整体结构比较清晰界面交互放在 Form 里模型推理封装在 YoloV8Predictor 类中摄像头采集部分单独抽离成了 CameraCaptureService。默认模型文件放在models/yolov8n.onnx当然程序启动后也可以手动指定其他 ONNX 模型。项目功能静态图片检测选择本地图片一键运行人像检测返回带检测框的标注图摄像头视频流检测扫描本机可用摄像头开启后持续从视频流中识别人像模型加载支持通过界面浏览选择任意 YOLOv8 导出的 ONNX 模型文件实时状态反馈每次检测会显示识别到的人像数量、推理耗时等信息自适应界面控制运行过程中自动禁用无关操作按钮避免用户误操作摄像头热插拔兼容支持刷新摄像头列表方便外接摄像头即插即用帧丢弃机制视频流模式下推理忙时自动丢弃中间帧只处理最新画面减少卡顿检测结果可视化在原始画面基础上绘制矩形框和置信度标签直观展示识别结果项目特点采用 ONNX Runtime 推理不需要安装深度学习框架模型和图片均通过文件对话框选择操作路径灵活图片推理和摄像头推理共用同一套检测逻辑代码复用率高摄像头采集服务基于 AForge.NET兼容主流 USB 摄像头界面使用 WinForms 原生控件轻量简洁没有额外 UI 库依赖异步任务处理耗时操作界面不会卡死预设了 COCO 数据集中 person 类别的索引0直接使用无需额外配置推荐的 YOLOv8 模型导出参数imgsz640, opset12写在说明里方便复现项目技术技术项说明开发框架.NET 6 / .NET Framework 4.8 以上界面技术Windows Forms (WinForms)推理引擎ONNX Runtime (Microsoft.ML.OnnxRuntime)图像处理System.Drawing.Common摄像头采集AForge.Video / AForge.Video.DirectShow目标检测模型YOLOv8 (导出为 ONNX 格式)数据集COCO (只使用 person 类别)编程语言C#异步模型async / await Task图像格式Bitmap 与 byte[] 互转项目代码YoloV8Predictor 类负责 ONNX 模型的加载和推理。输入是一张 Bitmap 图片输出是 DetectionResult 列表每个结果包含边界框和置信度。内部做了图像缩放、归一化、张量构造、后处理 NMS 等步骤。对外只暴露一个 DetectPersons 方法调用方不需要关心 ONNX 的细节。private PreparedInput PrepareInput(Bitmap originalImage) { var scale Math.Min(_inputWidth / (float)originalImage.Width, _inputHeight / (float)originalImage.Height); var resizedWidth (int)Math.Round(originalImage.Width * scale); var resizedHeight (int)Math.Round(originalImage.Height * scale); var padX (_inputWidth - resizedWidth) / 2f; var padY (_inputHeight - resizedHeight) / 2f; usingvar canvas new Bitmap(_inputWidth, _inputHeight, PixelFormat.Format24bppRgb); using (var graphics Graphics.FromImage(canvas)) { graphics.Clear(Color.FromArgb(114, 114, 114)); graphics.InterpolationMode System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; graphics.DrawImage(originalImage, padX, padY, resizedWidth, resizedHeight); } var pixels newbyte[_inputWidth * _inputHeight * 3]; var bitmapData canvas.LockBits( new Rectangle(0, 0, canvas.Width, canvas.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); try { for (var y 0; y _inputHeight; y) { var rowPtr bitmapData.Scan0 (y * bitmapData.Stride); Marshal.Copy(rowPtr, pixels, y * _inputWidth * 3, _inputWidth * 3); } } finally { canvas.UnlockBits(bitmapData); } var tensorData newfloat[_inputWidth * _inputHeight * 3]; var channelLength _inputWidth * _inputHeight; for (var y 0; y _inputHeight; y) { for (var x 0; x _inputWidth; x) { var pixelIndex ((y * _inputWidth) x) * 3; var tensorIndex (y * _inputWidth) x; var b pixels[pixelIndex] / 255f; var g pixels[pixelIndex 1] / 255f; var r pixels[pixelIndex 2] / 255f; tensorData[tensorIndex] r; tensorData[channelLength tensorIndex] g; tensorData[(channelLength * 2) tensorIndex] b; } } var tensor new DenseTensorfloat(tensorData, [1, 3, _inputHeight, _inputWidth]); returnnew PreparedInput(tensor, scale, padX, padY); }CameraCaptureService 类封装了摄像头的打开、帧获取和停止操作。通过事件FrameReady把每一帧图像推送给订阅者。这里有个小细节每一帧都是独立的 Bitmap订阅方用完需要自己释放否则内存会涨上去。private async Task CaptureLoopAsync(VideoCapture capture, CancellationToken cancellationToken) { usingvar frame new Mat(); try { while (!cancellationToken.IsCancellationRequested) { if (!capture.Read(frame) || frame.Empty()) { await Task.Delay(15, cancellationToken); continue; } var bitmap BitmapConverter.ToBitmap(frame); try { FrameReady?.Invoke(this, new CameraFrameEventArgs(bitmap)); } catch { bitmap.Dispose(); throw; } await Task.Delay(1, cancellationToken); } } catch (OperationCanceledException) { } catch (Exception) when (cancellationToken.IsCancellationRequested) { } }静态图片检测的流程更简单一些用户选择图片后_sourceImage保存原始图点击推理按钮后异步执行DetectPersons然后把结果绘制到新的 Bitmap 上替换预览控件。界面控制方面UpdateControlStates方法统一管理所有按钮和输入框的启用状态根据当前是否在运行推理或摄像头来决定哪些操作可用。这样做的好处是状态集中管理不容易出现界面混乱。项目效果程序跑起来之后主界面分成上下两个区域。上面是参数配置区可以选模型、选图片、选摄像头中间是预览区展示原始图片或者摄像头画面人像检测框用绿色矩形标出来左上角会显示person 85%这样的置信度标签。静态图片模式下加载一张多人合影点一下图片推理一两秒内就能看到所有人物被框出来状态栏会显示具体识别到的人数和耗时。摄像头模式下打开后预览区实时更新每帧的推理结果会覆盖显示响应速度基本能做到实时具体帧率取决于电脑配置和模型大小。模型文件我用的是 Ultralytics 官方导出的 yolov8n.onnx参数量小CPU 上就能跑得动。如果换成 yolov8m 或 yolov8l精度会更高但推理耗时也会相应增加这个可以根据实际场景取舍。项目源码项目的目录结构如下├── xxxx.csproj ├── Form1.cs # 主界面逻辑 ├── Form1.Designer.cs ├── YoloV8Predictor.cs # 模型推理封装 ├── CameraCaptureService.cs # 摄像头采集 ├── models/ │ └── yolov8n.onnx # 默认模型需自行下载 └── .dotnet-home/ # 本地 dotnet 环境可选运行前需要做两件事1、下载 YOLOv8 ONNX 模型。可以用官方命令导出yolo export modelyolov8n.pt formatonnx imgsz640 opset12然后把生成的 yolov8n.onnx 放到 models 目录下。2、还原 NuGet 包项目引用了 ONNX Runtime 和 AForge 相关库。启动命令dotnet restore .\xxx\xxxxWinForms.csproj dotnet run --project .\xxxWinForms\xxxWinForms.csproj如果不想装全局 dotnet也可以用项目里带的本地环境方式按开头说明设置DOTNET_CLI_HOME即可。总结这个项目把 YOLOv8 模型从 Python 环境搬到了 C# 桌面端整个流程走下来最大的感受是 ONNX Runtime 让跨语言部署变得很顺畅。WinForms 虽然是个老面孔但配合异步编程处理视频流这种实时任务也完全够用。如果大家需要做一个桌面端的人像检测或目标检测工具可以直接拿这份代码改一改。比如把 person 改成其他 COCO 类别或者把检测结果输出成日志、触发报警等等扩展起来都比较方便。当然这个项目也有不少可以优化的地方比如目前只检测 person 一个类别如果想检测多种目标需要调整逻辑摄像头采集依赖 AForge这个库已经好几年没更新了在一些新摄像头上的兼容性可能不够好可以换成 MediaCapture 或者 OpenCVSharp 的方案。感兴趣的朋友可以自己折腾了。引入地址
RELATED

相关推荐

《Windows Server 2025》 [2026年9月版 ] [简体/繁体/英文][官方ISO] 下载

《Windows Server 2025》 [2026年9月版 ] [简体/繁体/英文][官方ISO] 下载

文件名称: zh-cn_windows_server_2025_updated_sep_2026_x64_dvd_f69d8ae5.iso zh-tw_windows_server_2025_updated_sep_2026_x64_dvd_f69d8ae5.iso en-us_windows_server_2025_updated_sep_2026_x64_dvd_f69d8ae5.iso资源地址:https://600110.xyz/archi…

📅 2026/9/27 7:14:24
毕业设计是做网站设计选哪家靠谱5个实战避坑指南

毕业设计是做网站设计选哪家靠谱5个实战避坑指南

毕业设计是做网站设计选哪家靠谱5个实战避坑指南 想搞毕业设计是做网站设计,但自己不会代码,心里慌得一批?别急,这种“裸奔”状态在计算机专业学生里太常见了。很多同学盯着淘宝搜“网站开发哪家好”,结果全是坑,要么外包跑路,要么代码烂到老师一眼看…

📅 2026/9/27 7:14:24
5个关键特性深度解析:mobile-mcp如何实现跨平台移动自动化测试

5个关键特性深度解析:mobile-mcp如何实现跨平台移动自动化测试

5个关键特性深度解析:mobile-mcp如何实现跨平台移动自动化测试 【免费下载链接】mobile-mcp Model Context Protocol Server for Mobile Automation and Scraping (iOS, Android, Emulators, Simulators and Real Devices) 项目地址: https://gitcode.com/GitHub_…

📅 2026/9/27 7:09:24
MORE NEWS

更多资讯

📰

零Rust代码支持新语言:用tree-sitter插件为sentrux添加第53种语言的完整开发指南

零Rust代码支持新语言:用tree-sitter插件为sentrux添加第53种语言的完整开发指南 【免费下载链接】sentrux Real-time architectural sensor that helps AI agents close the feedback loop, enabling recursive self-improvement of code quality. Pure Rust. 项…

📰

ng-zorro-antd Pagination 快速跳转(Quick Jumper)完全指南:从使用到源码剖析

UI组件前端 【免费下载链接】ng-zorro-antd Angular UI Component Library based on Ant Design 项目地址: https://gitcode.com/gh_mirrors/ng/ng-zorro-antd 点击查看 免费下载 导读 本文聚焦于 ng-zorro-antd(Angular UI 组件库)中 nz-p…

📰

AlgoNote 数组基础详解:线性表顺序存储、随机访问寻址与增删改查实战

教程文档知识库 【免费下载链接】AlgoNote ⛽️「算法通关手册」:从零开始的「算法与数据结构」学习教程,200 道「算法面试热门题目」,1000 道「LeetCode 题目解析」,持续更新中! 项目地址: https://gitcod…

📰

开题报告技术路线图节点经常断层?本科用智一刻避开4个误区

在开题答辩中,评审老师最喜欢看、也最容易挑出毛病的就是那张占据半页纸的“技术路线图”。 不少同学为了显得工作量饱满,用绘图软件画了密密麻麻几十个文本框,箭头横飞四处交叉。结果投影仪一放,导师直接批评:“你这…

📰

3步搞定自己怎么做卡盟网站:2026最新防黑实战

3步搞定自己怎么做卡盟网站:2026最新防黑实战 昨晚凌晨两点,手机突然震动。运营小刘发来截图,脸色铁青:“老板,咱们那个自动发卡平台挂了!首页全是赌博广告,后台密码好像也被改了!”…

📰

网课网站怎么建才不踩坑?3个最佳实践让备案通过快一倍

网课网站怎么建才不踩坑?3个最佳实践让备案通过快一倍 很多老板做网课网站,第一反应是找模板,第二反应是搞内容,但真正卡住脖子的,往往是那个让人一头雾水的备案流程。…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬