Python使用OPENCV的目標跟蹤算法實現(xiàn)自動視頻標注效果
先上效果


1.首先,要使用opencv的目標跟蹤算法,必須要有opencv環(huán)境
使用:opencv==4.4.0 和 opencv-contrib-python==4.4.0.46,lxml 這三個環(huán)境包。
也可以使用以下方法進行下載 :
pip install opencv-python==4.4.0
pip install opencv-contrib-python==4.4.0.4pip install lxml
2.使用方法:
(1):英文狀態(tài)下的 “s” 是進行標注
(2):使用小鍵盤 1-9 按下對應的標簽序號,標簽序號和標簽可自定義(需要提前定義)
(3):對目標進行繪制
(4):按空格鍵繼續(xù)
重復進行 (1)(2)(3)(4)步驟,可實現(xiàn)多個目標的跟蹤繪制
英文狀態(tài)下的 “r” 是所有清除繪制
英文狀態(tài)下的 “q” 是退出
當被跟蹤目標丟失時,自動清除所有繪制
import cv2
import os
import time
from lxml import etree
#視頻路徑
Vs = cv2.VideoCapture('peaple.avi')
#自定義標簽
Label = {1:"people",2:"car",3:"Camera"}
#圖片保存路徑 ,一定使用要用絕對路徑??!
imgpath = r"C:\Users\BGT\Desktop\opencv\img"
#xml保存路徑 ,一定使用要用絕對路徑?。?
xmlpath = r"C:\Users\BGT\Desktop\opencv\xml"
#設置視頻縮放
cv2.namedWindow("frame", 0)
#設置視頻寬高
cv2.resizeWindow("frame", 618, 416)
#定義生成xml類
class Gen_Annotations:
def __init__(self, json_info):
self.root = etree.Element("annotation")
child1 = etree.SubElement(self.root, "folder")
child1.text = str(json_info["pic_dirname"])
child2 = etree.SubElement(self.root, "filename")
child2.text = str(json_info["filename"])
child3 = etree.SubElement(self.root, "path")
child3.text = str(json_info["pic_path"])
child4 = etree.SubElement(self.root, "source")
child5 = etree.SubElement(child4, "database")
child5.text = "My name is BGT"
def set_size(self, witdh, height, channel):
size = etree.SubElement(self.root, "size")
widthn = etree.SubElement(size, "width")
widthn.text = str(witdh)
heightn = etree.SubElement(size, "height")
heightn.text = str(height)
channeln = etree.SubElement(size, "depth")
channeln.text = str(channel)
segmented = etree.SubElement(self.root, "segmented")
segmented.text = "0"
def savefile(self, filename):
tree = etree.ElementTree(self.root)
tree.write(filename, pretty_print=True, xml_declaration=False, encoding='utf-8')
def add_pic_attr(self, label, x0, y0, x1, y1):
object = etree.SubElement(self.root, "object")
namen = etree.SubElement(object, "name")
namen.text = label
pose = etree.SubElement(object, "pose")
pose.text = "Unspecified"
truncated = etree.SubElement(object, "truncated")
truncated.text = "0"
difficult = etree.SubElement(object, "difficult")
difficult.text = "0"
bndbox = etree.SubElement(object, "bndbox")
xminn = etree.SubElement(bndbox, "xmin")
xminn.text = str(x0)
yminn = etree.SubElement(bndbox, "ymin")
yminn.text = str(y0)
xmaxn = etree.SubElement(bndbox, "xmax")
xmaxn.text = str(x1)
ymaxn = etree.SubElement(bndbox, "ymax")
ymaxn.text = str(y1)
#定義生成xml的方法
def voc_opencv_xml(a,b,c,d,e,f,boxes,Label,Label_a,save="1.xml"):
json_info = {}
json_info["pic_dirname"] = a
json_info["pic_path"] = b
json_info["filename"] = c
anno = Gen_Annotations(json_info)
anno.set_size(d, e, f)
for box in range(len(boxes)):
x,y,w,h = [int(v) for v in boxes[box]]
anno.add_pic_attr(Label[Label_a[box]],x,y,x+w,y+h)
anno.savefile(save)
if __name__ == '__main__':
Label_a = []
contents = os.path.split(imgpath)[1]
trackers = cv2.MultiTracker_create()
while True:
Filename_jpg = str(time.time()).split(".")[0] + "_" + str(time.time()).split(".")[1] + ".jpg"
Filename_xml = str(time.time()).split(".")[0] + "_" + str(time.time()).split(".")[1] + ".xml"
path_Filename_jpg = os.path.join(imgpath,Filename_jpg)
path_Filename_xml = os.path.join(xmlpath,Filename_xml)
ret,frame = Vs.read()
if not ret:
break
success,boxes = trackers.update(frame)
if len(boxes)>0:
cv2.imwrite(path_Filename_jpg, frame)
judge = True
else:
judge = False
if success==False:
print("目標丟失")
trackers = cv2.MultiTracker_create()
Label_a = []
judge = False
if judge:
voc_opencv_xml(contents,Filename_jpg,path_Filename_jpg,frame.shape[1],frame.shape[0],frame.shape[2],boxes,Label,Label_a,path_Filename_xml)
if judge:
for box in range(len(boxes)):
x,y,w,h = [int(v) for v in boxes[box]]
cv2.putText(frame, Label[Label_a[box]], (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 1)
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('frame',frame)
var = cv2.waitKey(30)
if var == ord('s'):
imgzi = cv2.putText(frame, str(Label), (50, 50), cv2.FONT_HERSHEY_TRIPLEX, 1, (0, 255, 0), 2)
cv2.imshow('frame', frame)
var = cv2.waitKey(0)
if var-48<len(Label) or var-48<=len(Label):
Label_a.append(int(var-48))
box = cv2.selectROI("frame", frame, fromCenter=False,showCrosshair=True)
tracker = cv2.TrackerCSRT_create()
trackers.add(tracker,frame,box)
elif var == ord("r"):
trackers = cv2.MultiTracker_create()
Label_a = []
elif var == ord('q'): #退出
break
Vs.release()
cv2.destroyAllWindows()
3.得到xml和img數(shù)據(jù)是VOC格式,img和xml文件以時間戳進行命名。防止同名覆蓋。

4.最后使用 labelImg軟件 對獲取到的img和xml進行最后的檢查和微調

到此這篇關于Python使用OPENCV的目標跟蹤算法進自動視頻標注效果的文章就介紹到這了,更多相關OPENCV目標跟蹤自動視頻標注內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
linux系統(tǒng)使用python監(jiān)測網絡接口獲取網絡的輸入輸出
這篇文章主要介紹了linux系統(tǒng)使用python監(jiān)測網絡接口獲取網絡的輸入輸出信息,大家參考使用吧2014-01-01
python實現(xiàn)excel讀寫數(shù)據(jù)
這篇文章主要為大家詳細介紹了python操作EXCEL讀數(shù)據(jù)、寫數(shù)據(jù)的實例源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04
pandas數(shù)據(jù)清洗,排序,索引設置,數(shù)據(jù)選取方法
下面小編就為大家分享一篇pandas數(shù)據(jù)清洗,排序,索引設置,數(shù)據(jù)選取方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Python可視化Matplotlib散點圖scatter()用法詳解
這篇文章主要介紹了Python可視化中Matplotlib散點圖scatter()的用法詳解,文中附含詳細示例代碼,有需要得朋友可以借鑒參考下,希望能夠有所幫助2021-09-09
python PyQt實現(xiàn)的手寫電子簽名程序實例探究
在本文中,我們將探討如何利用Python以及開源工具來實現(xiàn)手寫電子簽名的功能,通過本文,您將能夠了解到手寫電子簽名的實現(xiàn)方式,并可以在自己的應用程序中應用這一功能2023-12-12
matplotlib階梯圖的實現(xiàn)(step())
這篇文章主要介紹了matplotlib階梯圖的實現(xiàn)(step()),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03

