OpenCV 入门教程

FreeGuideOnline 最新 2026-07-14

bash python --version


如果未安装,请前往 [python.org](https://www.python.org) 下载对应系统的安装包,勾选“Add Python to PATH”后完成安装。

### 2.2 安装 OpenCV 及依赖

在终端中使用 pip 安装 OpenCV-Python。官方推荐安装补丁版本同时包含主模块和扩展模块(contrib)的包:

```bash
pip install opencv-python opencv-contrib-python

如果需要使用摄像头或视频处理,还需要确保 NumPy 和 Matplotlib 已安装:

pip install numpy matplotlib

2.3 验证安装

进入 Python 交互环境,导入 cv2 并打印版本号:

import cv2
print(cv2.__version__)

如果正常输出类似 4.8.0 的版本号,说明环境准备就绪。

3. 第一行代码:读取并显示图片

3.1 读取图片文件

使用 cv2.imread() 函数加载图片,它返回一个 NumPy 数组,代表图像的像素数据。

import cv2

# 路径请替换为你本地的图片文件
img = cv2.imread('sample.jpg')
print(type(img))  # <class 'numpy.ndarray'>
print(img.shape)  # (高, 宽, 通道数)

如果图片不存在,img 将是 None,后续操作前务必检查。

3.2 显示图片

cv2.imshow('My Image', img)
cv2.waitKey(0)       # 等待键盘按下,0 表示无限等待
cv2.destroyAllWindows()

3.3 色彩空间:BGR 与 RGB

OpenCV 默认读取的色彩顺序是 BGR,而不是常见的 RGB。用 Matplotlib 显示时需要转换,否则颜色会偏蓝。

import matplotlib.pyplot as plt

img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.axis('off')
plt.show()

4. 图像基础操作

4.1 颜色空间转换

cv2.cvtColor() 支持几十种转换类型,最常用的是 BGR ↔ GRAY 和 BGR ↔ HSV。

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

4.2 调整尺寸

resized = cv2.resize(img, (640, 480))  # (宽, 高)

或按比例缩放:

scale = 0.5
h, w = img.shape[:2]
new_size = (int(w * scale), int(h * scale))
resized = cv2.resize(img, new_size)

4.3 裁剪与绘制形状

图片实际上是数组,直接切片即可裁剪:

crop = img[100:300, 200:400]   # [y 起点:终点, x 起点:终点]

在图像上绘制:使用 cv2.rectanglecv2.circlecv2.putText 等函数。

# 在副本上绘制,避免污染原图
img_copy = img.copy()
cv2.rectangle(img_copy, (50,50), (200,200), (0,255,0), 3)  # 绿色矩形
cv2.circle(img_copy, (300,300), 80, (255,0,0), -1)        # 蓝色实心圆
cv2.putText(img_copy, 'OpenCV', (50,400), 
            cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0,0,255), 2)
cv2.imshow('Drawings', img_copy)
cv2.waitKey(0)

4.4 图像阈值与边缘检测

二值化是许多图像处理任务的基础:

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

Canny 边缘检测可以直接找出图像中物体的轮廓:

edges = cv2.Canny(gray, 50, 150)
cv2.imshow('Edges', edges)
cv2.waitKey(0)

4.5 保存处理后的图片

cv2.imwrite('output.jpg', edges)

5. 视频与摄像头操作

5.1 读取视频文件

cap = cv2.VideoCapture('video.mp4')

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    cv2.imshow('Video', frame)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

waitKey(25) 决定了帧率,25 毫秒约合 40 fps。

5.2 调用摄像头

cv2.VideoCapture(0) 中的参数改为 0(默认摄像头),其他代码不变。可以在循环内对每一帧进行处理,实现实时特效。

示例:翻转画面(像镜子一样)

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    flipped = cv2.flip(frame, 1)   # 1 表示水平翻转
    cv2.imshow('Camera', flipped)
    if cv2.waitKey(1) == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

6. 实战:实时人脸检测

利用 OpenCV 内置的 Haar 级联分类器,可以快速实现人脸检测。

6.1 加载预训练模型

OpenCV 提供了多个基于 Haar 特征的 XML 分类器,位于 cv2.data.haarcascades 路径下。我们使用正面人脸检测器:

face_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)

6.2 检测思路

  • 将摄像头捕获的彩色帧转为灰度图(检测器需要灰度输入)
  • 调用 detectMultiScale 得到人脸矩形坐标
  • 在原图上画出矩形框

6.3 完整代码

import cv2

# 1. 加载分类器
face_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)

# 2. 打开摄像头
cap = cv2.VideoCapture(0)

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

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # detectMultiScale 参数:图像,缩放因子,最小邻居数
    faces = face_cascade.detectMultiScale(gray, 1.1, 5)

    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    cv2.imshow('Face Detection', frame)

    if cv2.waitKey(1) == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()