使用光流检测手掌运动方向:AI-For-Beginners 课程 OpenCV 实验指南
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载导读本篇文章围绕 AI-For-Beginners 课程第 06 课《计算机视觉入门》中的实验任务展开利用 OpenCV 的**稠密光流Dense Optical Flow**技术从一段手掌在稳定背景上左右上下移动的视频palm-movement.mp4中自动判定视频各部分发生了哪个方向的运动。读完本文后你将掌握视频帧提取、cv2.calcOpticalFlowFarneback稠密光流计算、极坐标转换与方向直方图分析这一完整方案并能复刻仓库中 MovementDetection.ipynb 的全部实验步骤。上图为实验视频中的一个关键帧原图出自 OpenCV 实验讲义视频与图片均位于实验目录中可以看到手掌动作发生在稳定背景之上——这正是光流算法发挥作用的最佳场景。实验目标与素材本实验源自 AI for Beginners 课程 定义任务非常明确核心目标使用光流技术确定视频中哪些部分包含上up、下down、左left、右right四个方向的运动。进阶目标Stretch Goal进一步结合**肤色skin tone**对掌/手指进行实际跟踪可参考 OpenCV Python 的指尖检测实现。实验素材输入视频palm-movement.mp4人物手掌在稳定背景上做左右上下运动起始 NotebookMovementDetection.ipynb预备知识什么是光流在动手之前先明确光流Optical Flow的核心思想。讲义 OpenCV.ipynb 中指出仅对比相邻两帧可以知道画面变化的量但无法得知画面中是什么在动、往哪里动。光流正是用来回答这两个问题的技术它分为两类稠密光流Dense Optical Flow为每一个像素计算一个运动向量形成向量场告诉我们在每个像素位置画面正朝哪个方向移动。稀疏光流Sparse Optical Flow基于图像中一些显著特征如边缘、角点逐帧追踪这些特征的轨迹。本实验采用的是稠密光流因为我们需要从全局判断哪部分画面发生了哪种方向的手掌运动。第一步读取视频并提取帧实验 Notebook 的第一步要求是按照讲义中描述的方法获取视频帧。讲义给出了完整的实现思路OpenCV 可以直接逐帧读取视频得到一个 NumPy 数组列表每个元素是一帧图像。import cv2 import matplotlib.pyplot as plt import numpy as np # 逐帧读取视频保存到 frames 列表 frames [] vid cv2.VideoCapture(palm-movement.mp4) c 0 while True: ok, fr vid.read() if not ok: break frames.append(fr) c 1 vid.release() print(fTotal frames: {c})注意事项色彩空间OpenCV 出于历史原因以BGR顺序读取彩色图像而 Matplotlib 使用传统的RGB顺序。因此无论是显示单帧还是后续可视化都应立即转换im cv2.cvtColor(frames[0], cv2.COLOR_BGR2RGB) plt.imshow(im)这一细节在 OpenCV.ipynb 中有明确说明如果跳过转换显示出的颜色会不正确。第二步计算稠密光流帧读取到所有帧之后实验要求按照讲义中的方法计算稠密光流帧。讲义中给出的核心调用是flows [cv2.calcOpticalFlowFarneback(f1, f2, None, 0.5, 3, 15, 3, 5, 1.2, 0) for f1, f2 in zip(bwframes[:-1], bwframes[1:])] flows[0].shape # 例如输出 (180, 320, 2)其中f1, f2前后两帧的灰度图cv2.COLOR_BGR2GRAY转换光流算法基于灰度计算。pyr_scale 0.5构建图像金字塔时的缩放比例标准值为 0.5。levels 3金字塔层数。winsize 15平均窗口大小决定每个像素邻域范围。iterations 3每层金字塔上迭代求解次数。poly_n 5用于估计多项式展开的邻域像素尺寸。poly_sigma 1.2平滑多项式展开导数的标准差。flags 0算法标志0 表示使用默认计算模式。从输出形状(180, 320, 2)可以看出每个光流帧的尺寸与视频帧相同且带 2 个通道分别对应光流向量的x水平和y垂直分量。这正是后续极坐标转换的数据基础。第三步将光流转换为极坐标并可视化二维光流向量并不直观。讲义介绍了一个巧妙的思路将光流向量从直角坐标x, y转换为极坐标从而得到每个像素的两个新分量方向direction / angle向量与水平方向的夹角。强度intensity / magnitude向量的长度即运动的剧烈程度。对应 OpenCV 函数为cv2.cartToPolar讲义中的参考实现如下def flow_to_hsv(flow): hsvImg np.zeros((flow.shape[0], flow.shape[1], 3), dtypenp.uint8) mag, ang cv2.cartToPolar(flow[..., 0], flow[..., 1]) hsvImg[..., 0] 0.5 * ang * 180 / np.pi # 色相 方向 hsvImg[..., 1] 255 # 饱和度固定为 255 hsvImg[..., 2] cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX) # 亮度 强度 return cv2.cvtColor(hsvImg, cv2.COLOR_HSV2BGR)这段代码把光流可视化到HSV 色彩空间用色相表示运动方向、用亮度表示运动强度。讲义明确指出在示例输出中绿色调对应向左移动蓝色调对应向右移动。一个值得注意的推论当一帧中几乎所有像素都朝同一方向运动时通常意味着发生了相机移动——利用光流可以检测并尝试补偿相机运动这正是光流在实际视觉系统中的典型用途。第四步构建运动方向直方图可视化之后实验进入核心判断环节为每一个光流帧构建方向直方图。直方图统计落在各个方向区间bin内的向量个数从而把大量像素各自朝什么方向运动这一信息浓缩成可读的分布对每个像素根据极坐标中的角度ang判定其方向所属的直方图区间。关键优化将所有幅值magnitude低于某阈值的向量清零。实验说明特别指出这一步可以滤除视频中的微小额外运动例如眼睛和头部的轻微晃动只保留手掌这类显著运动。对部分帧绘制方向直方图进行观察。判断逻辑因此变得非常简单直方图中对应于上/下/左/右方向的区间如果明显高于某阈值即可断定该时间段发生了该方向的运动。第五步判定上下左右运动方向完成直方图分析后实验要求的收尾步骤是选择与上、下、左、右四个方向对应、且计数超过设定阈值的直方图区间据此对每个时间段作出方向判定。这本质上是将图像级的光流向量场压缩为时间级的简单运动标签也是本实验与更复杂的动作识别方案之间最直观的区别——一些相对复杂的问题可以仅靠经典计算机视觉解决而不必立即引入神经网络。补充帧差法与事件区间提取在 OpenCV.ipynb 中讲义还提供了与确定哪些帧发生了运动密切相关的配套技术——帧差法可作为判定方向前的预处理参考bwframes [cv2.cvtColor(x, cv2.COLOR_BGR2GRAY) for x in frames] diffs [(p2 - p1) for p1, p2 in zip(bwframes[:-1], bwframes[1:])] diff_amps np.array([np.linalg.norm(x) for x in diffs])当相机固定时相邻帧几乎相同像素差很小一旦画面中出现显著运动帧差幅度会迅速升高。讲义进一步用滑动平均平滑该曲线、设定阈值并提取连续事件区间def moving_average(x, w): return np.convolve(x, np.ones(w), valid) / w threshold 13000 active_frames np.where(diff_amps threshold)[0] def subsequence(seq, min_length30): ss [] for i, x in enumerate(seq[:-1]): ss.append(x) if x 1 ! seq[i 1]: if len(ss) min_length: return ss ss.clear() sub subsequence(active_frames)得到事件帧区间sub后选取区间中间帧即可作为该事件的代表画面frames[(sub[0] sub[-1]) // 2]。这种定位事件区间 → 抽取代表帧的思路与本实验定位运动方向区间 → 打标签的流程异曲同工。进阶目标基于肤色的手指跟踪完成光流方向判定后实验给出可选进阶方向利用肤色skin tone对掌/手指进行实际跟踪。基本思路是先用颜色空间如 HSV将肤色像素从背景中分离再结合轮廓与几何分析定位手指位置从而在方向判定之上进一步获得空间位置信息。这一部分属于开放拓展适合学有余力的读者自行查阅 OpenCV 肤色分割与指尖检测相关实现。实验要点总结**复杂问题可以只用计算机视觉解决**是本次实验最重要的启示运动检测、指尖检测这类看似复杂的任务通过光流、阈值、直方图等经典手段即可实现。掌握cv2.calcOpticalFlowFarneback稠密光流、cv2.cartToPolar极坐标转换、HSV 可视化色相方向、亮度强度三大工具是完成本实验的关键。直方图加阈值是判定方向的高性价比方案帧差法加滑动平均则是定位何时发生运动的配套手段。熟悉 OpenCV 能做什么往往意味着很多传统视觉任务不必等待复杂模型即可落地。相关资源完整可运行的实验骨架在 MovementDetection.ipynb全部算法示例与可视化代码在 OpenCV.ipynb课程讲义见 06-IntroCV README。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐使用 OpenCV 光流法检测手掌运动AI-For-Beginners 计算机视觉实验指南使用 OpenCV 光流法检测手掌运动AI For Beginners 计算机视觉实验指南 本文是 AI For Beginners 课程计算机视觉导论0教程人工智能机器学习深度学习AI-For-Beginners 计算机视觉实验基于 OpenCV 光流的手掌运动方向检测AI For Beginners 计算机视觉实验基于 OpenCV 光流的手掌运动方向检测 本文基于 AI For Beginners 课程Introduc教程人工智能机器学习深度学习基于 OpenCV 光流实现视频运动方向检测 —— AI-For-Beginners 第 6 课实验室实战指南基于 OpenCV 光流实现视频运动方向检测 —— AI For Beginners 第 6 课实验室实战指南 导读 本指南围绕《AI for Beginner教程人工智能机器学习深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

