OpenCV 从零学习 · 第 16 讲:摄像头实时处理
函数:cv2.VideoCapture 循环 / cv2.waitKey | 难度:★★☆☆☆
把第 15 讲的"读视频"换成"读摄像头",再加一个 imshow 循环刷新,就是实时处理。你前面学的灰度、Canny、轮廓、人脸……都能实时跑在摄像头画面上。
一、实时循环骨架
import cv2
cap = cv2.VideoCapture(0) # 默认摄像头
if not cap.isOpened():
raise IOError("无法打开摄像头")
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150) # 任意你想实时跑的算法
cv2.imshow('live', edges)
if cv2.waitKey(1) & 0xFF == 27: # 按 ESC 退出
break
cap.release()
cv2.destroyAllWindows()
| 关键 | 说明 |
waitKey(1) | 参数 1=等待 1ms、非阻塞,循环才流畅;用 0 会卡住 |
& 0xFF | 64 位系统取按键低字节,保证 ESC 判定正确 |
27 | ESC 键码,用于退出循环 |
场景 A · 实时边缘/素描滤镜
把 Canny 结果实时显示,摄像头前晃动物体就是"会动的线稿"。把 edges 换成卡通化(双边滤波+量化)就是实时美颜预览。
把 Canny 结果实时显示,摄像头前晃动物体就是"会动的线稿"。把 edges 换成卡通化(双边滤波+量化)就是实时美颜预览。
场景 B · 实时颜色追踪
转 HSV(第 3 讲),用
转 HSV(第 3 讲),用
inRange 抠出某种颜色(如红球),findContours 找最大轮廓并画框——做"跟手移动的小球"演示。
⚠ 新手必踩坑
- 循环里
waitKey必须传 1(或很小的值),传 0 会让窗口卡死不动。 - 没有
destroyAllWindows()/ 没 break 就关窗口,进程可能残留、摄像头一直被占用。 - 实时处理慢(尤其人脸/特征)会掉帧——属正常,可先用
pyrDown缩小再处理提速(第 13 讲)。 - 摄像头索引:笔记本内置一般
0,外接可能1。
本讲要点
- 实时 = 摄像头循环 + 每帧处理 +
imshow。 waitKey(1)非阻塞、& 0xFF取低字节、ESC=27 退出。- 结束务必 release + destroyAllWindows,释放摄像头。
- 前面所有静态算法都能无缝搬进这个骨架。
下一讲:第 17 讲 · 人脸检测(Haar 级联分类器 detectMultiScale)——经典的"框脸"方法,实时人脸计数/追踪的入门。
