当前位置:   article > 正文

python调用opencv库中的KCF等跟踪算法_kcf python opencv

kcf python opencv

使用python调用opencv库中的KCF等跟踪算法

本文参考了以下博客代码来源:python+opencv实现目标跟踪 - qq_35488769的博客 - CSDN博客

 

0 - 环境说明

由于opencv版本的变化,部分函数的调用名称也产生了变化,这里为了兼容opencv3以下部分版本以及opencv4的版本,在代码中加入了简单的版本判断,根据版本调用不同的函数名称。

代码目前在两个环境中测试通过,分别是 python 3.7 + opencv 3.4.2 与 python 3.8 + opencv 4.0.1。

1 - 代码

  1. import cv2
  2. class MessageItem(object):
  3. # 用于封装信息的类,包含图片和其他信息
  4. def __init__(self,frame,message):
  5. self._frame = frame
  6. self._message = message
  7. def getFrame(self):
  8. # 图片信息
  9. return self._frame
  10. def getMessage(self):
  11. #文字信息,json格式
  12. return self._message
  13. class Tracker(object):
  14. '''
  15. 追踪者模块,用于追踪指定目标
  16. '''
  17. def __init__(self, tracker_type="BOOSTING", draw_coord=True):
  18. '''
  19. 初始化追踪器种类
  20. '''
  21. # 获得opencv版本
  22. (major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
  23. self.tracker_types = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
  24. self.tracker_type = tracker_type
  25. self.isWorking = False
  26. self.draw_coord = draw_coord
  27. # 构造追踪器
  28. if int(major_ver) < 3:
  29. self.tracker = cv2.Tracker_create(tracker_type)
  30. else:
  31. if tracker_type == 'BOOSTING':
  32. self.tracker = cv2.TrackerBoosting_create()
  33. if tracker_type == 'MIL':
  34. self.tracker = cv2.TrackerMIL_create()
  35. if tracker_type == 'KCF':
  36. self.tracker = cv2.TrackerKCF_create()
  37. if tracker_type == 'TLD':
  38. self.tracker = cv2.TrackerTLD_create()
  39. if tracker_type == 'MEDIANFLOW':
  40. self.tracker = cv2.TrackerMedianFlow_create()
  41. if tracker_type == 'GOTURN':
  42. self.tracker = cv2.TrackerGOTURN_create()
  43. def initWorking(self, frame, box):
  44. '''
  45. 追踪器工作初始化
  46. frame:初始化追踪画面
  47. box:追踪的区域
  48. '''
  49. if not self.tracker:
  50. raise Exception("追踪器未初始化")
  51. status = self.tracker.init(frame, box)
  52. if not status:
  53. raise Exception("追踪器工作初始化失败")
  54. self.coord = box
  55. self.isWorking = True
  56. def track(self, frame):
  57. '''
  58. 开启追踪
  59. '''
  60. message = None
  61. if self.isWorking:
  62. status, self.coord = self.tracker.update(frame)
  63. if status:
  64. message = {"coord": [((int(self.coord[0]), int(self.coord[1])),
  65. (int(self.coord[0] + self.coord[2]), int(self.coord[1] + self.coord[3])))]}
  66. if self.draw_coord:
  67. p1 = (int(self.coord[0]), int(self.coord[1]))
  68. p2 = (int(self.coord[0] + self.coord[2]), int(self.coord[1] + self.coord[3]))
  69. cv2.rectangle(frame, p1, p2, (255, 0, 0), 2, 1)
  70. message['msg'] = "is tracking"
  71. return MessageItem(frame, message)
  72. if __name__ == '__main__':
  73. # 初始化视频捕获设备
  74. gVideoDevice = cv2.VideoCapture(0)
  75. gCapStatus, gFrame = gVideoDevice.read()
  76. # 选择 框选帧
  77. print("按 n 选择下一帧,按 y 选取当前帧")
  78. while True:
  79. if (gCapStatus == False):
  80. print("捕获帧失败")
  81. quit()
  82. _key = cv2.waitKey(0) & 0xFF
  83. if(_key == ord('n')):
  84. gCapStatus,gFrame = gVideoDevice.read()
  85. if(_key == ord('y')):
  86. break
  87. cv2.imshow("pick frame",gFrame)
  88. # 框选感兴趣区域region of interest
  89. cv2.destroyWindow("pick frame")
  90. gROI = cv2.selectROI("ROI frame",gFrame,False)
  91. if (not gROI):
  92. print("空框选,退出")
  93. quit()
  94. # 初始化追踪器
  95. gTracker = Tracker(tracker_type="KCF")
  96. gTracker.initWorking(gFrame,gROI)
  97. # 循环帧读取,开始跟踪
  98. while True:
  99. gCapStatus, gFrame = gVideoDevice.read()
  100. if(gCapStatus):
  101. # 展示跟踪图片
  102. _item = gTracker.track(gFrame)
  103. cv2.imshow("track result",_item.getFrame())
  104. if _item.getMessage():
  105. # 打印跟踪数据
  106. print(_item.getMessage())
  107. else:
  108. # 丢失,重新用初始ROI初始
  109. print("丢失,重新使用初始ROI开始")
  110. gTracker = Tracker(tracker_type="KCF")
  111. gTracker.initWorking(gFrame, gROI)
  112. _key = cv2.waitKey(1) & 0xFF
  113. if (_key == ord('q')) | (_key == 27):
  114. break
  115. if (_key == ord('r')) :
  116. # 用户请求用初始ROI
  117. print("用户请求用初始ROI")
  118. gTracker = Tracker(tracker_type="KCF")
  119. gTracker.initWorking(gFrame, gROI)
  120. else:
  121. print("捕获帧失败")
  122. quit()

2 - 部分解析

虽然代码中已经写好了注释,但是这里还是简单介绍一下。这份代码中是调用opencv库中的追踪器进行图像视频追踪,追踪器可选

在程序最开始,会抓拍一帧图片,供用户选择是否在这张图片上框选 ROI (region of interest) ,‘n’ 键选择下一帧,‘y’键选择当前帧,选择完毕后弹出ROI框选窗口

这里我们定义了一个 Tracker 类,类中可以在初始化时选择使用不同的跟踪算法,Tracker 类初始化完毕后调用 initWorking方法,传入待选帧和 ROI 区域,

之后,就可以循环获取图像帧,然后调用 Tracker 类的 track 方法,将新获取的帧丢入,获得追踪结果图片以及相关信息。追踪结果图片以及相关信息按照 MessageItem 类的方式保存

我们可以看到,在循环读取帧追踪的代码里,有部分代码是用来处理错误情况的。一个是当跟踪器自己发现丢失时,重新使用最初标定的 ROI 重新开始追踪;另一个是当用户判断这个结果实在惨不忍睹出现偏差,需要手动重置时,按下 'r’ 重新使用最初标定的 ROI 重新开始追踪 

3 - 代码测试

救救穷学生,5毛买个辣条也可
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/78587
推荐阅读
相关标签
  

闽ICP备14008679号