我用 C# 做了个运动计数器:打开摄像头,让电脑帮你数次数

做一组深蹲,练一会儿开合跳,常常会遇到一件小事:动作还在继续,刚才数到第几个却记不清了。

如果让电脑看着画面,帮我们记录重复动作的次数,会是什么体验?

最近,我把这个想法做成了一个 Windows 桌面小工具------运动计数工坊。

它可以导入已有的运动视频,也可以接入摄像头。选中画面里的运动者后,程序会持续分析动作,更新计数,并把统计记录保存下来。

这次的 r2 版本,还加入了 YOLO11n 人员检测和 DirectML GPU 加速。从自动找人,到连续计数,再到结果校正,已经有了一套可以实际操作的界面。

打开软件,可以怎么玩?

软件保留了两种使用方式。

一种是分析已经拍好的视频。

比如,拍下一段运动过程,导入软件,选择需要分析的时间段,框住运动者,再点击开始分析。完成后,可以查看累计次数曲线,定位到某个时间回看,也可以手动修正漏计或多计的次数。

整理好结果,还能导出统计表,或者生成带有计数字幕的 MP4 视频,方便保存和分享。

运动计数工坊 r2 主界面

主界面:视频导入、CPU/GPU 选择、YOLO 找人、片段分析与结果导出。配图为程序真实空载界面。

另一种是边看画面,边持续计数。

点击顶部的"GPU 实时计数...",可以选择摄像头,也可以让一段已有视频按照正常速度播放。

程序会画出人员检测框。默认首次选择画面里最大的人员框,也支持自己点击目标。计数过程中,可以看到当前次数、人员检测耗时、动作分析耗时,以及丢帧等运行状态。

GPU 实时运动计数界面

第一次使用,几步就能开始

先把完整运行包解压到一个新文件夹,双击 RepNet.Workshop.exe。

运行环境为 Windows 10/11 64 位,需要 .NET Framework 4.8;GPU 模式还需要可用的 DirectX 12 显卡和驱动。

已有 r1 的朋友,建议为 r2 单独新建目录,配套 DLL、模型和程序一起使用。

如果想分析已有视频:

  1. 点击"选择视频",导入 MP4、MOV、MKV 等文件。
  2. 在顶部选择 CPU 或自己的独立显卡。
  3. 点击"YOLO 找人",也可以直接拖动鼠标框选运动者。
  4. 设置开始、结束时间,再点击"开始分析"。
  5. 回看结果,需要时用"此处 +1 / −1"校正,最后导出 CSV、JSON 或带计数的 MP4。

如果想体验连续计数:

  1. 打开"GPU 实时计数..."窗口。
  2. 选择"摄像头"或"视频按原速播放"。
  3. 选择对应设备和 GPU,点击"开始连续计数"。
  4. 等待积累动作画面,观察计数变化。
  5. 结束后点击"打开统计记录",查看自动保存的 CSV 和 JSON。

这里有个实用细节:GPU 0 不一定是独立显卡。

例如我的测试笔记本,GPU 0 是核显,RTX 4060 Laptop 对应的是 GPU 1。选择时看显卡名称,比只看编号更直观。

第一次建议使用十几秒的片段,固定机位、单人、全身入镜,从深蹲这类重复过程比较明显的动作开始试。实际效果会受到角度、遮挡和动作节奏影响。

GPU 加速,实际快了多少?

这次使用 RTX 4060 Laptop、约 8 GB 显存进行了测试。

在完整运行包解压后的验证中,对同一个 64 帧 RepNet 模型窗口,预热后各运行 3 次,得到下面的平均耗时:

推理方式 平均耗时
CPU,4 线程 约 570.2 毫秒
DirectML GPU 约 49.4 毫秒

这一组模型窗口测试,GPU 速度约为 CPU 的 11.6 倍。

我们还检查了执行记录,确认 RepNet 的主要计算确实在 GPU 上运行,并对照了 CPU、GPU 的输出数值。

另一个 12 秒深蹲示例,离线 GPU 分析约用了 3.3 秒,显示估计 4 次。这个耗时包含视频采样、模型加载和推理,没有包含最后的 MP4 编码。

整条流程还会受到视频解码、人员检测、裁剪、显示和编码的影响,实际速度需要结合设备和素材来看。单个片段的计数结果,也不能代替不同运动场景的准确率评估。

背后是怎样工作的?

可以把它理解成几个模块在配合:

摄像头/视频 → 找到运动者 → 裁剪运动区域 → 分析重复动作 → 累计次数 → 显示与保存。

其中,YOLO11n 负责找人。

我们采用 Ultralytics 官方的 COCO 预训练检测权重,保留人员类别的检测结果。找到目标后,再适当扩大、平滑裁剪区域,给手臂、腿部等动作留出空间。

RepNet 负责分析重复的节奏。

