[关闭]
@Perfect-Demo 2018-12-17T01:31:53.000000Z 字数 1965 阅读 933

(4)摄像头视频实时特征跟踪

opencv+dlib


目标追踪感觉高大上,但是,如果不要求极致的效果,普通目标追踪,其实也就那么回事。
dlib提供了dlib.correlation_tracker()类用于跟踪目标
官方文档中有介绍,此不赘述,直接上代码,里面有注释解释

  1. import sys
  2. import dlib
  3. import cv2
  4. tracker = dlib.correlation_tracker() # 导入correlation_tracker()类
  5. cap = cv2.VideoCapture(0) # OpenCV打开摄像头
  6. start_flag = True # 标记,是否是第一帧,若在第一帧需要先初始化
  7. selection = None # 实时跟踪鼠标的跟踪区域
  8. track_window = None # 要检测的物体所在区域
  9. drag_start = None # 标记,是否开始拖动鼠标
  10. # 鼠标点击事件回调函数
  11. def onMouseClicked(event, x, y, flags, param):
  12. global selection, track_window, drag_start # 定义全局变量
  13. if event == cv2.EVENT_LBUTTONDOWN: # 鼠标左键按下
  14. drag_start = (x, y)
  15. track_window = None
  16. if drag_start: # 是否开始拖动鼠标,记录鼠标位置
  17. xMin = min(x, drag_start[0])
  18. yMin = min(y, drag_start[1])
  19. xMax = max(x, drag_start[0])
  20. yMax = max(y, drag_start[1])
  21. selection = (xMin, yMin, xMax, yMax)
  22. if event == cv2.EVENT_LBUTTONUP: # 鼠标左键松开
  23. drag_start = None
  24. track_window = selection
  25. selection = None
  26. if __name__ == '__main__':
  27. cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE)
  28. cv2.setMouseCallback("image", onMouseClicked)
  29. # opencv的bgr格式图片转换成rgb格式
  30. # b, g, r = cv2.split(frame)
  31. # frame2 = cv2.merge([r, g, b])
  32. while(1):
  33. ret, frame = cap.read() # 从摄像头读入1帧
  34. if start_flag == True: # 如果是第一帧,需要先初始化
  35. # 这里是初始化,窗口中会停在当前帧,用鼠标拖拽一个框来指定区域,随后会跟踪这个目标;我们需要先找到目标才能跟踪不是吗?
  36. while True:
  37. img_first = frame.copy() # 不改变原来的帧,拷贝一个新的出来
  38. if track_window: # 跟踪目标的窗口画出来了,就实时标出来
  39. cv2.rectangle(img_first, (track_window[0], track_window[1]), (track_window[2], track_window[3]), (0,0,255), 1)
  40. elif selection: # 跟踪目标的窗口随鼠标拖动实时显示
  41. cv2.rectangle(img_first, (selection[0], selection[1]), (selection[2], selection[3]), (0,0,255), 1)
  42. cv2.imshow("image", img_first)
  43. # 按下回车,退出循环
  44. if cv2.waitKey(10) & 0xFF == ord('\n'):
  45. break
  46. start_flag = False # 初始化完毕,不再是第一帧了
  47. tracker.start_track(frame, dlib.rectangle(track_window[0], track_window[1], track_window[2], track_window[3])) # 跟踪目标,目标就是选定目标窗口中的
  48. else:
  49. tracker.update(frame) # 更新,实时跟踪
  50. box_predict = tracker.get_position() # 得到目标的位置
  51. cv2.rectangle(frame,(int(box_predict.left()),int(box_predict.top())),(int(box_predict.right()),int(box_predict.bottom())),(0,255,255),1) # 用矩形框标注出来
  52. cv2.imshow("image", frame)
  53. # 如果按下ESC键,就退出
  54. if cv2.waitKey(10) == 27:
  55. break
  56. cap.release()
  57. cv2.destroyAllWindows()
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注