检测手掌上下左右运动)
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本指南围绕 AI for Beginners 课程「Introduction to Computer Vision」一节的实验任务展开讲解如何利用稠密光流Dense Optical Flow判定一段视频中手掌在静止背景下的上 / 下 / 左 / 右移动方向。读完本文后你将掌握从视频逐帧取图、计算光流、转换极坐标、构建方向直方图到输出运动方向判定的完整实战流程并了解如何用肤色信息进一步跟踪手掌 / 指尖。实验任务与目标本实验对应的任务说明位于课程仓库的 英文原版官方译本见 孟加拉语版以英文原版为权威。实验数据为一小段视频 palm-movement.mp4画面中人物的手掌在稳定背景上向左 / 右 / 上 / 下移动。核心目标利用光流法确定视频中哪些片段包含向上、向下、向左、向右的运动。拓展目标Stretch Goal使用肤色skin tone信息实际跟踪手掌或手指的运动可参考公开的基于 OpenCV Python 的手指检测与跟踪方法。开始方式打开实验起始 Notebook MovementDetection.ipynb从读取视频帧开始逐步完成。技术原理光流是什么在正式编码前先明确实验背后的原理。课程讲义 06-IntroCV README 指出单纯比较相邻两帧可以知道画面“变了多少”但无法知道“什么东西在往哪个方向移动”。要获得每个像素的移动信息需要使用**光流Optical Flow**技术。光流分为两种稠密光流Dense Optical Flow为每个像素计算一个运动向量得到整帧的矢量场说明每个像素正在移向何处稀疏光流Sparse Optical Flow选取图像中的显著特征点如边缘逐帧构建这些特征的轨迹。本实验使用的是稠密光流。讲义中的配套 Notebook OpenCV.ipynb 给出了完整示例是完成本实验的核心参考它先用cv2.VideoCapture逐帧读取视频再将彩色帧转灰度、计算帧差与稠密光流最后把光流转成极坐标并用 HSV 色彩空间可视化。讲义 OpenCV.ipynb 中稠密光流的 HSV 可视化色相表示方向亮度表示运动强度。实验前置准备开始前需要确认实验环境具备OpenCVcv2完成实验全部图像 / 视频处理NumPy以数组形式表示图像与光流矢量场Matplotlib绘制方向直方图与中间结果可选的imageio/ ffmpeg 用于其他格式的视频转换本实验视频已提供。仓库在 binder/requirements.txt 中维护了可复现的依赖清单课程还提供 environment.yml 便于搭建环境。第一步读取视频帧实验起始 Notebook 的第一步是“按讲义所述获取视频帧”。讲义 OpenCV.ipynb 中的做法如下import cv2 import numpy as np import matplotlib.pyplot as plt vid cv2.VideoCapture(palm-movement.mp4) # 实验室视频lessons/4-ComputerVision/06-IntroCV/lab/palm-movement.mp4 frames [] while vid.isOpened(): ret, frame vid.read() if not ret: break frames.append(frame) vid.release() print(fTotal frames: {len(frames)})之后由于颜色对运动检测并不关键将全部帧转为灰度并计算相邻帧差用以观察画面中活动的强弱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])帧差振幅曲线可以告诉你“什么时候有动作”但正如讲义强调的它无法回答“往哪个方向动”——这正是光流要解决的。第二步计算稠密光流对相邻的灰度帧两两计算稠密光流得到与帧同尺寸、带 2 个通道x 分量与 y 分量的流场flows [ cv2.calcOpticalFlowFarneback(f1, f2, None, 0.5, 3, 15, 3, 5, 1.2, 0) for f1, f2 in zip(bwframes[:-1], bwframes[1:]) ]cv2.calcOpticalFlowFarneback的参数在讲义 Notebook 中即为上述取值含义如下参数取值作用prev/next相邻灰度帧计算两帧间运动pyr_scale0.5金字塔缩放因子经典 0.5levels3金字塔层数winsize15平均窗口尺寸越大越抗噪但平滑细节iterations3每层迭代次数poly_n5多项式邻域尺寸poly_sigma1.2高斯标准差flags0附加标志0 表示初始流为 0每个流场形状为(height, width, 2)第 0 通道是 x 方向分量第 1 通道是 y 方向分量。第三步光流转极坐标方向信息从直角分量中不易直接读取。讲义给出一个巧妙思路将光流转换到极坐标得到每个像素的两个量——方向angle与幅度magnitudemag, ang cv2.cartToPolar(flow[..., 0], flow[..., 1])ang是运动方向角弧度可直接映射到上 / 下 / 左 / 右mag是运动强度可用来过滤静止或微小抖动。可视化时讲义把方向映射为色相、强度映射为亮度构造 HSV 图像再转回 BGR 显示def flow_to_hsv(flow): hsv_img np.zeros((flow.shape[0], flow.shape[1], 3), dtypenp.uint8) mag, ang cv2.cartToPolar(flow[..., 0], flow[..., 1]) hsv_img[..., 0] 0.5 * ang * 180 / np.pi # 色相由方向决定 hsv_img[..., 1] 255 # 饱和度固定 hsv_img[..., 2] cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX) return cv2.cvtColor(hsv_img, cv2.COLOR_HSV2BGR)讲义示例中绿色调对应向左移动蓝色调对应向右移动。这样的可视化也适用于判断相机是否整体运动如果整帧像素大致朝同一方向移动可推断存在相机移动并尝试补偿。第四步构建方向直方图这是实验的核心判定步骤起始 Notebook 的指导如下对每一个光流帧构建方向直方图——统计落在各个方向区间bin中的向量数量直方图应当能把画面中不同方向的运动区分开来幅度阈值过滤把所有幅度低于某一阈值的向量清零以去除视频中的细小额外运动例如眼睛、头部的小幅晃动绘制若干帧的直方图进行观察。对应实现可写为def direction_histogram(flow, num_bins8, magnitude_threshold1.0): mag, ang cv2.cartToPolar(flow[..., 0], flow[..., 1]) ang_deg ang * 180 / np.pi # 转为角度 mask mag magnitude_threshold # 幅度过滤 return np.histogram(ang_deg[mask], binsnum_bins, range(0, 360))[0] # 对若干光流帧绘制直方图 for i in range(0, len(flows), 25): hist direction_histogram(flows[i]) plt.plot(hist)第五步判定运动方向起始 Notebook 明确指出观察直方图后判定方向的方法是——选出对应上 / 下 / 左 / 右方向的那些 bin并且其计数高于某个阈值。例如将 360° 划分为 8 个 bin每个 bin 覆盖 45°右侧方向集中在 0°与 360°附近左侧在 180° 附近上方在 90° 附近以图像坐标系为准可再调整若某一帧在右侧区间 bin 的计数显著超过阈值则该片段判定为“向右运动”依此类推即可标注整个视频中哪些片段包含上 / 下 / 左 / 右移动。通过逐一帧或逐片段的直方图分析就能完成实验核心目标定位视频中包含各方向运动的部分。实验中的演示画面如下实验视频中的一帧手掌在稳定背景上移动为光流提供了清晰的运动对象。拓展目标基于肤色的手掌 / 指尖跟踪完成光流判定后可选做拓展目标用肤色跟踪手掌或手指。思路是将帧转换到 HSV 等对肤色更友好的色彩空间讲义中cv2.cvtColor支持 BGR→HSV 等各类转换依据肤色在色相 / 饱和度区间内设定阈值用cv2.threshold/cv2.adaptiveThreshold得到肤色二值掩膜讲义也演示了阈值化在预处理中的用法在掩膜上做轮廓提取或特征检测如 ORB 等讲义 Notebook 对特征点提取有示例跟踪手掌中心或指尖位置。肤色跟踪与光流结合可以同时得到“哪里有手”和“手往哪个方向动”的完整信息。实验要点与收获Takeaway本实验的核心收获是像运动检测、指尖检测这类相对复杂的任务有时仅凭计算机视觉技术本身就能解决。因此熟悉 OpenCV 这类库能做什么、怎么做非常有用——本实验正是“纯视觉方案解决运动方向判定”的典型范例。深入阅读课程讲义lessons/4-ComputerVision/06-IntroCV/README.md包含图像加载、BGR/RGB、阈值化、几何变换与光流等背景知识讲义配套 Notebooklessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb给出帧差、calcOpticalFlowFarneback、cartToPolar与 HSV 可视化的可直接运行代码实验起始 Notebooklessons/4-ComputerVision/06-IntroCV/lab/MovementDetection.ipynb按“取帧 → 稠密光流 → 极坐标 → 方向直方图 → 阈值判定”组织的待完成骨架实验任务原文lessons/4-ComputerVision/06-IntroCV/lab/README.md。以上内容均可在当前仓库中直接查看与运行帮助你完整走通“视频 → 光流 → 方向判定”的整条实验链路。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI for Beginners 课程实战用 OpenCV 入门计算机视觉——图像预处理、视频运动检测与光学流AI for Beginners 课程实战用 OpenCV 入门计算机视觉——图像预处理、视频运动检测与光学流 导读 计算机视觉Computer Visio教程人工智能机器学习深度学习计算机视觉入门与 OpenCV 实战图像预处理、运动检测与光流分析AI for Beginners 第 06 课计算机视觉入门与 OpenCV 实战图像预处理、运动检测与光流分析AI for Beginners 第 06 课 导读本文基于 AI for Begin教程人工智能机器学习深度学习计算机视觉入门实战AI-For-Beginners 课程第 6 课 OpenCV 图像处理与运动检测指南计算机视觉入门实战AI For Beginners 课程第 6 课 OpenCV 图像处理与运动检测指南 计算机视觉是让计算机看懂数字图像的技术分支而本教程人工智能机器学习深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考