
Opencv学习
从显示图片到实时追踪:用一组练习脚本学会 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)
这里最值得初学者记住的是四件事:
cv2.imread()用来读取图片。cv2.imshow()用来显示图片。cv2.waitKey()不只是“暂停程序”,它还负责让窗口真正响应显示。- 图像数组可以直接参与运算,比如
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 交互入门:鼠标事件和滑动条
对应文件:
鼠标事件.pyTrackBar.py绘画板.py
很多新手会把 OpenCV 只看成“图像处理库”,其实它也提供了一些轻量交互能力,足够做调参、小工具和演示程序。
1. 鼠标事件
鼠标事件.py 用 cv2.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 已经不只是“画一个图形”了,它实际上在做一个完整的小型视觉任务:
- 把摄像头画面转成 HSV
- 根据颜色范围提取黄色目标
- 用开运算和闭运算去噪
- 查找轮廓
- 用最小外接圆拟合目标
- 计算目标中心和参考点之间的距离
- 把结果画回图像
这一段非常接近真实项目流程,核心代码逻辑是:
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 的层次就更完整了。
它不是只在摄像头里做颜色提取,而是做了一条比较完整的自动化流程:
- 调系统截图工具抓取活动窗口和整屏
- 缩小图像以提高处理速度
- 在 HSV 空间里筛选蓝色区域
- 通过轮廓找到最大的蓝色目标
- 用模板匹配估计目标窗口在整屏中的位置
- 把窗口内坐标换算成屏幕绝对坐标
这段代码说明了一件非常重要的事:
OpenCV 不只是“识别”,它还可以和操作系统工具配合,进入自动化任务场景。
如果你以后想做:
- 游戏辅助中的目标定位
- 桌面自动点击
- 工业软件界面识别
- 屏幕元素检测
这样的思路就很值得继续往下延伸。
八、从颜色追踪走向目标追踪:人脸检测就是一个好入口
对应文件:人头追踪.py
这份脚本是当前目录里最像“完整教学案例”的一个。
它把参数解析、摄像头初始化、分类器加载、实时检测、结果绘制都组织得比较清楚,很适合拿来当入门阶段的小项目。
核心思路是:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(60, 60),
)
这里使用的是 OpenCV 自带的 Haar 级联分类器。
虽然它在精度和鲁棒性上比不上后来的深度学习检测器,但它对初学者有两个巨大优点:
- 开箱即用,不需要训练模型
- 非常适合理解“检测结果如何接入实时画面”
这个脚本后面还做了一个很好的教学动作:
它不仅画出了人脸位置,还计算了人脸中心和屏幕中心的偏移量 dx、dy。
这一步非常关键,因为它意味着程序已经不只是“看见人脸”,而是在为“控制”做准备。
如果你后面接舵机、云台、机械臂,这种“目标中心相对画面中心的偏差”就是最直接的控制输入。
九、把这些脚本串起来,你其实已经走完了一条完整的入门路径
如果只看文件名,这个目录像是一些零散练习;
但如果按知识顺序来看,它其实已经构成了一条非常完整的 OpenCV 入门路线:
- 用 NumPy 理解图像数据结构
- 读取和显示图片
- 打开摄像头处理实时画面
- 使用鼠标和滑动条做交互
- 在画面中绘制图形和文字
- 完成基础几何变换
- 通过 HSV 做颜色分割
- 用轮廓和外接圆定位目标
- 用分类器做基础人脸追踪
这条路线的优点在于,它不是纯理论,而是每一步都有能运行的代码。
对初学者来说,这种“边看边改边运行”的学习方式,通常比单纯背 API 高效得多。
十、如果想把这套代码继续升级,可以往哪几个方向走
如果你已经能读懂这组脚本,下一步很适合做下面几个升级练习:
- 把
TrackBar.py真正改成 HSV 调参工具,动态调整颜色阈值 - 给
绘画板.py增加画笔粗细、清空画布、颜色切换功能 - 把
绘制圆形.py里的固定中心点改成自动目标跟踪控制量 - 给
提取截图蓝色.py真正接上点击逻辑和冷却时间控制 - 给
人头追踪.py增加串口输出,让它驱动外设跟随人脸移动
如果是教学视角,我会建议你重点练下面两件事:
- 学会稳定地得到
mask - 学会把检测结果变成坐标、距离、偏移量
因为从“看见目标”到“让系统理解目标在哪里”,中间最关键的桥梁就是这两步。
十一、初学 OpenCV 最容易踩的坑
最后补几个非常常见的坑,也刚好对应这组代码里容易继续优化的地方:
cv2.waitKey()不能少,否则窗口可能不刷新- 颜色阈值不要直接照搬,最好自己用滑动条调
- 摄像头读取时要先判断
ret和frame是否有效 - 实时处理时尽量减少每帧里不必要的重复计算
- 做颜色分割后,通常要配合形态学操作去噪
- 想在工程里长期使用,尽量把“演示脚本”逐步整理成函数化结构
你会发现,OpenCV 真正难的地方往往不在某一个 API,而在于“如何把多个简单动作稳定地串起来”。
而这,恰好就是这组练习代码最有价值的地方。
结语
学习 OpenCV,最怕的是一开始就追求“大而全”,结果什么都知道一点,但写不出能跑的程序。
更好的方法,是先把一组小脚本练透,理解图像数组、掌握显示与读取、学会颜色分割与轮廓定位,再慢慢走向更复杂的视觉任务。
从这个目录里的内容来看,你已经不只是“会打开摄像头”了,而是在逐步搭建一套属于自己的计算机视觉入门路径。
如果继续沿着这条线走下去,从颜色追踪到人脸追踪,再到自动控制和视觉定位,路线其实已经很清楚了。
附:本文对应脚本索引
numpy_demo.py显示图片.py调摄像头.py鼠标事件.pyTrackBar.py绘画板.py绘制文本.py绘制圆形.py图像的操作.py图片仿射变换.py色彩空间转换.py提取截图蓝色.py人头追踪.py