@Perfect-Demo
2018-12-17T01:31:53.000000Z
字数 1965
阅读 1062
opencv+dlib
目标追踪感觉高大上,但是,如果不要求极致的效果,普通目标追踪,其实也就那么回事。
dlib提供了dlib.correlation_tracker()类用于跟踪目标
官方文档中有介绍,此不赘述,直接上代码,里面有注释解释
import sysimport dlibimport cv2tracker = dlib.correlation_tracker() # 导入correlation_tracker()类cap = cv2.VideoCapture(0) # OpenCV打开摄像头start_flag = True # 标记,是否是第一帧,若在第一帧需要先初始化selection = None # 实时跟踪鼠标的跟踪区域track_window = None # 要检测的物体所在区域drag_start = None # 标记,是否开始拖动鼠标# 鼠标点击事件回调函数def onMouseClicked(event, x, y, flags, param):global selection, track_window, drag_start # 定义全局变量if event == cv2.EVENT_LBUTTONDOWN: # 鼠标左键按下drag_start = (x, y)track_window = Noneif drag_start: # 是否开始拖动鼠标,记录鼠标位置xMin = min(x, drag_start[0])yMin = min(y, drag_start[1])xMax = max(x, drag_start[0])yMax = max(y, drag_start[1])selection = (xMin, yMin, xMax, yMax)if event == cv2.EVENT_LBUTTONUP: # 鼠标左键松开drag_start = Nonetrack_window = selectionselection = Noneif __name__ == '__main__':cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE)cv2.setMouseCallback("image", onMouseClicked)# opencv的bgr格式图片转换成rgb格式# b, g, r = cv2.split(frame)# frame2 = cv2.merge([r, g, b])while(1):ret, frame = cap.read() # 从摄像头读入1帧if start_flag == True: # 如果是第一帧,需要先初始化# 这里是初始化,窗口中会停在当前帧,用鼠标拖拽一个框来指定区域,随后会跟踪这个目标;我们需要先找到目标才能跟踪不是吗?while True:img_first = frame.copy() # 不改变原来的帧,拷贝一个新的出来if track_window: # 跟踪目标的窗口画出来了,就实时标出来cv2.rectangle(img_first, (track_window[0], track_window[1]), (track_window[2], track_window[3]), (0,0,255), 1)elif selection: # 跟踪目标的窗口随鼠标拖动实时显示cv2.rectangle(img_first, (selection[0], selection[1]), (selection[2], selection[3]), (0,0,255), 1)cv2.imshow("image", img_first)# 按下回车,退出循环if cv2.waitKey(10) & 0xFF == ord('\n'):breakstart_flag = False # 初始化完毕,不再是第一帧了tracker.start_track(frame, dlib.rectangle(track_window[0], track_window[1], track_window[2], track_window[3])) # 跟踪目标,目标就是选定目标窗口中的else:tracker.update(frame) # 更新,实时跟踪box_predict = tracker.get_position() # 得到目标的位置cv2.rectangle(frame,(int(box_predict.left()),int(box_predict.top())),(int(box_predict.right()),int(box_predict.bottom())),(0,255,255),1) # 用矩形框标注出来cv2.imshow("image", frame)# 如果按下ESC键,就退出if cv2.waitKey(10) == 27:breakcap.release()cv2.destroyAllWindows()