计算机视觉入门实战:AI-For-Beginners 课程第 6 课 OpenCV 图像处理与运动检测指南 教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载计算机视觉是让计算机看懂数字图像的技术分支而本课聚焦于其中最关键的一环——在把图像交给神经网络之前如何用 OpenCV 等经典图像处理技术完成增强、分割与运动检测。本文以 AI-For-Beginners 课程 第 6 课《Introduction to Computer Vision》含 孟加拉语译本为主线结合仓库内的 OpenCV.ipynb 与 实验室作业带你完整掌握图像加载、预处理、盲文符号切分、帧差法与光流法运动检测四大实战能力并理解它们与后续卷积神经网络课程之间的衔接关系。计算机视觉让计算机看懂图像计算机视觉Computer Vision是一门旨在让计算机对数字图像获得高层面理解high-level understanding的学科。这是一个相当宽泛的定义因为理解可以涵盖许多不同的事情在图片中找到某个物体——目标检测Object Detection理解画面中正在发生什么——事件检测Event Detection用文本描述一幅图片Image Captioning从二维图像重建三维场景3D Scene Reconstruction与人类图像相关的特殊任务年龄与情绪估计、人脸检测与身份识别、3D 姿态估计等其中最简单的一类任务就是图像分类Image Classification——判断一张图片整体属于哪个类别。计算机视觉通常被视为人工智能AI的一个分支。如今绝大多数计算机视觉任务都是借助神经网络解决的。课程在本节后续会专门讲解用于视觉任务的特殊神经网络类型——卷积神经网络CNN。但需要特别强调的是在把图像送入神经网络之前很多时候先用一些算法技术对图像做增强是明智的选择。这正是本课的核心价值所在——用经典图像处理手段减轻神经网络的工作量从而可以用更少的训练数据解决更复杂的问题。在课程结构上本课位于 lessons/4-ComputerVision 节的第 6 课与第 7 课卷积神经网络、第 8 课迁移学习等构成完整的计算机视觉知识链。图像处理的 Python 生态四大库选型在进入 OpenCV 之前课程先给出了 Python 生态中四个可用于图像处理的库它们各有侧重库定位与特点imageio用于读写不同图像格式支持 ffmpeg是把视频帧转成图片的实用工具PillowPIL功能更强支持形变morphing、调色板调整等图像操作OpenCV用 C 编写的强大图像处理库已成为图像处理的事实标准de facto standard提供便捷的 Python 接口dlibC 库实现大量机器学习算法含部分计算机视觉算法有 Python 接口可用于人脸与面部关键点检测等挑战性任务仓库的环境配置可以印证这些库的实际使用情况项目根目录 requirements.txt 与 binder/requirements.txt 中都固定了imageio2.35.0与pillow12.2.0两个版本。值得注意的是opencv-python并未列在根目录依赖清单中而课程笔记本直接import cv2因此本地运行笔记本时通常需要按环境单独安装 OpenCV例如pip install opencv-pythondlib 因其编译依赖较重也未出现在默认依赖中适合按需安装。OpenCV图像处理的事实标准OpenCV 是图像处理的事实标准内部包含大量用 C 实现的高效算法同时可以从 Python 直接调用。课程的教学目标并非系统教授 OpenCV 的全部 API而是通过具体示例展示什么时候能用它、怎么用。课程配套的 OpenCV.ipynb 就是围绕这一目标设计的实验笔记本。用 NumPy 数组表示与加载图像在 Python 中图像可以很方便地用 NumPy 数组表示。例如一张 320×200 像素的灰度图存储为一个 200×320 的数组同尺寸的彩色图形状为 200×320×33 对应 3 个颜色通道。加载图像的示例代码如下见 OpenCV.ipynb 第 3 单元实际读取的是data/braille.jpegimport cv2 import matplotlib.pyplot as plt im cv2.imread(data/braille.jpeg) print(im.shape) plt.imshow(im)必须记住的坑BGR 与 RGB由于历史原因OpenCV 读取彩色图像时使用的是BGR蓝-绿-红编码而 Python 生态中大多数工具如 matplotlib使用更常规的RGB红-绿-蓝顺序。如果直接plt.imshow(im)画面颜色会明显失真。要让图像显示正确需要把图像转换到 RGB 颜色空间——既可以在 NumPy 数组中交换维度也可以调用 OpenCV 函数im cv2.cvtColor(im, cv2.COLOR_BGR2RGB)同一个cvtColor函数还可以完成其他颜色空间转换例如转灰度图bw_im cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) print(bw_im.shape) plt.imshow(bw_im, cmapgray)也可以转换到 HSV色调-饱和度-明度颜色空间——这一转换在本课光流可视化中还会被用到。此外OpenCV 还能逐帧加载视频cv2.VideoCaptureOpenCV.ipynb 第 20 单元展示了完整的逐帧读取循环。预处理把图像整理成神经网络喜欢的样子在把图像送入神经网络之前通常需要做若干预处理步骤。课程总结了 OpenCV 在这一阶段最常用的几类操作图像缩放Resizingim cv2.resize(im, (320, 200), interpolationcv2.INTER_LANCZOS)INTER_LANCZOS是 Lanczos 插值常用于高质量缩小OpenCV 还提供INTER_NEAREST、INTER_LINEAR、INTER_CUBIC等插值方式分别对应最近邻、双线性和双三次可按精度与速度需求选择。图像模糊Blurringim cv2.medianBlur(im, 3) # 中值模糊核大小为 3 im cv2.GaussianBlur(im, (3, 3), 0) # 高斯模糊核 3×3标准差自动计算中值模糊对椒盐噪声抑制效果好高斯模糊则适合平滑细节、降低噪声为后续阈值化或特征提取做准备。亮度与对比度改变图像的亮度与对比度可以直接通过对 NumPy 数组做加减乘除完成。例如对每个像素做线性变换new_pixel alpha * pixel betaalpha控制对比度beta控制亮度。这也是纯 NumPy 数组操作能力的体现——图像在 Python 里本质上就是数组数组运算即图像运算。阈值化Thresholdingcv2.threshold(im, thresh, maxval, type) cv2.adaptiveThreshold(im, maxval, adaptiveMethod, thresholdType, blockSize, C)阈值化把像素按亮度分成两类前景/背景往往比直接调亮度对比度更受青睐。固定阈值用cv2.threshold光照不均的场景则用cv2.adaptiveThreshold按局部区域自适应计算阈值。在盲文处理实战中笔记本进一步使用了Otsu 算法cv2.THRESH_OTSU自动求取最优阈值把灰度图变成高质量二值图见下文实战案例。几何变换仿射变换与透视变换对图像施加几何变换时按已知的点对应关系可以分成两类仿射变换Affine Transformation当你需要同时组合旋转、缩放和倾斜且已知图像中三个点的源位置与目标位置时适用。仿射变换的数学性质是保持平行线仍然平行。透视变换Perspective Transformation当你已知图像中四个点的源位置与目标位置时适用。典型场景是用手机从某个角度拍摄一张矩形文档想要矫正得到文档本身的矩形图像。在 OpenCV 中透视矫正通常用cv2.findHomography计算单应矩阵再用cv2.warpPerspective完成重投影——盲文示例正是这样做的。光流Optical Flow光流用于理解图像内部视频帧之间的运动。它有两种形式稠密光流Dense Optical Flow为每个像素计算一个向量场指示该像素正移向何处稀疏光流Sparse Optical Flow先取图像中的显著特征如边缘再逐帧追踪这些特征的轨迹。实战案例三个可复现的 OpenCV 应用课程在 OpenCV.ipynb 中给出了三个完整案例全部基于仓库内真实数据data/braille.jpeg、data/motionvideo.mp4可逐单元运行复现。案例 1盲文图书照片的预处理目标是把盲文图书的照片处理成一个个独立的盲文符号为后续神经网络分类做准备。完整流水线如下加载并灰度化读取data/braille.jpeg用cvtColor转灰度颜色对该任务无意义。阈值化流水线第 7 单元先用cv2.blur(bw_im, (3,3))做均值模糊再用cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 5, 4)做局部自适应二值化随后cv2.medianBlur(im, 3)去噪接着用两次Otsu 阈值 高斯模糊组合cv2.threshold(im, 0, 255, cv2.THRESH_OTSU)、cv2.GaussianBlur(im, (3,3), 0)再 Otsu把图像打磨成干净的黑白图。特征提取第 9 单元用 ORB 检测器cv2.ORB_create(5000)提取最多 5000 个关键点orb.detectAndCompute(im, None)得到点的坐标集合——也就是把图像压缩成一组圆点坐标方便后续切分。包围盒计算第 13 单元对全部点的坐标求min/max得到文本整体的边界框据此裁出有效区域。透视矫正第 15 单元以边界框四个角点各外扩off5像素作为源点以与文本尺寸成比例的目标矩形作为目标点用cv2.findHomography求单应矩阵、cv2.warpPerspective完成矫正使可能倾斜的文本变成规整矩形。符号切分第 17 单元按固定字符窗char_h36、char_w24滑动切片跳过全空白区域产出与 MNIST 样本形态相近的单个盲文符号图。相关图片孟加拉语译本见 translations/bn 对应段落这个案例的启示很关键相当多的任务可以纯靠图像处理完成不依赖任何人工智能模型。能用计算机视觉技术降低神经网络工作难度时就应该用——因为这意味着可以用更少的训练数据解决问题。这与第 18 课之前讨论 MNIST 分类任务时让网络输入更规整的思路一脉相承。案例 2帧差法Frame Difference运动检测如果摄像头固定不动视频帧之间应该非常相似。由于帧就是数组把相邻两帧的数组相减即可得到像素差异静止画面差异很小画面中出现明显运动时差异急剧增大。OpenCV.ipynb 第 20–28 单元实现了完整流程逐帧读取vid cv2.VideoCapture(data/motionvideo.mp4)循环vid.read()收集全部帧共 400 帧按frames[::150]抽样显示灰度化把每帧转成灰度cv2.cvtColor(x, cv2.COLOR_BGR2GRAY)颜色对运动检测不重要计算帧差diffs [p2 - p1 for p1, p2 in zip(bwframes[:-1], bwframes[1:])]衡量活动量用np.linalg.norm(x)求每帧差异的范数得到diff_amps绘制曲线即可直观看到活动强度随时间的变化平滑与阈值用窗口为 10 的移动平均np.convolve(x, np.ones(w), valid) / w平滑曲线去噪并以threshold 13000作为活动判据提取事件区间np.where(diff_amps threshold)找出超阈值的帧再提取长度超过 30 帧的连续子序列subsequence(seq, min_length30)即可定位事件起止展示代表帧显示事件区间中间帧frames[(sub[0]sub[-1])//2]就能生成类似监控摘要的报告。active_frames np.where(diff_amps threshold)[0] sub subsequence(active_frames) # 长度超过 30 帧的连续活动段 plt.imshow(frames[(sub[0] sub[-1]) // 2])需要注意直接用 matplotlib 显示 OpenCV 读出的彩色帧颜色会不对——这正是前面提到的 BGR/RGB 问题。惯例做法是加载后立即cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)转换。图中的视频帧与帧差说明上方为抽样帧下方为对应帧差图像静止段落帧差几乎全黑运动段落帧差亮斑明显。案例 3光流法Optical Flow运动检测帧差法只能告诉我们变化有多少无法回答什么东西在动、往哪动。要回答后者需要使用光流。第 32–35 单元给出了稠密光流的完整用法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 # 形状为 (帧高, 帧宽, 2)calcOpticalFlowFarneback的核心参数含义pyr_scale0.5金字塔缩放比例、levels3金字塔层数、winsize15平均窗口大小、iterations3每层迭代次数、poly_n5多项式邻域大小、poly_sigma1.2高斯标准差、flags0。每个帧对应的光流结果形状与帧相同但多出 2 个通道分别对应光流向量的 x、y 分量。二维光流可视化比较困难笔记本用了一个巧妙办法把光流转成极坐标得到每个像素的方向与强度两个分量然后用HSV 颜色空间编码——色相Hue表示方向、明度Value表示强度、饱和度Saturation固定为 255def 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 hsvImg[..., 2] cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX) return cv2.cvtColor(hsvImg, cv2.COLOR_HSV2BGR)在示例视频中绿色调对应向左移动蓝色调对应向右移动。光流的价值在于可以推断整体运动趋势例如发现某一帧几乎所有像素都朝大致相同的方向移动就可以判断是摄像机在运动并据此尝试做运动补偿。动手实验与课后作业实验笔记本OpenCV in Action建议直接打开 OpenCV.ipynb 按单元顺序运行亲手验证上述三个案例——每个案例都配套真实数据文件盲文图 data/braille.jpeg、监控视频 data/motionvideo.mp4无需额外下载。作业用光流检测手掌移动方向课后作业的完整说明见 lab/README.md配套起始笔记本为 lab/MovementDetection.ipynb。任务仓库提供了 palm-movement.mp4 视频——一个人在稳定背景上把手掌分别向左/右/上/下移动。你的目标是用光流判定视频的哪些段落对应上/下/左/右运动。笔记本给出的解题路径清晰分为四步按课程方法读取视频帧计算稠密光流并把光流转换为极坐标对每一帧光流构建方向直方图——统计落入每个方向区间的向量数量不同运动方向会在直方图中明显分离提示可以把模长低于某个阈值的向量置零以剔除视频中眼睛、头部等微小多余运动带来的干扰观察直方图选出与上/下/左/右对应的、且超过一定计数阈值的方向区间即可判定该帧的运动方向。进阶目标Stretch Goal进一步尝试用肤色信息skin tone真正跟踪手掌/手指的运动轨迹。结论有时运动检测、指尖检测这类看起来相当复杂的任务仅凭计算机视觉就能解决。因此掌握计算机视觉的基础技术、了解 OpenCV 这类库能做什么、能怎样做是构建完整 AI 能力中极具性价比的一环——它既是后续 卷积神经网络 课程的前置净化器也是许多低成本视觉方案监控、手势交互、文档矫正的直接实现手段。课程还提供了两条延伸路径供学有余力的读者探索一是挑战环节调研类似 Cortic Tigers 那样用机器人 图形化积木编程把计算机视觉任务民主化、帮助初学者入门的一类项目二是自学环节深入研读光流算法的专题教程进一步理解稠密与稀疏光流的适用场景。预习与课后测验随课程配套提供可在学完本章后自测掌握程度。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐计算机视觉入门与 OpenCV 实战图像预处理、运动检测与光流分析AI for Beginners 第 06 课计算机视觉入门与 OpenCV 实战图像预处理、运动检测与光流分析AI for Beginners 第 06 课 导读本文基于 AI for Begin教程人工智能机器学习深度学习AI-For-Beginners 计算机视觉课程全指南从 OpenCV 图像处理到 CNN、迁移学习与生成模型AI For Beginners 计算机视觉课程全指南从 OpenCV 图像处理到 CNN、迁移学习与生成模型 本指南系统梳理 AI For Beginner教程人工智能机器学习深度学习计算机视觉入门教程p1xt-guides OpenCV图像处理实战计算机视觉入门教程p1xt guides OpenCV图像处理实战 引言 计算机视觉Computer Vision是人工智能领域的重要分支它让计算机能够教程文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考