最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用OpenCV實(shí)現(xiàn)物體跟蹤的實(shí)踐方法

 更新時(shí)間:2026年04月12日 13:40:25   作者:Westward-sun.  
文章介紹了使用OpenCV進(jìn)行物體跟蹤的小項(xiàng)目,涵蓋選擇ROI、初始化跟蹤器、逐幀更新等核心流程,代碼示例展示了不同OpenCV版本的兼容性處理、跟蹤失敗提示和交互控制,此外,還提供了常見(jiàn)問(wèn)題解答和進(jìn)一步學(xué)習(xí)建議,需要的朋友可以參考下

最近在學(xué)習(xí)OpenCV的物體跟蹤模塊,寫了一個(gè)小項(xiàng)目練手:打開(kāi)攝像頭,按s鍵用鼠標(biāo)框選一個(gè)物體,程序就會(huì)自動(dòng)跟隨它的移動(dòng)。代碼雖然簡(jiǎn)單,但涵蓋了物體跟蹤的核心流程,還處理了OpenCV不同版本的兼容性、跟蹤重置、丟失提示等細(xì)節(jié)。本文作為學(xué)習(xí)筆記,分享完整代碼和關(guān)鍵知識(shí)點(diǎn)。

一、物體跟蹤是什么?

物體跟蹤(Object Tracking)是指在視頻序列中,持續(xù)定位一個(gè)預(yù)先選定的目標(biāo)。它與物體檢測(cè)的區(qū)別在于:

  • 檢測(cè):每一幀都獨(dú)立找出所有物體,計(jì)算量大,但能處理任意目標(biāo)。
  • 跟蹤:只在第一幀指定目標(biāo),后續(xù)幀利用時(shí)間連續(xù)性快速預(yù)測(cè)位置,實(shí)時(shí)性高。

OpenCV提供了多種跟蹤算法,如KCF、CSRT、MOSSE等。本文使用KCF(Kernelized Correlation Filters),它在速度和精度之間取得較好平衡,適合實(shí)時(shí)應(yīng)用。

二、環(huán)境準(zhǔn)備

  • Python 3.x
  • OpenCV庫(kù)(含contrib模塊)

安裝命令:

pip install opencv-python opencv-contrib-python

注意:從OpenCV 4.5.1開(kāi)始,部分跟蹤器被移入cv2.legacy子模塊。本文代碼已做兼容處理。

三、完整代碼

以下代碼實(shí)現(xiàn)了:

  • 打開(kāi)默認(rèn)攝像頭
  • s鍵框選目標(biāo)并開(kāi)始跟蹤
  • r鍵重置跟蹤(可重新選目標(biāo))
  • 跟蹤失敗時(shí)顯示“TRACKING LOST”提示
  • ESC鍵退出
import cv2
# ----- 兼容不同OpenCV版本的跟蹤器創(chuàng)建 -----
try:
    # 適用于 OpenCV < 4.5.1
    tracker = cv2.TrackerKCF_create()
except AttributeError:
    # 適用于 OpenCV >= 4.5.1
    tracker = cv2.legacy.TrackerKCF_create()
tracking = False          # 是否處于跟蹤狀態(tài)
cap = cv2.VideoCapture(0) # 0 為默認(rèn)攝像頭
# 檢查攝像頭是否打開(kāi)成功
if not cap.isOpened():
    print("錯(cuò)誤:無(wú)法打開(kāi)攝像頭")
    exit()