MySQL建库报Access denied?root@%与root@localhost权限差异全解析

MySQL建库报Access denied?root@%与root@localhost权限差异全解析

简介:这份PDF文档面向MySQL数据库开发与运维人员,尤其是刚接触权限管理、在创建数据库后遭遇连接报错的初学者,针对「Access denied for user root% to database xxx」这一高频错误提供完整排查与解决思路。资源包共1个PDF文件,大…

2026/10/11 21:52:41 阅读更多 →
编译原理实战:从词法分析到小编译器的核心机制与避坑指南

编译原理实战:从词法分析到小编译器的核心机制与避坑指南

简介:编译原理是计算机专业核心课程,主要研究高级语言到机器指令的转换过程,涉及词法分析、语法分析、语义分析、运行时环境、中间代码生成与优化等复杂算法,也是考研常见的重点内容。这份学习指导面向正在学习编译原理的本科生、…

2026/10/11 21:52:41 阅读更多 →
光伏电站运维智能监测与能源管理系统的综合应用

光伏电站运维智能监测与能源管理系统的综合应用

光伏电站运维智能监测与能源管理系统的综合应用,为实现高效管理和优化发电效果提供了重要支持。智能监测系统能够实时收集设备运行和环境数据,运维人员可以持续跟踪设备状态,及时发现潜在问题。通过数据分析,运维团队能够评估设备…

