LK 博客
Opencv学习
大数据
约 1 分钟阅读 0 赞 0 条评论 鸿蒙黑体

Opencv学习

zyd
zyd @zyd
累计点赞 0 登录后每个账号只能点一次
内容长度 0 正文词元数
正文
目录会跟随阅读位置移动。
阅读进度

从显示图片到实时追踪:用一组练习脚本学会 OpenCV

如果你刚开始接触 OpenCV,最容易遇到的问题不是 API 太难,而是不知道该先学什么、后学什么。网上教程往往一上来就讲一堆函数,读完以后还是很难把知识连成一条线。
这篇文章就不走“照着文档念”的路线,而是直接基于当前目录里的练习脚本,按照一个初学者最容易上手的顺序,把 OpenCV 的核心能力串起来:从 NumPy 数组、图像显示、摄像头读取,到颜色识别、形状检测,再到简单的人脸追踪。

这组代码最大的价值,不是“做了一个完整项目”,而是它已经覆盖了计算机视觉入门最常见的几个动作:

  • 读图和显示图像
  • 打开摄像头并实时处理画面
  • 监听鼠标和滑动条交互
  • 在图像上绘制文字、圆和线
  • 做缩放、翻转、旋转等基础变换
  • 从 BGR 转到 HSV 做颜色分割
  • 通过轮廓检测找到目标位置
  • 使用 Haar 分类器做基础人脸追踪

如果你能把这一套小脚本真正吃透,后面再去做目标检测、机械臂视觉定位、自动点击、视频分析,就会轻松很多。

一、学 OpenCV 之前,先理解图像本质上是数组

对应文件:numpy_demo.py

很多人一上来就直接写 cv2.imread(),但如果不知道图像在内存里到底是什么,后面做像素处理会非常吃力。
实际上,在 OpenCV 里,一张图片本质上就是一个 NumPy 数组。

比如这份脚本里有几种很典型的数组创建方式:

import numpy as np

b = np.zeros((480, 640, 3), np.uint8)
c = np.ones((480, 640, 3), np.uint8)
d = np.full((8, 8, 3), 255, np.uint8)

这里有几个关键点必须建立起来:

  • (480, 640, 3) 表示高 480、宽 640、3 个通道
  • np.uint8 表示像素值范围通常是 0~255
  • 三通道一般对应 BGR,而不是很多新手以为的 RGB

也就是说:

  • 全 0 的数组通常显示成黑色
  • 全 255 的数组通常显示成白色
  • 你直接改数组里的值,本质上就是在改图像内容

这也是为什么 OpenCV 学到后面,几乎一定会和 NumPy 一起用。
你可以把 NumPy 理解成“图像的数据底座”,而 OpenCV 更像是“对这些数据做视觉处理的工具箱”。

二、第一步先学会显示图片

对应文件:显示图片.py

任何视觉程序都绕不开“把结果显示出来”这一步。这个脚本演示了最基础的图像读取和显示流程:

cv2.namedWindow("new", 0)
img = cv2.imread("/home/zyd/文档/cv/FDCLBlock_流程图.png", 1)
cv2.imshow("new", img * 2)
cv2.waitKey(0)

这里最值得初学者记住的是四件事:

  1. cv2.imread() 用来读取图片。
  2. cv2.imshow() 用来显示图片。
  3. cv2.waitKey() 不只是“暂停程序”,它还负责让窗口真正响应显示。
  4. 图像数组可以直接参与运算,比如 img * 2 会让画面整体变亮。

很多人第一次运行 OpenCV 程序会问:“为什么窗口一闪而过?”
原因通常就是少了 cv2.waitKey()

三、从静态图像走向实时画面:打开摄像头

对应文件:调摄像头.py

当你能读图片以后,下一步就应该进入实时视频流。因为很多实际项目不是处理一张固定图片,而是不断读取摄像头画面,再对每一帧做分析。