它会比较一段连续画面之间的特征相似性,估计动作重复的周期,再把这些估计累计成次数。这样的思路可以用于探索多种重复动作,具体效果仍然要按运动和拍摄条件验证。

DirectML 负责把模型计算交给 GPU。

运行时通过 ONNX Runtime 调用,因此使用完整运行包时,无需自行安装 Python、PyTorch、CUDA 或 cuDNN。GPU 模式需要可用的 DirectX 12 显卡和驱动;软件也保留了 CPU 选项。

还有一个容易忽略的细节:实时分析会不断使用重叠的画面窗口。程序会记录已经统计到哪个采样位置,后续只提交新增时间段,防止同一段动作被重复累计。

实时计数,也需要观察动作的时间

RepNet 每次需要读取连续的 64 帧。

按默认 16 fps 采样,第一次大约需要 4 秒积累动作画面。之后,程序通常每增加 8 帧就调度一次分析,持续更新结果。

GPU 缩短的是计算耗时,动作观察窗口仍然需要保留。对于较慢的动作,程序会随着画面积累,逐步尝试更长的时间步长。

人员暂时离开画面时,程序会暂停统计并重新积累上下文;长时间丢失目标,或者人员交叉难以明确匹配时,需要重新点选。点击换人会建立新的计数段,历史记录保留在 CSV 中。

这版主要围绕一个选定目标的重复动作计数展开。动作是否做到位,仍然需要使用者判断;复杂遮挡、多人交错和高速动作,还需要进一步打磨。

目前,已有视频的连续计数、窗口去重、目标丢失、人工校正和界面操作都做了验证。摄像头完成了短时采集和停止检查,摄像头下不同运动的计数效果,还需要更多实际测试。

给普通使用者,也给喜欢 C# 的朋友

我把软件整理成了两个包:

  • 完整运行包:约 193 MiB,包含程序、模型、推理运行库和 FFmpeg。
  • 完整 VS2022 源码包:约 195 MiB,方便打开项目、学习和继续修改。

界面使用 C# WinForms + .NET Framework 4.8 ,两个窗体都保留独立的 .Designer.cs,可以在设计器里调整布局。源码包已经做过解压到新目录、独立编译的检查。

工作区默认放在 EXE 旁边的 workspace 目录,同盘业务路径优先使用相对路径,搬动整个软件目录比较方便。

实时模式默认保存统计记录,摄像头原视频、图片和音频不会自动落盘。离线模式则可以在确认结果后,主动导出带计数的视频。

对于想学习桌面 AI 部署的朋友,这个项目也包含了人员检测后处理、视频管道、滑动窗口、有界队列、GPU 后端选择,以及取消任务后释放资源等工程细节。

项目用到了公开模型和第三方组件,感谢原作者的工作。RepNet(github.com/google-rese... 和 ONNX Runtime DirectML(onnxruntime.ai/docs/execut... 的官方资料,都可以作为进一步学习的入口。YOLO11 的代码和权重适用 AGPL-3.0/企业许可,对外分发和商业使用请按官方许可条款(www.ultralytics.com/license)处理。

如果你对运动计数、C# 桌面开发或 AI 模型本地部署感兴趣,欢迎一起交流,也欢迎反馈实际使用中的素材和问题。

QQ群名称:天天代码码天天

群号码:264292622

我们一起继续把这些有意思的想法,做成用得上的小软件。

相关推荐
Elastic 中国社区官方博客1 小时前
5 分钟内将 56 页扫描文档转化为带引用的答案:面向搜索无法读取的文档的检索增强生成流水线
大数据·运维·人工智能·elasticsearch·搜索引擎·信息可视化·全文检索
STLearner1 小时前
KDD 2026 | (2月轮)时空数据(Spatial-Temporal)论文总结时空【下】(人群移动,城市科学(资源调度,)
大数据·人工智能·python·深度学习·机器学习·语言模型·数据挖掘
云和数据.ChenGuang1 小时前
python sorted函数详细剖析
开发语言·人工智能·windows·python·1024程序员节
打工仔折腾 AI1 小时前
AI Agent 工程化实战(二):5 分钟跑通 Deep Agent 并逐层拆解底层链路
java·数据库·人工智能·后端·python·langchain·ai agent 实战
云和数据.ChenGuang1 小时前
Python map() 函数详解:从语法、原理到实战用法
开发语言·人工智能·python·langchain·1024程序员节
一马平川的大草原1 小时前
企业语义本体(Ontology)构建方法论及智能体应用的保障机制
人工智能·智能体·语义本体
fogota1 小时前
【脑洞】NaiveMind 初生自主认知人工智能
人工智能
AI视频工具指南2 小时前
一个人能做 AI 短剧吗?实际要做哪些决定
人工智能·aigc·音视频·1024程序员节