2026/10/11 21:51:40 阅读更多 →

最新新闻

Jenkins 2.346.1 内网离线安装插件:依赖解析与版本匹配实战

Jenkins 2.346.1 内网离线安装插件:依赖解析与版本匹配实战

简介:本资源面向在内网、隔离网等无外网环境中部署Jenkins的运维与DevOps工程师,针对Jenkins 2.346.1无法在线拉取插件的问题,提供一套完整的离线插件安装方案。压缩包共约2000个文件,整体314.4MB,涵盖90个jpi与30个hp…

2026/10/12 2:05:08 阅读更多 →
PgDog 配置 crate 的文档注释规范:一份注释同时驱动 Rustdoc 与 JSON Schema

PgDog 配置 crate 的文档注释规范:一份注释同时驱动 Rustdoc 与 JSON Schema

数据库后端 【免费下载链接】pgdog PostgreSQL connection pooler, load balancer and database sharder. 项目地址: https://gitcode.com/gh_mirrors/pg/pgdog 点击查看 免费下载 PgDog 是一个用 Rust 编写的 PostgreSQL 连接池、负载均衡与分库分表中间件&#x…

2026/10/12 2:05:08 阅读更多 →
Learn to Cloud 阶段一:SSH 安全远程接入云端虚拟机——从密钥原理到三大云厂商实操

Learn to Cloud 阶段一:SSH 安全远程接入云端虚拟机——从密钥原理到三大云厂商实操

教程云原生 【免费下载链接】learn-to-cloud A courseware built on the belief that anyone can learn foundational cloud engineering skills with the right guide and discipline 项目地址: https://gitcode.com/gh_mirrors/le/learn-to-cloud 点击查看 免费下…

2026/10/12 2:05:08 阅读更多 →
DeepSeek职场赋能实战:四段式提示词模板与工作流嵌入指南

DeepSeek职场赋能实战:四段式提示词模板与工作流嵌入指南

简介:这份PDF资料是清华大学DeepSeek系列讲座第二讲,共35页,面向希望将大模型落地于职场场景的技术人员、产品经理与管理者。内容围绕DeepSeek职场赋能展开,提出Organization、Innovator、Reasoner、Chatbot四层应用框架&#xff…

2026/10/12 2:05:08 阅读更多 →
Tendermint 协议缓冲定义指南:proto 目录架构、更新流程与版本治理

Tendermint 协议缓冲定义指南:proto 目录架构、更新流程与版本治理

区块链共识算法 【免费下载链接】tendermint ⟁ Tendermint Core (BFT Consensus) in Go 项目地址: https://gitcode.com/gh_mirrors/te/tendermint 点击查看 免费下载 导读 本指南以 Tendermint 仓库中 proto/README.md 为主体,系统讲解 proto/ 目录在…

2026/10/12 2:05:08 阅读更多 →
docker-alpine 的 rootfs 构建器(builder)全解析:mkimage-alpine.bash 选项与最小化镜像构建实战

docker-alpine 的 rootfs 构建器(builder)全解析:mkimage-alpine.bash 选项与最小化镜像构建实战

云原生运维 【免费下载链接】docker-alpine Alpine Linux Docker image. Win at minimalism! 项目地址: https://gitcode.com/gh_mirrors/do/docker-alpine 点击查看 免费下载 本篇技术指南围绕 docker-alpine 仓库中的 builder/README.md 展开,深入讲解…

2026/10/12 2:04:08 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →