44 dlib鼠标指定目标跟踪
dlib提供了dlib.correlation_tracker()类用于跟踪目标。
官方文档入口:http://dlib.net/python/index.html#dlib.correlation_tracker
不复杂,就不介绍了,后面会直接给出两个程序,有注释。
# -*- coding: utf-8 -*-
import sys
import dlib
import cv2 tracker = 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 = None
if 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 = None
track_window = selection
selection = None if __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(5) == 13:
break
start_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:
break cap.release()
cv2.destroyAllWindows()
注:如果程序卡了,就调一下cv2.waitKey()中的参数,也就是延时时间,调小即可。
运行结果
初始时,窗口中只会显示第一帧的图像;
使用鼠标拖拽一个框,红框中目标后,按回车,设置框内为识别目标;
实时识别,以橙框标出;
按ESC键退出。
(csdn只能上传2M的图片,真心难受)
程序2
由于前面那个程序,只是熟悉下函数写的,我觉得用起来蛋疼,所以又重新封装了一下。看起来舒服多了。
# -*- coding: utf-8 -*-
import sys
import dlib
import cv2 class myCorrelationTracker(object):
def __init__(self, windowName='default window', cameraNum=0):
# 自定义几个状态标志
self.STATUS_RUN_WITHOUT_TRACKER = 0 # 不跟踪目标,但是实时显示
self.STATUS_RUN_WITH_TRACKER = 1 # 跟踪目标,实时显示
self.STATUS_PAUSE = 2 # 暂停,卡在当前帧
self.STATUS_BREAK = 3 # 退出
self.status = self.STATUS_RUN_WITHOUT_TRACKER # 指示状态的变量 # 这几个跟前面程序1定义的变量一样
self.track_window = None # 实时跟踪鼠标的跟踪区域
self.drag_start = None # 要检测的物体所在区域
self.start_flag = True # 标记,是否开始拖动鼠标 # 创建好显示窗口
cv2.namedWindow(windowName, cv2.WINDOW_AUTOSIZE)
cv2.setMouseCallback(windowName, self.onMouseClicked)
self.windowName = windowName # 打开摄像头
self.cap = cv2.VideoCapture(cameraNum) # correlation_tracker()类,跟踪器,跟程序1中一样
self.tracker = dlib.correlation_tracker() # 当前帧
self.frame = None # 按键处理函数
def keyEventHandler(self):
keyValue = cv2.waitKey(5) # 每隔5ms读取一次按键的键值
if keyValue == 27: # ESC
self.status = self.STATUS_BREAK
if keyValue == 32: # 空格
if self.status != self.STATUS_PAUSE: # 按下空格,暂停播放,可以选定跟踪的区域
#print self.status
self.status = self.STATUS_PAUSE
#print self.status
else: # 再按次空格,重新播放,但是不进行目标识别
if self.track_window:
self.status = self.STATUS_RUN_WITH_TRACKER
self.start_flag = True
else:
self.status = self.STATUS_RUN_WITHOUT_TRACKER
if keyValue == 13: # 回车
#print '**'
if self.status == self.STATUS_PAUSE: # 按下空格之后
if self.track_window: # 如果选定了区域,再按回车,表示确定选定区域为跟踪目标
self.status = self.STATUS_RUN_WITH_TRACKER
self.start_flag = True # 任务处理函数
def processHandler(self):
# 不跟踪目标,但是实时显示
if self.status == self.STATUS_RUN_WITHOUT_TRACKER:
ret, self.frame = self.cap.read()
cv2.imshow(self.windowName, self.frame)
# 暂停,暂停时使用鼠标拖动红框,选择目标区域,与程序1类似
elif self.status == self.STATUS_PAUSE:
img_first = self.frame.copy() # 不改变原来的帧,拷贝一个新的变量出来
if self.track_window: # 跟踪目标的窗口画出来了,就实时标出来
cv2.rectangle(img_first, (self.track_window[0], self.track_window[1]), (self.track_window[2], self.track_window[3]), (0,0,255), 1)
elif self.selection: # 跟踪目标的窗口随鼠标拖动实时显示
cv2.rectangle(img_first, (self.selection[0], self.selection[1]), (self.selection[2], self.selection[3]), (0,0,255), 1)
cv2.imshow(self.windowName, img_first)
# 退出
elif self.status == self.STATUS_BREAK:
self.cap.release() # 释放摄像头
cv2.destroyAllWindows() # 释放窗口
sys.exit() # 退出程序
# 跟踪目标,实时显示
elif self.status == self.STATUS_RUN_WITH_TRACKER:
ret, self.frame = self.cap.read() # 从摄像头读取一帧
if self.start_flag: # 如果是第一帧,需要先初始化
self.tracker.start_track(self.frame, dlib.rectangle(self.track_window[0], self.track_window[1], self.track_window[2], self.track_window[3])) # 开始跟踪目标
self.start_flag = False # 不再是第一帧
else:
self.tracker.update(self.frame) # 更新 # 得到目标的位置,并显示
box_predict = self.tracker.get_position()
cv2.rectangle(self.frame,(int(box_predict.left()),int(box_predict.top())),(int(box_predict.right()),int(box_predict.bottom())),(0,255,255),1)
cv2.imshow(self.windowName, self.frame) # 鼠标点击事件回调函数
def onMouseClicked(self, event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN: # 鼠标左键按下
self.drag_start = (x, y)
self.track_window = None
if self.drag_start: # 是否开始拖动鼠标,记录鼠标位置
xMin = min(x, self.drag_start[0])
yMin = min(y, self.drag_start[1])
xMax = max(x, self.drag_start[0])
yMax = max(y, self.drag_start[1])
self.selection = (xMin, yMin, xMax, yMax)
if event == cv2.EVENT_LBUTTONUP: # 鼠标左键松开
self.drag_start = None
self.track_window = self.selection
self.selection = None def run(self):
while(1):
self.keyEventHandler()
self.processHandler() if __name__ == '__main__':
testTracker = myCorrelationTracker(windowName='image', cameraNum=1)
testTracker.run()
运行结果
操作有一些改变:
初始时,会自动从摄像头采集图像显示;
按下空格,暂停;此时若再按空格,恢复实时显示,但不进行目标跟踪;
暂停时,拖动鼠标会显示红框,按下回车,将红框内物体视为目标进行识别;
随后实时识别,以橙框标出;
按ESC键退出。
dlib这个库的确很方便,能够很轻松地让我们实现一些基础的识别任务,比如人脸识别。但是如果想要在各种识别任务中有更好的效果,肯定是不能只用他给的模型的。那也就是说需要自己训练了,看到官方文档中也提供了一些训练以及自己构建神经网络等的api接口,
44 dlib鼠标指定目标跟踪的更多相关文章
- 用Camshift算法对指定目标进行跟踪
原理 Camshift算法是Continuously Adaptive Mean Shift algorithm的简称. 它是一个基于MeanSift的改进算法.它首次由Gary R.Bradski等 ...
- 目标跟踪之camshift---opencv中meanshift和camshift例子的应用
在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...
- 目标跟踪--CamShift
转载请注明出处! !! http://blog.csdn.net/zhonghuan1992 目标跟踪--CamShift CamShift全称是ContinuouslyAdaptive Mean S ...
- 目标跟踪之粒子滤波---Opencv实现粒子滤波算法
目标跟踪学习笔记_2(particle filter初探1) 目标跟踪学习笔记_3(particle filter初探2) 前面2篇博客已经提到当粒子数增加时会内存报错,后面又仔细查了下程序,是代码方 ...
- 目标跟踪ObjectT综述介绍
此文也很详细:http://blog.csdn.net/maochongsandai110/article/details/11530045 原文链接:http://blog.csdn.net/pp5 ...
- 用于扩展目标跟踪的笛卡尔B-Spline车辆模型
(哥廷根大学) 摘要 文章提出了一种表示空间扩展物体轮廓的新方法,该方法适用于采用激光雷达跟踪未知尺寸和方向的车辆.我们在笛卡尔坐标系中使用二次均匀周期的B-Splines直接表示目标的星 - 凸形状 ...
- MAML-Tracker: 目标跟踪分析:CVPR 2020(Oral)
MAML-Tracker: 目标跟踪分析:CVPR 2020(Oral) Tracking by Instance Detection: A Meta-Learning Approach 论文链接:h ...
- 目标跟踪_MeanShift
找到一些关于目标跟踪的资料 http://blog.csdn.net/jinshengtao/article/details/30258833 http://blog.sina.com.cn/s/bl ...
- TLD目标跟踪算法
1. 简介 TLD目标跟踪算法是Tracking-Learning-Detection算法的简称.这个视频跟踪算法框架由英国萨里大学的一个捷克籍博士生Zdenek Kalal提出.TLD将传统的视频跟 ...
随机推荐
- Codeforces Round #598 (Div. 3) E. Yet Another Division Into Teams dp
E. Yet Another Division Into Teams There are n students at your university. The programming skill of ...
- React: 认识React
一.简介 React-Native是Facebook开源的跨平台框架,用于实现前端和原生进行混合开发.React-Native开发可以很好的使用原生UI构建用户界面,与传统的使用WebView相比,不 ...
- source vimrc的时候报错:.vimrc:1: command not found: syntax
vim的配置如下: 1 syntax enable //语法高亮 2 set number //显示行号 3 set cursorline //突出显示当前行 4 set ruler //打开状态栏标 ...
- Golang面向并发的内存模型
Import Advanced Go Programming 1.5 面向并发的内存模型 在早期,CPU都是以单核的形式顺序执行机器指令.Go语言的祖先C语言正是这种顺序编程语言的代表.顺序编程语言中 ...
- IT兄弟连 Java语法教程 数组 多维数组 二维数组的初始化
二维数组的初始化与一位数组初始化类似,同样可以使用静态初始化或动态初始化. 1)静态初始化 静态初始化的格式如下: 数组名字 = new 数组元素的类型[][]{new 数组元素的类型[]{元素1,元 ...
- JVM GC系列 — GC算法
一.前言 从本篇文章开始,将开始一个新的系列JVM.JVM是一个非常庞大且复制的技术体系,但是对于程序猿的升级,走向更高阶所必要经历的,曾经也下决心要好好学习一番,然而毅力不足都中途放弃. GC的作用 ...
- 在Asp.net Razor Pages/MVC程序中集成Blazor
今天试了一下在Asp.net core Razor Pages/MVC程序中集成Blazor(Server-side),还是可以完美整合的,这里以Razor Pages为例(.net core 3.1 ...
- go-面向对象编程(下)
面向对象编程思想-抽象 抽象的介绍 我们在前面去定义一个结构体时候,实际上就是把一类事物的共有的 属性( 字段)和 行为( 方法)提取 出来,形成一个 物理模型(结构体).这种研究问题的方法称为抽象 ...
- SpringBoot(四) SpringBoot整合JdbcTemplate
一.数据准备CREATE TABLE `tb_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `username` varchar ...
- 漫谈golang设计模式 工厂模式
工厂模式 意义:创建过程交给专门的工厂子类去完成.定义一个抽象的工厂类,再定义具体的工厂类来生成子类等,它们实现在抽象按钮工厂类中定义的方法.这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引 ...