1. 环境准备

在开始之前,请确保你的电脑上安装了Python和OpenCV库。如果没有,请在终端或命令行运行以下命令:

pip install opencv-python opencv-contrib-python numpy

注:安装*opencv-contrib-python*是为了使用一些额外的扩展模块(如某些特定的跟踪算法)。

2. 目标检测:传统方法(Haar特征)

Haar级联分类器是OpenCV中最经典的检测方法,虽然它是“老古董”,但用来做人脸检测依然非常快,且不需要GPU。

原理简述: 通过计算图像中矩形区域的像素差值来提取特征,配合AdaBoost算法筛选出最能代表目标的特征。

代码案例:实时人脸检测
OpenCV官方已经内置了训练好的Haar人脸模型文件(haarcascade_frontalface_default.xml)。

import cv2

# 1. 加载Haar级联分类器
# 注意:确保你的路径下有这个xml文件,或者使用cv2.data.haarcascades自带的路径
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

    # 3. 转为灰度图(Haar检测通常在灰度图上进行,速度更快)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 4. 检测人脸
    # scaleFactor: 每次图像缩小的比例
    # minNeighbors: 每个候选矩形至少保留多少个邻居,值越大检测越严格
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    # 5. 绘制矩形框
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
        cv2.putText(frame, 'Face', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)

    # 6. 显示结果
    cv2.imshow('Face Detection', frame)

    # 按'q'键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
3. 目标检测:深度学习方法(DNN模块)

传统方法只能检测人脸等简单物体。现在主流的检测(如YOLO、SSD)都基于深度学习。OpenCV的cv2.dnn模块可以直接加载训练好的模型进行推理。

原理简述: 将图像输入到预训练好的神经网络(如Caffe或Darknet格式),网络输出目标的类别概率和边界框坐标。

代码案例:使用SSD MobileNet检测通用物体
这里我们使用OpenCV官方提供的Caffe模型来检测人、车等常见物体。

import cv2
import numpy as np

# 1. 加载预训练模型(需提前下载 prototxt 和 caffemodel 文件)
# 下载地址通常在OpenCV官方GitHub的dnn_samples中
net = cv2.dnn.readNetFromCaffe("MobileNetSSD_deploy.prototxt", "MobileNetSSD_deploy.caffemodel")

# 定义类别标签
CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", 
           "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", 
           "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]

cap = cv2.VideoCapture(0)

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

    h, w = frame.shape[:2]
    
    # 2. 图像预处理:转换为网络需要的Blob格式
    blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 0.007843, (300, 300), 127.5)
    net.setInput(blob)
    
    # 3. 前向推理
    detections = net.forward()

    # 4. 解析检测结果
    for i in range(detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        
        # 设置置信度阈值,过滤掉不确定的结果
        if confidence > 0.5:
            idx = int(detections[0, 0, i, 1])
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (startX, startY, endX, endY) = box.astype("int")

            # 绘制框和标签
            label = f"{CLASSES[idx]}: {confidence:.2f}"
            cv2.rectangle(frame, (startX, startY), (endX, endY), (0, 255, 0), 2)
            cv2.putText(frame, label, (startX, startY - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

    cv2.imshow("DNN Detection", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
4. 目标跟踪(Object Tracking)

检测是“每一帧都找”,跟踪是“第一帧框选,后面自动跟着跑”。OpenCV内置了多种跟踪算法(如CSRT, KCF, MOSSE等)。

原理简述: 跟踪算法利用目标在上一帧的位置和外观特征,预测其在当前帧的位置。相比检测,跟踪速度极快,但容易在目标完全遮挡后丢失。

代码案例:CSRT跟踪器(精度较高)
运行代码后,用鼠标在视频画面中框选一个物体,按回车键开始跟踪。

import cv2

# 1. 创建跟踪器对象
# OPENCV提供了多种跟踪器:'BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN', 'MOSSE', 'CSRT'
# CSRT精度较高,KCF速度较快
tracker = cv2.TrackerCSRT_create()

cap = cv2.VideoCapture(0)

# 读取第一帧
ret, frame = cap.read()
if not ret:
    exit()

# 2. 手动框选目标 (x, y, w, h)
bbox = cv2.selectROI("Tracking", frame, fromCenter=False, showCrosshair=True)

# 3. 初始化跟踪器
tracker.init(frame, bbox)

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

    # 4. 更新跟踪器
    success, bbox = tracker.update(frame)

    if success:
        # 绘制跟踪结果
        (x, y, w, h) = [int(v) for v in bbox]
        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
        cv2.putText(frame, "Tracking", (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
    else:
        cv2.putText(frame, "Lost", (20, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    cv2.imshow("Tracking", frame)
    
    # 按'r'键重置框选,按'q'键退出
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
    elif key == ord('r'):
        # 重新框选逻辑(简化版需重启程序,完整版需重新init)
        pass

cap.release()
cv2.destroyAllWindows()
5. 总结与常见问题
  1. 检测 vs 跟踪: 检测(Detection)更稳,不会因为遮挡就彻底丢失,但速度慢;跟踪(Tracking)速度极快,但容易跟丢。实际项目中常采用“检测+跟踪”结合的策略(如DeepSORT)。
  2. 环境报错: 如果遇到cv2.TrackerCSRT_create报错,通常是因为没有安装opencv-contrib-python,请重新pip安装。
  3. 模型文件: 深度学习部分的代码需要下载对应的.prototxt.caffemodel文件,这是Caffe框架的标准格式。

希望这篇博客能帮你快速入门OpenCV的目标检测与跟踪!如果有问题,欢迎在评论区留言讨论。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