这份脚本的核心结构非常典型:

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    cv2.imshow("Camera", frame)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

这里可以把流程理解成一个固定模板:

  • cv2.VideoCapture(0) 打开默认摄像头
  • cap.read() 每次取出一帧
  • frame 就是当前这一帧图像数组
  • cv2.waitKey(1) 负责刷新窗口并监听退出按键

脚本里还有一行切片代码:

iod = frame[10:250, 10:500]

这一步非常重要,因为它说明图像可以像二维数组一样被裁剪。
也就是说,你完全可以只处理图像中的一部分区域,这在做感兴趣区域提取(ROI)时非常常见。

四、OpenCV 交互入门:鼠标事件和滑动条

对应文件:

  • 鼠标事件.py
  • TrackBar.py
  • 绘画板.py

很多新手会把 OpenCV 只看成“图像处理库”,其实它也提供了一些轻量交互能力,足够做调参、小工具和演示程序。

1. 鼠标事件

鼠标事件.pycv2.setMouseCallback() 给窗口绑定了回调函数:

def mouse_callback(event, x, y, flags, userdata):
    print(event, x, y, flags, userdata)

这意味着你点击、移动、拖拽鼠标时,OpenCV 都能把这些行为传回来。
在教学阶段,这类脚本特别适合用来理解:

  • 坐标系统是怎么定义的
  • 鼠标事件是如何触发的
  • 交互逻辑如何和图像处理结合

2. 滑动条

TrackBar.py 里用到了 cv2.createTrackbar()

cv2.createTrackbar("P", "new", 0, 255, calldack)

虽然这个脚本目前还没有把滑动条值真正用于图像处理,但它已经把“参数动态调节”的入口搭起来了。
在 OpenCV 学习里,滑动条经常被用来做这些事情:

  • 调阈值
  • 调颜色范围
  • 调亮度和对比度
  • 调形态学参数

3. 一个简单的绘画板

绘画板.py 把鼠标事件和滑动条结合到了一起。
它的思路很直观:先创建一张白色画布,再通过鼠标拖动去修改像素值。

这里的教学意义很强,因为它把三件事合并到了一个例子里:

  • NumPy 创建画布
  • OpenCV 监听输入
  • 通过像素修改实现“画图”

这种例子非常适合帮助初学者建立一个直觉:
“图像不是神秘的,它就是一块可以随时修改的数据画布。”

五、会处理还不够,还要会标注:画圆、画线、写文字

对应文件:

  • 绘制文本.py
  • 绘制圆形.py

在视觉项目里,检测结果如果不能画到图像上,调试会非常痛苦。
所以绘制能力不是“可有可无的装饰”,而是非常重要的反馈手段。

1. 在画面上写文字

绘制文本.py 用的是 cv2.putText()

cv2.putText(frame, "hell", (100, 100), 1, 1, (0, 0, 255), 2)

你可以在实时摄像头画面上叠加:

  • 状态信息
  • 坐标
  • 距离
  • 识别结果
  • 调试提示

这一步在后面的目标检测、人脸追踪里几乎一定会用到。

2. 找到目标后画圆和连线

绘制圆形.py 已经不只是“画一个图形”了,它实际上在做一个完整的小型视觉任务:

  1. 把摄像头画面转成 HSV
  2. 根据颜色范围提取黄色目标
  3. 用开运算和闭运算去噪
  4. 查找轮廓
  5. 用最小外接圆拟合目标
  6. 计算目标中心和参考点之间的距离
  7. 把结果画回图像

这一段非常接近真实项目流程,核心代码逻辑是:

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower_yellow, upper_yellow)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

然后再结合:

  • cv2.minEnclosingCircle() 找圆
  • cv2.circle() 画目标
  • cv2.line() 连接参考点和目标点
  • cv2.putText() 写出偏移量和距离

如果你是做机器人、机械臂或者自动对准任务,这个脚本其实已经具备很强的练习价值了。

六、图像基础操作:缩放、翻转、旋转

