python進(jìn)階學(xué)習(xí)實(shí)時(shí)目標(biāo)跟蹤示例詳解
前言
本程序主要實(shí)現(xiàn)了python的opencv人工智能視覺(jué)模塊的目標(biāo)跟蹤功能。
項(xiàng)目介紹
區(qū)域性鎖定目標(biāo)實(shí)時(shí)動(dòng)態(tài)跟蹤(適用 警方追捕,無(wú)人機(jī)鎖定拍攝等)
首先先介紹幾種AI視覺(jué)算法
特性:
1.BOOSTING:算法原理類似于Harr cascdes(AdaBoost),是一種很老的算法。這個(gè)算法速度慢并且不準(zhǔn)。
2.MIL:比BOOSTING準(zhǔn)一點(diǎn)
3.KCF:速度比BOOSTING和MIL更快,與BOOSTING和MIL一樣不能很好的處理遮擋問(wèn)題。
4.CSRT:比KCF更準(zhǔn)一些,但是速度比KCF慢
5.MedianFlow:對(duì)于快速移動(dòng)的目標(biāo)和外形比那花迅速的目標(biāo)效果不好
6.TLD:會(huì)產(chǎn)生朵的false-posittives
7.MOSSE:算法速度非???,但是準(zhǔn)確率比不上KCF和CSRT,在一些追求算法的速度場(chǎng)合很適用
8.GOTURN:OpenCV中自帶的唯一一個(gè)基于深度學(xué)習(xí)的算法,運(yùn)行短發(fā)需要提前下載好模型文件
分別對(duì)應(yīng)的伴生的函數(shù):
kcf:cv2.legacy.TrackerKCF_create csrt:cv2.legacy.TrackerCSRT_create boosting:cv2.legacy.TrackerBoosting_create mil:cv2.legacy.TrackerMIL_create tld:cv2.legacy.TrackerTLD_create medianflow:cv2.legacy.TrackerMedianFlow_create mosse:cv2.legacy.TrackerMOSSE_create
詳細(xì)代碼講解
導(dǎo)入cv模塊
ret,frame = cap.read()
import cv2
使用csrt算法,引用伴生函數(shù),并賦值給tracker
tracker = cv2.legacy.TrackerCSRT_create()
讀取視頻流
cap = cv2.VideoCapture('11.mp4')先讀取到第一幀
ret,frame = cap.read()
使用selectROI(前景),畫框?qū)⒛繕?biāo)框起,并賦值給bbox
bbox = cv2.selectROI('A',frame,fromCenter=False,showCrosshair=True)初始化tracker,將上面的兩個(gè)值傳入
tracker.init(frame,bbox)
讀取每一幀
ret,frame = cap.read()
根據(jù)每一幀來(lái)更新tracker
ok,box = tracker.update(frame)
若讀取成功,就定位畫框,并跟隨
if ok :
(x,y,w,h) = [int(v) for v in box]
cv2.rectangle(frame,pt1=(int(x),int(y)),pt2=(int(x)+int(w),int(y)+int(h)),color=(0,255,0),thickness=2)顯示視頻流
cv2.imshow('A', frame)等待50毫秒或按空格鍵退出
if cv2.waitKey(50) == ord(' '):
break釋放視頻流和釋放窗口
cap.release() cv2.destroyAllWindows()
完整代碼及注釋:
import cv2
tracker = cv2.legacy.TrackerCSRT_create()#使用csrt算法,引用伴生函數(shù),并賦值給tracker
cap = cv2.VideoCapture('11.mp4')#讀取視頻流
ret,frame = cap.read()#先讀取第一幀
bbox = cv2.selectROI('A',frame,fromCenter=False,showCrosshair=True)#使用selectROI(前景),畫框?qū)⒛繕?biāo)框起,并賦值給bbox
tracker.init(frame,bbox)#初始化tracker,將上面的兩個(gè)值傳入
while True:
ret,frame = cap.read()#讀取每一幀
ok,box = tracker.update(frame)#根據(jù)每一幀來(lái)跟新tracker
# 若讀取成功,我們就定位畫框,并跟隨
if ok :
(x,y,w,h) = [int(v) for v in box]
cv2.rectangle(frame,pt1=(int(x),int(y)),pt2=(int(x)+int(w),int(y)+int(h)),color=(0,255,0),thickness=2)
cv2.imshow('A', frame)#顯示視頻流
if cv2.waitKey(50) == ord(' '):#等待50毫秒或鍵盤按空格鍵退出
break
# 釋放視頻流,釋放窗口
cap.release()
cv2.destroyAllWindows()結(jié)果演示

區(qū)域性全部實(shí)時(shí)動(dòng)態(tài)目標(biāo)跟蹤(適用夜視跟蹤,范圍性觀察等)
思路構(gòu)建
1.先將實(shí)時(shí)攝像流或錄制視頻流,灰度轉(zhuǎn)化并高斯模糊
2.用二值化算法將流中的物體輪廓擴(kuò)充
3.分別先讀到第一幀和第二幀,讓其對(duì)比
4.尋找對(duì)比后,流的輪廓位置,并開(kāi)啟簡(jiǎn)易模式
5.過(guò)濾物體的矩陣輪廓將其定位繪出
詳細(xì)代碼講解
導(dǎo)入cv模塊
import cv2
將視頻流轉(zhuǎn)換并讓其高斯模糊
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)二值化擴(kuò)充
_,thresh = cv2.threshold(blur,20,255,cv2.THRESH_BINARY)
dilated = cv2.dilate(thresh,None,iterations=3)
return dilated讀取視頻流或?qū)崟r(shí)攝像流
cap = cv2.VideoCapture('11.mp4')讀取第一幀
ret,frame1 = cap.read()
讀取第二幀
ret,frame2 = cap.read()
判斷cap是否為打開(kāi)狀態(tài)
while cap.isOpened():
若為打開(kāi),則第一幀與第二幀比較
diff = cv2.absdiff(frame1,frame2) mask = filter_img(diff)
尋找比較后的物體輪廓,并開(kāi)啟簡(jiǎn)易模式
contours,_ = cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
使用方框?qū)⒁曨l流中的物體框出,得到矩陣的寬高
(x,y,w,h) = cv2.boundingRect(contour)
若矩陣的面積小于10(根據(jù)視頻流中物體的大小來(lái)定義),直接無(wú)視
if cv2.contourArea(contour) < 10:
將過(guò)濾的物體的矩陣輪廓繪出(一定要用int整形)
cv2.rectangle(frame1,pt1=(int(x),int(y)),pt2=(int(x)+int(w),int(y)+int(h)),color=(0,255,0),thickness=1)
將第一幀顯示
cv2.imshow('A',frame1)將上面賦值的mask顯示
cv2.imshow('B',mask)實(shí)現(xiàn)前后幀對(duì)比,并定位物體運(yùn)動(dòng)軌跡
1.將第二幀賦值給第一幀
frame1 = frame2
2.再將cap讀到的賦值給第二幀()
ret,frame2 = cap.read()
等待50毫秒或者按空格結(jié)束
if cv2.waitKey(50) == ord(' '):
break釋放視頻流及釋放窗口
cap.release() cv2.destroyAllWindows()
完整代碼及注釋:
import cv2
def filter_img(frame):
#將視頻流轉(zhuǎn)換灰度并讓其高斯模糊
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
#二值化將其擴(kuò)充
_,thresh = cv2.threshold(blur,20,255,cv2.THRESH_BINARY)
dilated = cv2.dilate(thresh,None,iterations=3)
return dilated
# 讀取視頻流
cap = cv2.VideoCapture('11.mp4')
ret,frame1 = cap.read()#讀到第一幀
ret,frame2 = cap.read()#讀到第二幀
while cap.isOpened():#判斷cap是否打開(kāi)
diff = cv2.absdiff(frame1,frame2)#若打開(kāi),則第一幀和第二幀作比較
mask = filter_img(diff)
contours,_ = cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#尋找視頻流的輪廓,簡(jiǎn)單模式
#用方框?qū)⒁曨l流中的物體用矩形框出
for contour in contours:
(x,y,w,h) = cv2.boundingRect(contour)#得到矩陣的寬高
if cv2.contourArea(contour) < 10:#若矩陣的面積小于200,就無(wú)視(太小了)
continue
cv2.rectangle(frame1,pt1=(int(x),int(y)),pt2=(int(x)+int(w),int(y)+int(h)),color=(0,255,0),thickness=1)#將過(guò)濾的物體的矩陣輪廓繪出
# cv2.drawContours(frame1,contours,-1,(0,255,0),2)#將視頻流中的物體輪廓畫出
cv2.imshow('A',frame1)#將第一幀顯示
cv2.imshow('B',mask)#將mask也顯示
frame1 = frame2#將第二幀賦值給第一幀
ret,frame2 = cap.read()#再將cap讀到的賦值給第二幀
if cv2.waitKey(50) == ord(' '):#等待五十毫秒或者按空格結(jié)束
break
#銷毀cap流
cap.release()
#釋放窗口
cv2.destroyAllWindows()結(jié)果顯示

以上就是python進(jìn)階學(xué)習(xí)實(shí)時(shí)目標(biāo)跟蹤示例詳解的詳細(xì)內(nèi)容,更多關(guān)于python進(jìn)階實(shí)時(shí)目標(biāo)跟蹤的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用Python開(kāi)發(fā)Markdown表格結(jié)構(gòu)轉(zhuǎn)換為Excel工具
在數(shù)據(jù)管理和文檔編寫過(guò)程中,我們經(jīng)常使用 Markdown 來(lái)記錄表格數(shù)據(jù),但它沒(méi)有Excel使用方便,所以本文將使用Python編寫一個(gè)轉(zhuǎn)換工具,希望對(duì)大家有所幫助2025-03-03
Python使用樹(shù)狀圖實(shí)現(xiàn)可視化聚類詳解
一般情況下,我們都是使用散點(diǎn)圖進(jìn)行聚類可視化,但是某些的聚類算法可視化時(shí)散點(diǎn)圖并不理想,所以在這篇文章中,我們介紹如何使用樹(shù)狀圖(Dendrograms)對(duì)我們的聚類結(jié)果進(jìn)行可視化2023-03-03
python實(shí)現(xiàn)自動(dòng)打卡小程序
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)打卡小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
Python tkinter 樹(shù)形列表控件(Treeview)的使用方法
這篇文章主要介紹了Python tkinter 樹(shù)形列表控件(Treeview)的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
python中playwright結(jié)合pytest執(zhí)行用例的實(shí)現(xiàn)
本文主要介紹了python中playwright結(jié)合pytest執(zhí)行用例的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
如何修改pycharm使用anaconda環(huán)境后的pip install安裝路徑問(wèn)題
本文主要介紹了如何修改pycharm使用anaconda環(huán)境后的pip install安裝路徑問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02

