ROSOpenTLD技术文档

上传人:re****.1 文档编号:486247415 上传时间:2023-11-11 格式:DOCX 页数:15 大小:125.40KB
返回 下载 相关 举报
ROSOpenTLD技术文档_第1页
第1页 / 共15页
ROSOpenTLD技术文档_第2页
第2页 / 共15页
ROSOpenTLD技术文档_第3页
第3页 / 共15页
ROSOpenTLD技术文档_第4页
第4页 / 共15页
ROSOpenTLD技术文档_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《ROSOpenTLD技术文档》由会员分享,可在线阅读,更多相关《ROSOpenTLD技术文档(15页珍藏版)》请在金锄头文库上搜索。

1、ROS-OpenTLD 技术文档李明龙 2014 .11.19 1、简介TLD算法全称为tracking-learning-detecting算法,旨在实现长期的单目标跟踪,具有实时性和鲁棒性。ROS-OpenTLD是由大牛Ronan Chauvin所编写,创建日期为2012年6月8日,为George Nebehay所编写的C+版本TLD算法实现ROS封装并提供接口(TLD算法的原作者为捷克籍博士Zdenek Kalal,用MATLAB和C编写)。需要补充的是,无论是原作者Zdenek的MATLAB代码,George的C+代码,还是由Ronan所实现的ROS封装,都遵循GPL开源协议,允许复制

2、,保存,修改,重新发布甚至做产品,但是必须附上原作者的名字,具体参考GPL开源协议文档(ROS中使用BSD开源协议,限制更少,比GPL更宽松)。2、实现 2.1 TLD算法思想概述图1 TLD算法总体框架TLD算法的总体实现如图1所示,包括四大模块:跟踪,学习,检测以及集成模块。视频帧输入之后,通过学习模块不断对在线目标模型进行实时更新,同时学习模块也担任着另一个任务,那就是实时更新跟踪模块和检测模块中所需要的一些阈值(阈值初始由yml文件读入,是人为设置的经验参数,后期根据所跟踪目标的不同进行实时的训练,最终收敛。)跟踪模块通过中值流(median flow)跟踪法会预测出一个下一帧的目标位

3、置。检测模块通过级联分类器(cascade classfier,由阈值分类器,随机森林分类器,最近邻分类器三个分类器组成),会检测出一定数量(不一定是一个,可能是多个)的下一帧的目标位置。综合模块就对这两类目标位置进行综合,从而得出一个最合适的目标位置,通过图像框(bounding box)的方式显示出来,并把这个最优图像框反馈给学习模块,来丰富他的训练集。就这样一帧一帧的循环迭代,实现了实时而又鲁棒的单目标跟踪。 2.2 ROS中的封装2.2.1消息格式(message format) 在阐述封装实现细节之前,首先列举ROS 包所定义的消息格式: 1、BoundingBox,表示图像框bou

4、ndingbox。 Header headerint32 xint32 yint32 widthint32 heightfloat32 confidencex, y, width, height分别表示目标图像框的位置坐标以及宽和高,confidence这个浮点变量表示的是所跟踪到的目标的置信度(与目标模型的符合程度)。 2、Target,表示目标 BoundingBox bbsensor_msgs/Image img target格式的message中包含一个BoundingBox类型的变脸bb,同时包含一个img类,img类定义在sensor_msgs包中,ROS用sensor_msgs/

5、Image来传输图像,但是image格式是ROS所能识别和处理的,要让openCV也能识别和处理,必须借助于CvBridge来相互转化(见附录一)。2.2.2 参量、发布者和订阅者 首先列举作者所定义的一些参量:ros:NodeHandle np();np.param(showOutput, showOutput, true);np.param(loadModel, loadModel, false);np.param(autoFaceDetection, autoFaceDetection, false);np.param(exportModelAfterRun, exportModelAf

6、terRun, false);np.param(modelImportFile, modelImportFile, std:string(model);np.param(modelExportFile, modelExportFile, std:string(model);np.param(cascadePath, face_cascade_path, std:string(haarcascade_frontalface_alt.xml);np.param(x, target_bb.x, 100);np.param(y, target_bb.y, 100);np.param(width, ta

7、rget_bb.width, 100);np.param(height, target_bb.height, 100);np.param(correctBB, correctBB, false); 作者对于参量的命名十分具体,例如loadModel表示载入模型,在这里不做叙述。下面列举作者所定义的两个发布者和三个订阅者:pub1 = n.advertise(tld_tracked_object, 1000, true);pub2 = n.advertise(tld_fps, 1000, true);sub1 = n.subscribe(image, 1000, &Main:imageRecei

8、vedCB, this);sub2 = n.subscribe(bounding_box, 1000, &Main:targetReceivedCB, this);sub3 = n.subscribe(cmds, 1000, &Main:cmdReceivedCB, this); pub1在tld_tracked_object主题上发布消息,发布的消息格式是boundingbox,用图像框代表被跟踪的目标;pub2在tld_fps主题上发布消息,表示tld中的帧速率;sub1在image主题上接收消息,调用回调函数imageReceivedCB,表示接收了待检测的图像片时的处理过程;sub2在

9、bounding box主题上接收消息,调用回调函数targetReceivedCB,表示接收了被检测到的目标图像框时的处理过程;sub3在cmds主题上接收消息,调用回调函数cmdReceivedCB,表示接收了外部命令时的处理过程。2.2.3 有限状态机作者在ROS中的封装,把一些George所编写的C+版本中实现的既有函数当做黑箱,只考虑其功能和输入输出,不考虑实现细节,直接调用。同时运用了有限状态机的思想,在while (ros:ok()循环体中实现这四个状态:1、INIT 2、TRACKER_INIT 3、TRACKING4、STOPPED下面通过一一阐述这四个状态及其相互转换,来叙

10、述算法的实现过程。1、INIT状态: case INIT:if(newImageReceived() if(showOutput) sendTrackedObject(0, 0, 0, 0, 0.0); getLastImageFromBuffer(); tld-detectorCascade-imgWidth = gray.cols; tld-detectorCascade-imgHeight = gray.rows; tld-detectorCascade-imgWidthStep = gray.step; state = TRACKER_INIT; break; 在INIT状态中,如果新

11、图像片被接收,那么sendTrackedObject函数调用pub1,把被跟踪的图像片发布出来,同时getLastImageFromBuffer,从缓冲池中调取最新一阵的图像片位置,把它的位置和扫描步长都赋给级联检测器detectorCascade,这一系列工作都完成后,转到TRACKER_INIT状态。2、TRACKER_INIT状态case TRACKER_INIT: if(loadModel & !modelImport() ROS_INFO(Loading model %s, modelImport(); tld-readFrom(); tld-learningEnabled = fa

12、lse; state = TRACKING; else if(autoFaceDetection | correctBB) if(autoFaceDetection) target_image = gray; target_bb = faceDetection(); sendTrackedObject(target_bb.x,target_bb.y,target_bb.width,target_bb.height,1.0); ROS_INFO(Starting at %d %d %d %dn, target_bb.x, target_bb.y, target_bb.width, target_bb.height); tld-selectObject(target_image, &target_bb); tld-learningEnabled = true; state = TRACKING; else ros:Duration(1.0).sleep(); ROS_INFO(Waiting for a BB); break;TRACKER_INIT状态主要完成的功能是:如果模型已被载入,并

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号