従来のターゲット追跡 - CamShift アルゴリズム (改良された MeanShift)

目次

1.カムシフト

1.1 原則

2. プロセス

3. コード

4. まとめ


1.カムシフト

        MeanShift の結果には問題があり、検出ウィンドウのサイズが固定されており、近くから遠くに向かって徐々に小さくなる処理が対象となるため、固定ウィンドウは適していません。したがって、ターゲットの大きさや角度に応じてウィンドウのサイズや角度を補正する必要があります。

        従来のターゲット追跡 - ミーンシフト アルゴリズム - パラレルワールドの私のブログ - CSDN ブログ

        CamShift (Continuously Adaptive Mean-Shift アルゴリズム) は、MeanShift アルゴリズムを改良したアルゴリズムで、この問題を解決できます。追跡対象のサイズの変化に応じて検索ウィンドウのサイズをリアルタイムで調整でき、追跡効果が向上します。Camshift アルゴリズムは、まず MeanShift を適用します。MeanShift が収束すると、ウィンドウのサイズが更新され、同時に最適な楕円の向きが計算され、それによってターゲットの位置とサイズに応じて検索ウィンドウが更新されます。

        カムシフトの説明

1.1 原則

        Camshift は、ターゲットのカラー ヒストグラム モデルを使用して画像をカラー確率分布マップに変換し、検索ウィンドウのサイズと位置を初期化し、前のフレームで得られた結果に応じて検索ウィンドウの位置とサイズを適応的に調整します。 、それによって現在の画像の位置を特定します。ターゲットの中心位置。

2. プロセス

         ミーンシフト アルゴリズムを連続画像シーケンスに拡張したのがカムシフト アルゴリズムです。ビデオのすべてのフレームに対して平均値シフト操作を実行し、前のフレームの結果、つまり検索ウィンドウのサイズと中心を、次のフレームの平均値シフト アルゴリズムの検索ウィンドウの初期値として使用します。このように繰り返すことにより、ターゲットの追尾を実現することができる。

        アルゴリズムのプロセスは次のとおりです。

(1). 検索ウィンドウの初期化

(2). 検索窓の色の確率分布を計算する(逆投影)

(3). 平均シフト アルゴリズムを実行して、検索ウィンドウの新しいサイズと位置を取得します。

(4). (3) の値を使用して、次のビデオ フレームの検索ウィンドウのサイズと位置を再初期化し、(2) にジャンプして続行します。

3. コード

import cv2 as cv

# 创建读取视频的对象
cap = cv.VideoCapture("E:\Python-Code/videodataset/enn.mp4")

# 获取第一帧位置,并指定目标位置
ret, frame = cap.read()
c, r, h, w = 530, 160, 300, 320
track_window = (c, r, h, w)
# 指定感兴趣区域
roi = frame[r:r + h, c:c + w]

# 计算直方图
# 转换色彩空间
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
# 计算直方图
roi_hist = cv.calcHist([hsv_roi], [0], None, [180], [0, 180])
# 归一化
cv.normalize(roi_hist, roi_hist, 0, 255, cv.NORM_MINMAX)

# 目标追踪
# 设置窗口搜索终止条件:最大迭代次数,窗口中心漂移最小值
term_crit = (cv.TermCriteria_EPS | cv.TERM_CRITERIA_COUNT, 10, 1)

while True:
    ret, frame = cap.read()
    if ret:
        # 计算直方图的反向投影
        hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
        dst = cv.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)

        # 进行meanshift追踪
        ret, track_window = cv.meanShift(dst, track_window, term_crit)

        # 将追踪的位置绘制在视频上,并进行显示
        x, y, w, h = track_window
        img = cv.rectangle(frame, (x, y), (x + w, y + h), 255, 2)
        cv.imshow("frame", img)

        if cv.waitKey(20) & 0xFF == ord('q'):
            break

    else:
        break

# 资源释放
cap.release()
cv.destroyAllWindows()

        実行結果の緑色の長方形のボックスは、追跡されたオブジェクトに応じてボックスのサイズを適応的に変更できます(注: このカムシフトはエラーを検出しやすいです)  

4. まとめ

        Camshift は、ターゲットの変形とオクルージョンの問題を効果的に解決でき、システム リソースの要件が低く、時間の複雑さも低く、シンプルな背景で優れた追跡効果を実現できます。ただし、背景が複雑な場合、またはターゲットの干渉と同じ色のピクセルが多数ある場合、追跡は失敗します。この場合、色のヒストグラムのみを考慮し、対象物の空間分布特性を無視しているため、追尾対象の予測アルゴリズムを追加する必要があります。

おすすめ

転載: blog.csdn.net/weixin_45823221/article/details/128483827