对应文件:

  • 图像的操作.py
  • 图片仿射变换.py

1. 常见基础操作

图像的操作.py 演示了三个最常见的图像操作:

  • cv2.resize() 缩放
  • cv2.flip() 翻转
  • cv2.rotate() 旋转

这些操作看起来简单,但它们在实际视觉系统里到处都会遇到。
比如:

  • 摄像头方向装反了,要翻转
  • 输入分辨率太大,要缩小后再处理
  • 某些图片采集角度固定偏转,要先旋转校正

2. 仿射变换

图片仿射变换.py 更进一步,展示了如何用变换矩阵控制图像:

M = cv2.getRotationMatrix2D((100, 100), 15, 0.3)
img1 = cv2.warpAffine(img, M, (w, h))

这段代码虽然短,但背后已经进入“几何变换”的范畴。
你可以把仿射变换理解成:在保持图像平面结构的前提下,做平移、旋转、缩放等操作。

后面如果你继续学:

  • 图像配准
  • 透视变换
  • 相机标定
  • 视觉定位

这些内容都会和矩阵变换有很强关系。

七、为什么做颜色识别时,经常要从 BGR 转到 HSV

对应文件:

  • 色彩空间转换.py
  • 提取截图蓝色.py

这是 OpenCV 入门里非常关键的一步。
很多新手会问:“明明图像已经是三通道了,为什么还要转换颜色空间?”
答案是:BGR 更适合存储和显示,但 HSV 更适合做颜色筛选。

原因很简单:

  • 在 BGR 里,颜色和亮度混在一起,不容易稳定阈值
  • 在 HSV 里,色相、饱和度、明度分开以后,更方便按颜色范围筛选目标

1. 实时颜色提取

色彩空间转换.py 的关键步骤就是:

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower_skin, upper_skin)

这里先把图像转成 HSV,再通过上下界范围取出目标区域。
虽然变量名里写的是 skin,但实际逻辑更接近“按颜色范围做区域提取”。

接着脚本还做了一件很有意思的事:
它通过检查像素上下左右邻域,去找出目标区域边缘,再把边缘点画出来。

这能帮助读者理解两件事:

  • 二值掩码 mask 是后续视觉分析的重要中间结果
  • 轮廓、边缘、区域这些概念,本质上都可以从像素关系里推出来

2. 把颜色识别用于自动定位

提取截图蓝色.py 的层次就更完整了。
它不是只在摄像头里做颜色提取,而是做了一条比较完整的自动化流程:

  1. 调系统截图工具抓取活动窗口和整屏
  2. 缩小图像以提高处理速度
  3. 在 HSV 空间里筛选蓝色区域
  4. 通过轮廓找到最大的蓝色目标
  5. 用模板匹配估计目标窗口在整屏中的位置
  6. 把窗口内坐标换算成屏幕绝对坐标

这段代码说明了一件非常重要的事:
OpenCV 不只是“识别”,它还可以和操作系统工具配合,进入自动化任务场景。

如果你以后想做:

  • 游戏辅助中的目标定位
  • 桌面自动点击
  • 工业软件界面识别
  • 屏幕元素检测

这样的思路就很值得继续往下延伸。

八、从颜色追踪走向目标追踪:人脸检测就是一个好入口

对应文件:人头追踪.py

这份脚本是当前目录里最像“完整教学案例”的一个。
它把参数解析、摄像头初始化、分类器加载、实时检测、结果绘制都组织得比较清楚,很适合拿来当入门阶段的小项目。

核心思路是:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(60, 60),
)

这里使用的是 OpenCV 自带的 Haar 级联分类器。
虽然它在精度和鲁棒性上比不上后来的深度学习检测器,但它对初学者有两个巨大优点:

  • 开箱即用,不需要训练模型
  • 非常适合理解“检测结果如何接入实时画面”

这个脚本后面还做了一个很好的教学动作:
它不仅画出了人脸位置,还计算了人脸中心和屏幕中心的偏移量 dxdy