while True:
    ret, frame = cap.read()
    if not ret:
        print("無(wú)法讀取幀")
        break
    key = cv2.waitKey(1)
    # ----- 按 s 鍵:選擇目標(biāo)并開(kāi)始/重置跟蹤 -----
    if key == ord('s'):
        tracking = False   # 先重置狀態(tài)
        roi = cv2.selectROI("Tracking", frame, False)
        # 如果用戶取消了選擇(roi為(0,0,0,0)),則不進(jìn)行初始化
        if roi != (0, 0, 0, 0):
            # 重新創(chuàng)建跟蹤器,清除舊狀態(tài)
            try:
                tracker = cv2.TrackerKCF_create()
            except AttributeError:
                tracker = cv2.legacy.TrackerKCF_create()
            tracker.init(frame, roi)
            tracking = True
    # ----- 按 r 鍵:重置跟蹤(不選新目標(biāo),只是停止) -----
    elif key == ord('r'):
        tracking = False
        print("跟蹤已重置,請(qǐng)按 s 選擇新目標(biāo)")
    # ----- 如果處于跟蹤狀態(tài),更新跟蹤器并繪制結(jié)果 -----
    if tracking:
        success, box = tracker.update(frame)
        if success:
            x, y, w, h = [int(v) for v in box]
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
        else:
            # 跟蹤失敗時(shí)顯示文字提示
            cv2.putText(frame, "TRACKING LOST", (50, 50),
                        cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
    cv2.imshow("Tracking", frame)
    # 按 ESC 退出
    if key == 27:
        break
cap.release()
cv2.destroyAllWindows()

四、代碼詳解

1. 創(chuàng)建跟蹤器(兼容性寫法)

try:
    tracker = cv2.TrackerKCF_create()
except AttributeError:
    tracker = cv2.legacy.TrackerKCF_create()
  • 舊版OpenCV中TrackerKCF_create直接在cv2下;新版移到了cv2.legacy。
  • try-except捕獲AttributeError,自動(dòng)選擇正確的創(chuàng)建方式,避免因版本差異而報(bào)錯(cuò)。

2. 選擇目標(biāo):cv2.selectROI()

roi = cv2.selectROI("Tracking", frame, False)
  • 彈出一個(gè)窗口,用戶用鼠標(biāo)框選感興趣區(qū)域(ROI)。
  • 返回值roi = (x, y, w, h)是矩形框的位置和大小。
  • 第三個(gè)參數(shù)False表示從左上角拖到右下角畫矩形(True表示從中心點(diǎn)畫)。

3. 初始化跟蹤器:tracker.init(frame, roi)

  • 用選定的第一幀圖像和ROI初始化跟蹤器內(nèi)部模型。
  • 必須在調(diào)用update()之前調(diào)用,且只在目標(biāo)選定或重新選擇時(shí)調(diào)用一次。

4. 更新跟蹤:tracker.update(frame)

  • 對(duì)每一幀調(diào)用,返回(success, box)
  • successTrue表示跟蹤成功,box是新的目標(biāo)矩形;否則為False。

5. 交互控制

  • s鍵:重置tracking標(biāo)志,彈出選擇框,重新初始化跟蹤器。
  • r鍵:僅重置tracking標(biāo)志,不選新目標(biāo)(方便停止跟蹤)。
  • ESC鍵:退出循環(huán)。

6. 跟蹤失敗提示

當(dāng)success == False時(shí),用cv2.putText()在畫面左上角顯示紅色“TRACKING LOST”,讓用戶知道已跟丟。

五、運(yùn)行方法

  1. 將上述代碼保存為object_tracking.py。

在終端運(yùn)行:

python object_tracking.py

攝像頭打開(kāi)后:

  • 按下鍵盤 s 鍵,畫面會(huì)凍結(jié)并出現(xiàn)“Tracking”窗口。
  • 用鼠標(biāo)拖拽框選要跟蹤的物體(例如你的手、一本書等)。
  • 回車空格確認(rèn)選擇。
  • 程序開(kāi)始自動(dòng)跟蹤,綠色框會(huì)跟隨物體移動(dòng)。
  • 如果跟丟,畫面顯示“TRACKING LOST”,可按 r 重置,再按 s 重新選擇。

按 ESC 退出程序。

六、效果展示

  • 跟蹤成功時(shí),綠色矩形框會(huì)緊貼目標(biāo)移動(dòng)(即使目標(biāo)在畫面中旋轉(zhuǎn)、稍微變形,KCF仍有一定魯棒性)。
  • 如果目標(biāo)快速移動(dòng)或被遮擋,跟蹤可能會(huì)失?。ǔ霈F(xiàn)紅色文字),此時(shí)需要重新選擇目標(biāo)。

提示:為了獲得更好的跟蹤效果,可以嘗試將KCF換成CSRT(更準(zhǔn)但稍慢):

tracker = cv2.legacy.TrackerCSRT_create()

七、常見(jiàn)問(wèn)題

Q1:運(yùn)行時(shí)報(bào)錯(cuò) AttributeError: module 'cv2' has no attribute 'TrackerKCF_create'
A:說(shuō)明你的OpenCV版本較新(≥4.5.1)。代碼中的try-except已經(jīng)處理了這種情況,請(qǐng)確保你完整復(fù)制了兼容性寫法。如果仍然報(bào)錯(cuò),請(qǐng)檢查是否安裝了opencv-contrib-python。

Q2:為什么跟蹤一段時(shí)間后框會(huì)飄走?
A:KCF對(duì)遮擋、尺度變化、快速運(yùn)動(dòng)比較敏感。可以嘗試換用CSRT算法,或者重新按s框選目標(biāo)。

Q3:如何跟蹤視頻文件而不是攝像頭?
A:將cv2.VideoCapture(0)改為視頻路徑,例如cv2.VideoCapture("test.mp4")。

Q4:selectROI彈出的窗口怎么關(guān)閉?
A:確認(rèn)選擇后按Enter空格,窗口會(huì)自動(dòng)關(guān)閉。如果不想選擇,按ESC取消。

八、總結(jié)

通過(guò)這個(gè)小項(xiàng)目,你可以掌握:

  • OpenCV物體跟蹤的基本流程:創(chuàng)建跟蹤器 → 選擇ROI → 初始化 → 逐幀更新。
  • 處理不同OpenCV版本的兼容性問(wèn)題。
  • 增加交互邏輯(重置、失敗提示)提升用戶體驗(yàn)。

