在我之前的博客,”C++实现 多目标跟踪+画出轨迹 - OpenCV函数调用测试“ 中用C++实现了多目标跟踪并画出轨迹,贴上标签的功能,现在将他移植到python上面去。文章末贴上我的代码。
环境:pycharm professional 2019.1 + opencv-python 4.2.0.32 + opencv-contrib-python 4.2.0.32 + python 3.7.0 + anaconda
之前只是学过一小段时间python,但是没怎么搞过python,这次差不多是重新来了,因此遇到了很多小儿科问题,比如:
- 我的pycharm过期了......找到了永久破解的办法懒得弄了,找了个激活码。
- tracker = cv2.TrackerBoosting_create() 等这些create的方法上出现提示,cannot find reference 'TrackingBoosting_create' in '__ini__.py' ,本以为这个是报错,百度了才知道这并不是报错,只是在ini.py中看不到罢了,好像是因为安装时候的原因?懒得继续弄了,就继续了。
- python的opencv有些方法跟C++的不一样,最直观的区别就是video >> frame,在python就不这么用。
- 慢慢去熟练python吧......
别的没啥可解释的了,要看详细解释,去看我C++实现的博客吧。
包含功能:
1. 按帧选取视频追踪起始点
2. 鼠标框选目标
3. 支持本地视频和摄像头两种方式
4. 给每个目标贴上标签
5. 画出轨迹
6. 将有轨迹的视频和没有轨迹的视频保存到本地
最新完整代码:
from __future__ import print_function
import sys
import cv2
from random import randint
import time
import os
trackerTypes = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'MOSSE', 'CSRT']
def createTrackerByName(trackerType):
# Create a tracker based on tracker name
if trackerType == trackerTypes[0]:
tracker = cv2.TrackerBoosting_create()
elif trackerType == trackerTypes[1]:
tracker = cv2.TrackerMIL_create()
elif trackerType == trackerTypes[2]:
tracker = cv2.TrackerKCF_create()
elif trackerType == trackerTypes[3]:
tracker = cv2.TrackerTLD_create()
elif trackerType == trackerTypes[4]:
tracker = cv2.TrackerMedianFlow_create()
elif trackerType == trackerTypes[5]:
tracker = cv2.TrackerMOSSE_create()
elif trackerType == trackerTypes[6]:
tracker = cv2.TrackerCSRT_create()
else:
tracker = None
print('Incorrect tracker name')
print('Available trackers are:')
for t in trackerTypes:
print(t)
return tracker
No = 0
if __name__ == '__main__':
vecPoints = []
while True:
vecPoints.clear()
while True:
print('\n------------------------------------------------------------------\n'
'\n>> 可测试算法有 BOOSTING MIL KCF TLD MEDIANFLOW MOSSE CSRT'
'\n>> 请输入要测试的算法并按回车,如需退出请输入exit。')
tType = input('>> ')
if tType == 'exit':
sys.exit(0)
if tType == 'BOOSTING':
print('>> 选择BOOSTING成功!')
break
elif tType == 'MIL':
print('>> 选择MIL成功!')
break
elif tType == 'KCF':
print('>> 选择KCF成功!')
break
elif tType == 'TLD':