📜  使用 OpenCV 使用 Camshift 跟踪对象(1)

📅  最后修改于: 2023-12-03 15:22:15.127000             🧑  作者: Mango

使用 OpenCV 使用 Camshift 跟踪对象

本文将介绍如何使用OpenCV 的 Camshift 算法来跟踪对象。Camshift 算法是一种基于颜色直方图的目标跟踪算法,能够对追踪目标进行自适应的颜色模型更新和目标大小的自适应变化。

实现步骤
  1. 加载视频或摄像头数据源
  2. 选择追踪目标,初始化目标位置矩形框
  3. 提取目标的颜色直方图
  4. 对图像进行预处理,将非目标区域置为黑色
  5. 使用 CamShift 算法对目标进行追踪
  6. 显示追踪结果
代码实现
import cv2

def track_object():
    cap = cv2.VideoCapture(0)
    # 读取视频数据源,如果要读取视频文件可以使用 cv2.VideoCapture("文件名")

    while True:
        ret, frame = cap.read()
        # 逐帧读取视频数据

        # 转换为 HSV 颜色空间
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

        # 创建一个矩形框,选择目标区域
        track_window = cv2.selectROI("Tracking", frame, False)
        # 注意:selectROI 应该在原始图像上执行,而不是前面转换为 HSV 的图像

        # 提取目标区域的颜色直方图
        roi = hsv[int(track_window[1]):int(track_window[1]+track_window[3]), 
                  int(track_window[0]):int(track_window[0]+track_window[2])]
        roi_hist = cv2.calcHist([roi], [0], None, [180], [0, 180])

        # 归一化直方图,便于后面进行 CamShift 算法处理
        cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)

        # 设置终止条件
        term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)

        while True:
            ret, frame = cap.read()
            if ret == True:
                hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

                # 反向投影(Back Projection),构建概率模型
                dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)

                # CamShift 算法进行目标追踪
                ret, track_window = cv2.CamShift(dst, track_window, term_crit)

                # 绘制目标矩形框
                pts = cv2.boxPoints(ret)
                pts = np.int0(pts)
                img = cv2.polylines(frame, [pts], True, (0, 255, 0), 2)

                # 显示追踪结果
                cv2.imshow("Tracking", img)

                # 按 ESC 键退出
                k = cv2.waitKey(1) & 0xff
                if k == 27:
                    break

            else:
                break

    cv2.destroyAllWindows()
    cap.release()

if __name__ == '__main__':
    track_object()
代码说明
  1. 调用 cv2.VideoCapture() 函数读取指定视频源,如果 cap.isOpened() 为 False,说明读取视频出现错误。
  2. 调用 cv2.selectROI() 函数,使用鼠标选择追踪目标区域,返回目标位置矩形框。
  3. 对目标区域的图像提取颜色直方图,使用 cv2.calcHist() 计算。
  4. 对目标区域的颜色直方图进行归一化处理,使用 cv2.normalize() 函数。
  5. 在每个视频帧中执行 CamShift 算法进行目标追踪,最终目标位置由 cv2.CamShift() 函数返回,计算目标矩形框顶点坐标,使用 cv2.polylines() 函数绘制矩形框。
  6. 显示追踪结果,按 ESC 键退出,释放视频数据源。