当前位置:   article > 正文

Python实现 多目标跟踪+画出轨迹 - OpenCV函数调用测试_目标追踪和轨迹绘制

目标追踪和轨迹绘制

       在我之前的博客,”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. 将有轨迹的视频和没有轨迹的视频保存到本地

最新完整代码:

  1. from __future__ import print_function
  2. import sys
  3. import cv2
  4. from random import randint
  5. import time
  6. import os
  7. trackerTypes = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'MOSSE', 'CSRT']
  8. def createTrackerByName(trackerType):
  9. # Create a tracker based on tracker name
  10. if trackerType == trackerTypes[0]:
  11. tracker = cv2.TrackerBoosting_create()
  12. elif trackerType == trackerTypes[1]:
  13. tracker = cv2.TrackerMIL_create()
  14. elif trackerType == trackerTypes[2]:
  15. tracker = cv2.TrackerKCF_create()
  16. elif trackerType == trackerTypes[3]:
  17. tracker = cv2.TrackerTLD_create()
  18. elif trackerType == trackerTypes[4]:
  19. tracker = cv2.TrackerMedianFlow_create()
  20. elif trackerType == trackerTypes[5]:
  21. tracker = cv2.TrackerMOSSE_create()
  22. elif trackerType == trackerTypes[6]:
  23. tracker = cv2.TrackerCSRT_create()
  24. else:
  25. tracker = None
  26. print('Incorrect tracker name')
  27. print('Available trackers are:')
  28. for t in trackerTypes:
  29. print(t)
  30. return tracker
  31. No = 0
  32. if __name__ == '__main__':
  33. vecPoints = []
  34. while True:
  35. vecPoints.clear()
  36. while True:
  37. print('\n------------------------------------------------------------------\n'
  38. '\n>> 可测试算法有 BOOSTING MIL KCF TLD MEDIANFLOW MOSSE CSRT'
  39. '\n>> 请输入要测试的算法并按回车,如需退出请输入exit。')
  40. tType = input('>> ')
  41. if tType == 'exit':
  42. sys.exit(0)
  43. if tType == 'BOOSTING':
  44. print('>> 选择BOOSTING成功!')
  45. break
  46. elif tType == 'MIL':
  47. print('>> 选择MIL成功!')
  48. break
  49. elif tType == 'KCF':
  50. print('>> 选择KCF成功!')
  51. break
  52. elif tType == 'TLD':
  53. print('>> 选择TLD成功!')
  54. break
  55. elif tType == 'MEDIANFLOW':
  56. print('>> 选择MEDIANFLOW成功!')
  57. break
  58. elif tType == 'MOSSE':
  59. print('>> 选择MOSSE成功!')
  60. break
  61. elif tType == 'CSRT':
  62. print('>> 选择CSRT成功!')
  63. break
  64. else:
  65. print('>> 选择失败!')
  66. continue
  67. print('>> 输入1选择本地视频进行播放'
  68. '\n>> 输入2选择实时摄像头播放')
  69. judgement = input('>> ')
  70. if judgement == '1':
  71. while True:
  72. print('\n+----------------+'
  73. '\n| 1.步行的人_1 |'
  74. '\n| 2.步行的人_2 |'
  75. '\n| 3.步行的人_3 |'
  76. '\n| 4.车 |'
  77. '\n| 5.超车 |'
  78. '\n| 6.大卫 |'
  79. '\n| 7.跳绳 |'
  80. '\n| 8.摩托越野 |'
  81. '\n| 9.熊猫 |'
  82. '\n| 10.大众汽车 |'
  83. '\n+----------------+'
  84. '\n\n>> 请输入要播放视频的序列号(例如4)')
  85. videoNo = input('>> ')
  86. if videoNo == '1':
  87. videoName = 'pedestrian1.mpg'
  88. print('>> 选择《步行的人_1》成功!')
  89. break
  90. elif videoNo == '2':
  91. videoName = 'pedestrian2.mpg'
  92. print('>> 选择《步行的人_2》成功!')
  93. break
  94. elif videoNo == '3':
  95. videoName = 'pedestrian3.mpg'
  96. print('>> 选择《步行的人_3》成功!')
  97. break
  98. elif videoNo == '4':
  99. videoName = 'car.mpg'
  100. print('>> 选择《车》成功!')
  101. break
  102. elif videoNo == '5':
  103. videoName = 'carchase.mpg'
  104. print('>> 选择《超车》成功!')
  105. break
  106. elif videoNo == '6':
  107. videoName = 'david.mpg'
  108. print('>> 选择《大卫》成功!')
  109. break
  110. elif videoNo == '7':
  111. videoName = 'jumping.mpg'
  112. print('>> 选择《跳绳》成功!')
  113. break
  114. elif videoNo == '8':
  115. videoName = 'motocross.mpg'
  116. print('>> 选择《摩托越野》成功!')
  117. break
  118. elif videoNo == '9':
  119. videoName = 'panda.mpg'
  120. print('>> 选择《熊猫》成功!')
  121. break
  122. elif videoNo == '10':
  123. videoName = 'volkswagen.mpg'
  124. print('>> 选择《大众汽车》成功!')
  125. break
  126. else:
  127. print('>> 序列号有误,请重新输入!')
  128. continue
  129. video = cv2.VideoCapture('.\\datasets\\' + videoName)
  130. if not video.isOpened():
  131. print('>> 读取视频失败')
  132. continue
  133. print('\n+--------------------------+'
  134. '\n| 点击 c 逐帧播放视频 |'
  135. '\n| 点击 q 开始选择目标 |'
  136. '\n| 点击空格开始播放并跟踪 |'
  137. '\n| 播放期间按 q 退出播放 |'
  138. '\n+--------------------------+\n')
  139. time_t = time.strftime('%Y.%m.%d %H-%M-%S', time.localtime(time.time()))
  140. outDir = 'E:\\targetTracking\\pyMultiTracker\\saveVideo\\Video-' + time_t
  141. os.mkdir(outDir)
  142. outFile_1 = outDir + '\\videoNoTrack.avi'
  143. outFile_2 = outDir + '\\videoWithTrack.avi'
  144. s = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
  145. r = video.get(cv2.CAP_PROP_FPS)
  146. write_1 = cv2.VideoWriter(outFile_1, 0, r, s, True)
  147. write_2 = cv2.VideoWriter(outFile_2, 0, r, s, True)
  148. success, frame = video.read()
  149. if not success:
  150. print('>> 读取视频失败')
  151. continue
  152. cv2.imshow('Tracker', frame)
  153. while True:
  154. key = cv2.waitKey(1)
  155. if key == ord('c') or key == ord('C'):
  156. success, frame = video.read()
  157. cv2.imshow('Tracker', frame)
  158. write_1.write(frame)
  159. write_2.write(frame)
  160. if key == ord('q') or key == ord('Q'):
  161. break
  162. cv2.destroyWindow('Tracker')
  163. bboxes = []
  164. colors = []
  165. while True:
  166. # draw bounding boxes over objects
  167. # selectROI's default behaviour is to draw box starting from the center
  168. # when fromCenter is set to false, you can draw box starting from top left corner
  169. bbox = cv2.selectROI('Tracker', frame)
  170. bboxes.append(bbox)
  171. colors.append((randint(64, 255), randint(64, 255), randint(64, 255)))
  172. print("Press q to quit selecting boxes and start tracking")
  173. print("Press any other key to select next object")
  174. k = cv2.waitKey(0) & 0xFF
  175. if (k == 113): # q is pressed
  176. break
  177. # print('Selected bounding boxes {}'.format(bboxes))
  178. # Create MultiTracker object
  179. multiTracker = cv2.MultiTracker_create()
  180. # Initialize MultiTracker
  181. for bbox in bboxes:
  182. multiTracker.add(createTrackerByName(tType), frame, bbox)
  183. temp = []
  184. vecPoints.append(temp)
  185. print('>> 开始播放')
  186. # Process video and track objects
  187. while video.isOpened():
  188. success, frame = video.read()
  189. if not success:
  190. break
  191. write_1.write(frame)
  192. # write_2.write(frame)
  193. # get updated location of objects in subsequent frames
  194. success, boxes = multiTracker.update(frame)
  195. # draw tracked objects
  196. for i, newbox in enumerate(boxes):
  197. p1 = (int(newbox[0]), int(newbox[1]))
  198. p2 = (int(newbox[0] + newbox[2]), int(newbox[1] + newbox[3]))
  199. cv2.rectangle(frame, p1, p2, colors[i], 2, 1)
  200. for i, newbox in enumerate(boxes):
  201. vecPoints[i].append((int(newbox[0] + (newbox[2] * 0.5))*2, int(newbox[1] + (newbox[3] * 0.5))*2))
  202. if len(vecPoints) > 0:
  203. for i in range(len(vecPoints)):
  204. for j in range(len(vecPoints[i])-1):
  205. cv2.line(frame, vecPoints[i][j], vecPoints[i][j+1], colors[i], 1, 8, 1)
  206. for i, newbox in enumerate(boxes):
  207. cv2.putText(frame, 'id_'+str(i+1), (int(newbox[0]), int(newbox[1])-3), cv2.FONT_HERSHEY_PLAIN, 1, colors[i], 1)
  208. # show frame
  209. cv2.imshow('Tracker', frame)
  210. # write_1.write(frame)
  211. write_2.write(frame)
  212. # quit on ESC button
  213. if cv2.waitKey(30) == ord('q') or cv2.waitKey(30) == ord('Q'):
  214. break
  215. write_1.release()
  216. write_2.release()
  217. print('\n>> 视频保存完毕。')
  218. cv2.destroyWindow('Tracker')
  219. print('>> 播放完毕')
  220. elif judgement == '2':
  221. video = cv2.VideoCapture(0)
  222. if not video.isOpened():
  223. print('>> 发生错误,请检查摄像头是否已断开!')
  224. continue
  225. time_t = time.strftime('%Y.%m.%d %H-%M-%S', time.localtime(time.time()))
  226. outDir = 'E:\\targetTracking\\pyMultiTracker\\saveVideo\\Camera-' + time_t
  227. os.mkdir(outDir)
  228. outFile_1 = outDir + '\\videoNoTrack.avi'
  229. outFile_2 = outDir + '\\videoWithTrack.avi'
  230. s = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
  231. r = video.get(cv2.CAP_PROP_FPS)
  232. write_1 = cv2.VideoWriter(outFile_1, 0, r, s, True)
  233. write_2 = cv2.VideoWriter(outFile_2, 0, r, s, True)
  234. # print(outDir)
  235. print('>> 请按空格开始截取图片')
  236. while True:
  237. success, frame = video.read()
  238. if not success:
  239. print('>> 发生错误,请检查摄像头是否已断开!')
  240. break
  241. cv2.imshow('Tracker', frame)
  242. write_1.write(frame)
  243. write_2.write(frame)
  244. # cv2.imwrite('E:\\targetTracking\\pyMultiTracker\\saveVideo\\pic\\' + str(No) + '.bmp', frame)
  245. # No = No + 1
  246. if cv2.waitKey(1) == ord(' '):
  247. break
  248. bboxes = []
  249. colors = []
  250. while True:
  251. # draw bounding boxes over objects
  252. # selectROI's default behaviour is to draw box starting from the center
  253. # when fromCenter is set to false, you can draw box starting from top left corner
  254. bbox = cv2.selectROI('Tracker', frame)
  255. bboxes.append(bbox)
  256. colors.append((randint(64, 255), randint(64, 255), randint(64, 255)))
  257. print("Press q to quit selecting boxes and start tracking")
  258. print("Press any other key to select next object")
  259. k = cv2.waitKey(0) & 0xFF
  260. if (k == 113): # q is pressed
  261. break
  262. # print('Selected bounding boxes {}'.format(bboxes))
  263. # Create MultiTracker object
  264. multiTracker = cv2.MultiTracker_create()
  265. # Initialize MultiTracker
  266. for bbox in bboxes:
  267. multiTracker.add(createTrackerByName(tType), frame, bbox)
  268. temp = []
  269. vecPoints.append(temp)
  270. print('>> 开始播放')
  271. # Process video and track objects
  272. while video.isOpened():
  273. success, frame = video.read()
  274. if not success:
  275. break
  276. write_1.write(frame)
  277. # write_1.write(frame)
  278. # write_2.write(frame)
  279. print('before-' + str(id(frame)))
  280. # get updated location of objects in subsequent frames
  281. success, boxes = multiTracker.update(frame)
  282. # draw tracked objects
  283. for i, newbox in enumerate(boxes):
  284. p1 = (int(newbox[0]), int(newbox[1]))
  285. p2 = (int(newbox[0] + newbox[2]), int(newbox[1] + newbox[3]))
  286. cv2.rectangle(frame, p1, p2, colors[i], 2, 1)
  287. for i, newbox in enumerate(boxes):
  288. vecPoints[i].append(
  289. (int(newbox[0] + (newbox[2] * 0.5)) * 2, int(newbox[1] + (newbox[3] * 0.5)) * 2))
  290. if len(vecPoints) > 0:
  291. for i in range(len(vecPoints)):
  292. for j in range(len(vecPoints[i]) - 1):
  293. cv2.line(frame, vecPoints[i][j], vecPoints[i][j + 1], colors[i], 1, 8, 1)
  294. for i, newbox in enumerate(boxes):
  295. cv2.putText(frame, 'id_' + str(i + 1), (int(newbox[0]), int(newbox[1]) - 3), cv2.FONT_HERSHEY_PLAIN,
  296. 1, colors[i], 1)
  297. # show frame
  298. cv2.imshow('Tracker', frame)
  299. # write_1.write(frame)
  300. write_2.write(frame)
  301. # write_2.write(frame)
  302. print('after-' + str(id(frame)))
  303. # cv2.imwrite('E:\\targetTracking\\pyMultiTracker\\saveVideo\\pic\\' + str(No) + '.bmp', frame)
  304. # No = No + 1
  305. # quit on ESC button
  306. if cv2.waitKey(30) == ord('q') or cv2.waitKey(30) == ord('Q'):
  307. break
  308. write_1.release()
  309. write_2.release()
  310. print('\n>> 视频保存完毕。')
  311. cv2.destroyWindow('Tracker')
  312. print('\n>> 播放完毕\n')
  313. else:
  314. print('>> 输入有误')
  315. sys.exit(1)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/299196
推荐阅读
相关标签
  

闽ICP备14008679号