欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

OpenCV 从零学习 · 第 16 讲:摄像头实时处理(VideoCapture 循环 + imshow,把算法搬到实时画面)

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 会卡住
& 0xFF64 位系统取按键低字节,保证 ESC 判定正确
27ESC 键码,用于退出循环
场景 A · 实时边缘/素描滤镜
把 Canny 结果实时显示,摄像头前晃动物体就是"会动的线稿"。把 edges 换成卡通化(双边滤波+量化)就是实时美颜预览。
场景 B · 实时颜色追踪
转 HSV(第 3 讲),用 inRange 抠出某种颜色(如红球),findContours 找最大轮廓并画框——做"跟手移动的小球"演示。
⚠ 新手必踩坑
  • 循环里 waitKey 必须传 1(或很小的值),传 0 会让窗口卡死不动。
  • 没有 destroyAllWindows() / 没 break 就关窗口,进程可能残留、摄像头一直被占用。
  • 实时处理慢(尤其人脸/特征)会掉帧——属正常,可先用 pyrDown 缩小再处理提速(第 13 讲)。
  • 摄像头索引:笔记本内置一般 0,外接可能 1

本讲要点

  • 实时 = 摄像头循环 + 每帧处理 + imshow
  • waitKey(1) 非阻塞、& 0xFF 取低字节、ESC=27 退出。
  • 结束务必 release + destroyAllWindows,释放摄像头。
  • 前面所有静态算法都能无缝搬进这个骨架。

下一讲:第 17 讲 · 人脸检测(Haar 级联分类器 detectMultiScale)——经典的"框脸"方法,实时人脸计数/追踪的入门。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功