这一步非常关键,因为它意味着程序已经不只是“看见人脸”,而是在为“控制”做准备。
如果你后面接舵机、云台、机械臂,这种“目标中心相对画面中心的偏差”就是最直接的控制输入。

九、把这些脚本串起来,你其实已经走完了一条完整的入门路径

如果只看文件名,这个目录像是一些零散练习;
但如果按知识顺序来看,它其实已经构成了一条非常完整的 OpenCV 入门路线:

  1. 用 NumPy 理解图像数据结构
  2. 读取和显示图片
  3. 打开摄像头处理实时画面
  4. 使用鼠标和滑动条做交互
  5. 在画面中绘制图形和文字
  6. 完成基础几何变换
  7. 通过 HSV 做颜色分割
  8. 用轮廓和外接圆定位目标
  9. 用分类器做基础人脸追踪

这条路线的优点在于,它不是纯理论,而是每一步都有能运行的代码。
对初学者来说,这种“边看边改边运行”的学习方式,通常比单纯背 API 高效得多。

十、如果想把这套代码继续升级,可以往哪几个方向走

如果你已经能读懂这组脚本,下一步很适合做下面几个升级练习:

  • TrackBar.py 真正改成 HSV 调参工具,动态调整颜色阈值
  • 绘画板.py 增加画笔粗细、清空画布、颜色切换功能
  • 绘制圆形.py 里的固定中心点改成自动目标跟踪控制量
  • 提取截图蓝色.py 真正接上点击逻辑和冷却时间控制
  • 人头追踪.py 增加串口输出,让它驱动外设跟随人脸移动

如果是教学视角,我会建议你重点练下面两件事:

  • 学会稳定地得到 mask
  • 学会把检测结果变成坐标、距离、偏移量

因为从“看见目标”到“让系统理解目标在哪里”,中间最关键的桥梁就是这两步。

十一、初学 OpenCV 最容易踩的坑

最后补几个非常常见的坑,也刚好对应这组代码里容易继续优化的地方:

  • cv2.waitKey() 不能少,否则窗口可能不刷新
  • 颜色阈值不要直接照搬,最好自己用滑动条调
  • 摄像头读取时要先判断 retframe 是否有效
  • 实时处理时尽量减少每帧里不必要的重复计算
  • 做颜色分割后,通常要配合形态学操作去噪
  • 想在工程里长期使用,尽量把“演示脚本”逐步整理成函数化结构

你会发现,OpenCV 真正难的地方往往不在某一个 API,而在于“如何把多个简单动作稳定地串起来”。
而这,恰好就是这组练习代码最有价值的地方。

结语

学习 OpenCV,最怕的是一开始就追求“大而全”,结果什么都知道一点,但写不出能跑的程序。
更好的方法,是先把一组小脚本练透,理解图像数组、掌握显示与读取、学会颜色分割与轮廓定位,再慢慢走向更复杂的视觉任务。

从这个目录里的内容来看,你已经不只是“会打开摄像头”了,而是在逐步搭建一套属于自己的计算机视觉入门路径。
如果继续沿着这条线走下去,从颜色追踪到人脸追踪,再到自动控制和视觉定位,路线其实已经很清楚了。

附:本文对应脚本索引

  • numpy_demo.py
  • 显示图片.py
  • 调摄像头.py
  • 鼠标事件.py
  • TrackBar.py
  • 绘画板.py
  • 绘制文本.py
  • 绘制圆形.py
  • 图像的操作.py
  • 图片仿射变换.py
  • 色彩空间转换.py
  • 提取截图蓝色.py
  • 人头追踪.py

作者名片

zyd
zyd
@zyd

这个作者暂时还没有填写个人简介。

评论区
文章作者和管理员都可以管理这里的评论。
0 条评论
登录后即可参与评论。 去登录
还没有评论,欢迎留下第一条交流内容。