图像跟踪算法,我们由浅入深[狗头],先了解传统视觉里的跟踪算法。
传统视觉的图像跟踪。首先需要手动选出我们要识别的物体。随后使用跟踪算法实现跟踪,较为容易的就是opencv 自带的图像跟踪算法。
实验前的小测试[太阳]
目前OpenCV4版本中自带了8种目标跟踪算法。
下面是我经过测试做的总结
- BOOSTING:算法原理类似于Haar cascades (AdaBoost),是一种很老的算法。这个算法速度慢并且不是很准。
- MIL:比BOOSTING准一点。
- KCF:速度比BOOSTING和MIL更快,与BOOSTING和MIL一样不能很好地处理遮挡问题。
- CSRT:比KCF更准一些,但是速度比KCF稍慢。
- MedianFlow:对于快速移动的目标和外形变化迅速的目标效果不好。
- TLD:会产生较多的false-positives。
- MOSSE:算法速度非常快,但是准确率比不上KCF和CSRT。在一些追求算法速度的场合很适用。
- GOTURN:OpenCV中自带的唯一一个基于深度学习的算法。运行算法需要提前*载下**好模型文件。
综合算法速度和准确率考虑,个人觉得CSRT、KCF、MOSSE这三个目标跟踪算法较好。
一起开始动手做跟踪器吧!
Step1 打开摄像头选取跟踪的物体[太阳]
初始化视频捕获设备,我选择使用摄像头,jupyter 运行python程序
步骤如下:
- 打开摄像头
- 进入逻辑循环
- 读取摄像头图像
- 按回车按键确定绘制帧
- 框取跟踪的物体按回车按键确定
代码如下:
cap= cv2.VideoCapture(0)
print("按回车键选取当前帧")
while True:
gCapStatus,gFrame = cap.read()
if (gCapStatus == False):
print("捕获帧失败")
quit()
cv2.imshow("pick frame",gFrame)
key = cv2.waitKey(1) & 0xFF
if(key == 13):
break
# 框选感兴趣区域
cv2.destroyWindow("pick frame")
gROI = cv2.selectROI("ROI frame",gFrame,False)
if (not gROI):
print("空框选,退出")
quit()
cv2.destroyAllWindows()
演示如下[机智]

Step2 跟踪
所选物体[太阳]
- 初始化*踪器追**KCF ,跟踪器类Tracker的代码需要的请留下邮箱,邮件发送源代码(仅供学习交流)
- 循环读取图像
- 跟踪输出图像
代码如下:
# 初始化*踪器追**
#'BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN'
gTracker = Tracker(tracker_type="KCF")
gTracker.initWorking(gFrame,gROI)
# 循环帧读取,开始跟踪
while True:
gCapStatus, gFrame = cap.read()
if(gCapStatus):
# 展示跟踪图片
_item = gTracker.track(gFrame)
gFrame=_item.getFrame()
cv2.imshow("track result",gFrame)
gFrame=cv2.resize(gFrame,(640,480))
if _item.getMessage():
# 打印跟踪数据
print(_item.getMessage())
else:
# 丢失,重新用初始ROI初始
print("丢失,重新使用初始ROI开始")
gTracker = Tracker(tracker_type="KCF")
gTracker.initWorking(gFrame, gROI)
key = cv2.waitKey(1) & 0xFF
if (key == ord('q')) | (key == 27):
break
else:
print("捕获帧失败")
break
cv2.destroyAllWindows()
效果展示[机智]

学习更多视觉内容,关注我持续更新中。[作揖][来看我]