物體跟蹤是計(jì)算機(jī)視覺(jué)中非常實(shí)用的技術(shù),可以應(yīng)用于自動(dòng)駕駛、安防監(jiān)控、人機(jī)交互等領(lǐng)域。希望這篇筆記能幫助你快速上手,自己動(dòng)手試一試吧!

下一步學(xué)習(xí)建議:

  • 嘗試使用CSRTMOSSE算法,比較精度和速度。
  • 學(xué)習(xí)多目標(biāo)跟蹤(MOT),同時(shí)跟蹤多個(gè)物體。
  • 結(jié)合YOLO等目標(biāo)檢測(cè)器,實(shí)現(xiàn)自動(dòng)檢測(cè)+跟蹤。

以上就是Python使用OpenCV實(shí)現(xiàn)物體跟蹤的實(shí)踐方法的詳細(xì)內(nèi)容,更多關(guān)于Python OpenCV物體跟蹤的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文帶你探索Python中15個(gè)常見(jiàn)的魔術(shù)方法

    一文帶你探索Python中15個(gè)常見(jiàn)的魔術(shù)方法

    在Python中,特殊方法(也稱為魔術(shù)方法)是由Python解釋器自動(dòng)調(diào)用的,我們不需要手動(dòng)調(diào)用它們,本文小編為大家整理了15個(gè)常見(jiàn)特殊方法的實(shí)現(xiàn),希望對(duì)大家有所幫助
    2024-01-01
  • Django如何實(shí)現(xiàn)防止XSS攻擊

    Django如何實(shí)現(xiàn)防止XSS攻擊

    這篇文章主要介紹了Django如何實(shí)現(xiàn)防止XSS攻擊,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Python如何將函數(shù)值賦給變量

    Python如何將函數(shù)值賦給變量

    這篇文章主要介紹了Python如何將函數(shù)值賦給變量,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Python 支付整合開(kāi)發(fā)包的實(shí)現(xiàn)

    Python 支付整合開(kāi)發(fā)包的實(shí)現(xiàn)

    這篇文章主要介紹了Python 支付整合開(kāi)發(fā)包的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • 跟老齊學(xué)Python之使用Python操作數(shù)據(jù)庫(kù)(1)

    跟老齊學(xué)Python之使用Python操作數(shù)據(jù)庫(kù)(1)

    本文詳細(xì)講述了使用python操作數(shù)據(jù)庫(kù)所需要了解的知識(shí)以及準(zhǔn)備工作,十分的詳盡,這里推薦給想學(xué)習(xí)python的小伙伴。
    2014-11-11
  • Numpy中np.expand_dims的用法

    Numpy中np.expand_dims的用法

    np.expand_dims是Numpy庫(kù)中的一個(gè)函數(shù),它的主要作用是在數(shù)組的指定位置增加一個(gè)新的維度,本文就來(lái)介紹一下它的用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Python?matplotlib中更換畫布背景顏色的3種方法

    Python?matplotlib中更換畫布背景顏色的3種方法

    這篇文章主要給大家介紹了關(guān)于Python?matplotlib中更換畫布背景顏色的3種方法,在Matplotlib中,我們可以使用set_facecolor()方法來(lái)設(shè)置背景顏色,文中通過(guò)圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • python散點(diǎn)圖的繪制

    python散點(diǎn)圖的繪制

    這篇文章主要介紹了python散點(diǎn)圖的繪制,這是的繪制圖有二維散點(diǎn)圖的繪制,采用pandas.plotting.scatter_matrix函數(shù)繪制和采用seaborn進(jìn)行繪制等繪制方式,需要的小伙伴可以參考一下
    2022-02-02
  • pyinstaller打包后偶爾出現(xiàn)黑窗口一閃而過(guò)的問(wèn)題及解決

    pyinstaller打包后偶爾出現(xiàn)黑窗口一閃而過(guò)的問(wèn)題及解決

    這篇文章主要介紹了pyinstaller打包后偶爾出現(xiàn)黑窗口一閃而過(guò)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python實(shí)現(xiàn)控制臺(tái)中的進(jìn)度條功能代碼

    Python實(shí)現(xiàn)控制臺(tái)中的進(jìn)度條功能代碼

    下面小編就為大家分享一篇Python實(shí)現(xiàn)控制臺(tái)中的進(jìn)度條功能代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12

最新評(píng)論

炎陵县| 萝北县| 新安县| 祁连县| 土默特左旗| 什邡市| 定襄县| 信宜市| 麟游县| 阿图什市| 五台县| 阿拉善右旗| 鄱阳县| 丰都县| 松滋市| 屏南县| 南陵县| 余江县| 永新县| 佳木斯市| 阜宁县| 麻江县| 通城县| 闽侯县| 西丰县| 勃利县| 昭觉县| 灵璧县| 金山区| 西乌| 宁南县| 禹州市| 阿鲁科尔沁旗| 奈曼旗| 陇南市| 千阳县| 崇仁县| 青神县| 房产| 新干县| 柳州市|