Python使用OPENCV的目标跟踪算法实现自动视频标注效果

 更新时间:2021年09月10日 15:00:57   作者:包工头—BGT  
这篇文章主要介绍了Python使用OPENCV的目标跟踪算法进行简单的自动视频标注,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

先上效果

 1.首先,要使用opencv的目标跟踪算法,必须要有opencv环境

 使用:opencv==4.4.0 和 opencv-contrib-python==4.4.0.46,lxml   这三个环境包。

也可以使用以下方法进行下载 : 

pip install opencv-python==4.4.0
pip install opencv-contrib-python==4.4.0.4

pip install lxml

2.使用方法:

        (1):英文状态下的 “s” 是进行标注

        (2):使用小键盘 1-9 按下对应的标签序号,标签序号和标签可自定义(需要提前定义)

       (3):对目标进行绘制

       (4):按空格键继续

        重复进行 (1)(2)(3)(4)步骤,可实现多个目标的跟踪绘制

        英文状态下的 “r” 是所有清除绘制

         英文状态下的 “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数据是VOC格式,img和xml文件以时间戳进行命名。防止同名覆盖。

4.最后使用 labelImg软件  对获取到的img和xml进行最后的检查和微调

到此这篇关于Python使用OPENCV的目标跟踪算法进自动视频标注效果的文章就介绍到这了,更多相关OPENCV目标跟踪自动视频标注内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 彻底卸载Anaconda详细教程(超详细!)

    彻底卸载Anaconda详细教程(超详细!)

    这篇文章主要给大家介绍了关于彻底卸载Anaconda的相关资料,Anaconda(官方网站)就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本,需要的朋友可以参考下
    2023-11-11
  • Python参数解析器configparser简介

    Python参数解析器configparser简介

    configparser是python自带的配置参数解析器,可以用于解析.config文件中的配置参数,ini文件中由sections(节点)-key-value组成,这篇文章主要介绍了Python参数解析器configparser,需要的朋友可以参考下
    2022-12-12
  • python基础教程之分支、循环简单用法

    python基础教程之分支、循环简单用法

    这篇文章主要介绍了python基础教程之分支、循环简单用法,结合实例形式分析了Python分支及循环语句的简单使用方法,需要的朋友可以参考下
    2016-06-06
  • 跟老齐学Python之不要红头文件(2)

    跟老齐学Python之不要红头文件(2)

    在前面学习了基本的打开和建立文件之后,就可以对文件进行多种多样的操作了。请看官要注意,文件,不是什么特别的东西,就是一个对象,如同对待此前学习过的字符串、列表等一样。
    2014-09-09
  • python实现输出一个序列的所有子序列示例

    python实现输出一个序列的所有子序列示例

    今天小编就为大家分享一篇python实现输出一个序列的所有子序列示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python动态生成多维数组的方法示例

    Python动态生成多维数组的方法示例

    这篇文章主要介绍了Python动态生成多维数组的方法,涉及Python数组动态遍历、添加、打印等相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • Python虚拟环境virtualenv的安装与使用详解

    Python虚拟环境virtualenv的安装与使用详解

    virtualenv可以用来管理互不干扰的独立python虚拟环境,在有些场景下非常有用,下面这篇文章主要给大家介绍了Python虚拟环境virtualenv安装与使用的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-05-05
  • NumPy 基本切片和索引的具体使用方法

    NumPy 基本切片和索引的具体使用方法

    这篇文章主要介绍了NumPy 基本切片和索引的具体使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • python使用datetime模块处理日期时间及常用功能详解

    python使用datetime模块处理日期时间及常用功能详解

    datetime模块是Python标准库中用于处理日期和时间的模块,在本节中,我们将介绍datetime模块的一些常用功能,并通过实例代码详细讲解每个知识点,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2023-06-06
  • Python实现区域填充的示例代码

    Python实现区域填充的示例代码

    这篇文章主要介绍了Python实现区域填充的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02

最新评论