KCF_ROS + TLD_ROS 原理以及源码分析

扩展链接:百度搜素vot2016,会有相关的资料。
KCF缺点是有边界效应
有一个改进的版本是:SRDCF
大牛的 CSDN博客。说明:http://blog.csdn.net/app_12062011/article/details/52230009
原来大神早就写了源码解析:http://blog.csdn.net/app_12062011/article/details/52277159
这个地方有大神的论文的源码,所有的关于vot2016的源码
目标跟踪之GOTURN:Learning to Track at 100 FPS with Deep Regression Networks
http://blog.csdn.net/linolzhang/article/details/72354427

目标跟踪之相关滤波:CF及后续改进篇
http://blog.csdn.net/linolzhang/article/details/72759918

目标跟踪之ECO:Efficient Convolution Operators for Tracking
http://blog.csdn.net/linolzhang/article/details/72824753

我参考这个博客切换opencv的
http://blog.csdn.net/haizimin/article/details/51927386

KCF_ROS + TLD_ROS 原理以及源码分析_第1张图片
代码结构:

turtlebot_cf_tracking
    -src
        -main
            -image_acquisition.cpp
            -image_acquistion.hpp
            -main_kcf.cpp
        -cf_libs
            -common
                cf_track.hpp
                cv_ext.hpp
                feature_channels.hpp
                mat_const.hpp
                math_helper.hpp
                math_helper.hpp
                scale_estimator.hpp
                tracker_debug.hpp
            -kcf
                kcf_tracker.hpp
                kcf_debug.hpp
            -3rdparty
                cv_ext
                piotr
                tclap
    follower
        follower.cpp

在follower.cpp当中,主要分析

最重要的就是这里。最后一个transform_callback是一个回调函数。通过前面产生的BoundingBox

ros::Subscriber tld_msg_sub = m.subscribe("BoundingBox", 1000, transform_callback);

有价值的部分就是这里

void transform_callback(const turtlebot_cf_tracking::BoundingBox& msg)
{
ROS_INFO("transform_callback start! ");
ROS_INFO("bool enable_obs_avoid_ in function transform_callback(): %d", enable_obs_avoid_);
ros::Rate loop_rate(10);//loop_rate(10)可以控制while(ros:ok()的循环频率
if (!enable_obs_avoid_)
{
    ROS_INFO("tracking control program start!");
    int x = msg.x;
    int y = msg.y;
    int width = msg.width;
    int height = msg.height;
    ROS_INFO("x,y,width,height:%d %d %d %d",x,y,width,height);
  //  ROS_INFO("turtlebot tracking control message count: %d",count);

    BB_info.centerX = x+width/2;
    BB_info.centerY = y-height/2;//由于turtleBot不能在三维平面移动,centerY在这里实际上没有起作用
    BB_info.area = width * height;   
  //  ROS_INFO("transformat successs!") ;
    /*发布turtleBot控制消息*/
    geometry_msgs::Twist twist;
    twist.linear.x = msg.controlSpeed; twist.linear.y = 0; twist.linear.z = 0;
    twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = msg.controlTurn;
    pub.publish(twist);
    //ros::spinOnce();
  //  loop_rate.sleep();
    ROS_INFO("Publish turtlebot control message sucess!");
  //  }
}

我觉得启动的顺序应该是:先运行KCF的node。随后再运行follow.cpp。

随后我们查看关于cmake中KCF的节点状况

add_executable(KCFcpp
    src/main/main_kcf.cpp
    src/cf_libs/kcf/kcf_debug.hpp
    src/cf_libs/kcf/kcf_tracker.hpp
    ${CF_MAIN_SOURCES}
    ${CF_LIB_COMMON_SOURCES})
target_link_libraries(KCFcpp ${OpenCV_LIBS} ${catkin_LIBRARIES})

主要就是main_kcf.cpp kcf_debug.hpp kcf_tracker.hpp和src lib里面的东西。


重新系统安装过程
1、Ubuntu14.04.5安装之后
2、ROS 安装
3、安装opencv3.1
注意事项
安装参考博客http://blog.csdn.net/junmuzi/article/details/49888123

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..  

将组合算法的包和kcf_follower
下面出现的这个问题的,是你讲kcf_ros 和另外的 组合算法那包放在同一个工作空间中编译导致cmake 错误,解决办法就是把原来的那个包删掉,就可以了。只留个你要用的包

CMake Error at kcf_tracking_ros/turtlebot_cf_tracking/CMakeLists.txt:154 (target_link_libraries):
  Attempt to add link library
  "/opt/ros/indigo/lib/librosconsole_backend_interface.so" to target "KCFcpp"
  which is not built in this directory.


CMake Error at kcf_tracking_ros/turtlebot_cf_tracking/CMakeLists.txt:154 (target_link_libraries):
  Attempt to add link library "/usr/lib/liblog4cxx.so" to target "KCFcpp"
  which is not built in this directory.


CMake Error at kcf_tracking_ros/turtlebot_cf_tracking/CMakeLists.txt:154 (target_link_libraries):
  Attempt to add link library "/usr/lib/x86_64-linux-gnu/libboost_regex.so"
  to target "KCFcpp" which is not built in this directory.


CMake Error at kcf_tracking_ros/turtlebot_cf_tracking/CMakeLists.txt:154 (target_link_libraries):
  Attempt to add link library "/opt/ros/indigo/lib/libxmlrpcpp.so" to target
  "KCFcpp" which is not built in this directory.


CMake Error at kcf_tracking_ros/turtlebot_cf_tracking/CMakeLists.txt:154 (target_link_libraries):
  Attempt to add link library
  "/opt/ros/indigo/lib/libroscpp_serialization.so" to target "KCFcpp" which
  is not built in this directory.


CMake Error at kcf_tracking_ros/turtlebot_cf_tracking/CMakeLists.txt:154 (target_link_libraries):
  Attempt to add link library "/opt/ros/indigo/lib/librostime.so" to target
  "KCFcpp" which is not built in this directory.


CMake Error at kcf_tracking_ros/turtlebot_cf_tracking/CMakeLists.txt:154 (target_link_libraries):
  Attempt to add link library
  "/usr/lib/x86_64-linux-gnu/libboost_date_time.so" to target "KCFcpp" which
  is not built in this directory.


CMake Error at kcf_tracking_ros/turtlebot_cf_tracking/CMakeLists.txt:154 (target_link_libraries):
  Attempt to add link library "/opt/ros/indigo/lib/libcpp_common.so" to
  target "KCFcpp" which is not built in this directory.


CMake Error at kcf_tracking_ros/turtlebot_cf_tracking/CMakeLists.txt:154 (target_link_libraries):
  Attempt to add link library "/usr/lib/x86_64-linux-gnu/libboost_system.so"
  to target "KCFcpp" which is not built in this directory.


CMake Error at kcf_tracking_ros/turtlebot_cf_tracking/CMakeLists.txt:154 (target_link_libraries):
  Attempt to add link library "/usr/lib/x86_64-linux-gnu/libboost_thread.so"
  to target "KCFcpp" which is not built in this directory.


CMake Error at kcf_tracking_ros/turtlebot_cf_tracking/CMakeLists.txt:154 (target_link_libraries):
  Attempt to add link library "/usr/lib/x86_64-linux-gnu/libpthread.so" to
  target "KCFcpp" which is not built in this directory.


CMake Error at kcf_tracking_ros/turtlebot_cf_tracking/CMakeLists.txt:154 (target_link_libraries):
  Attempt to add link library
  "/usr/lib/x86_64-linux-gnu/libconsole_bridge.so" to target "KCFcpp" which
  is not built in this directory.


-- Configuring incomplete, errors occurred!
See also "/home/jemma_zhou/catkin_ws/build/CMakeFiles/CMakeOutput.log".
See also "/home/jemma_zhou/catkin_ws/build/CMakeFiles/CMakeError.log".

你可以直接把包下载下来就直接运行了,但是我想说这是错误的做法。
因为这个launch文件当中有一个freenect 然后就会导致,相当于有两个openni.这么不就崩了。
所以不光要改一下话题的映射,还需要改一下你启动的launch问价。

process[camera_rgb_frame_tf-5]: started with pid [7726]
[ERROR] [1380277981.435323719]: Failed to load nodelet [/rgbd_image_proc] of type [ccny_rgbd/RGBDImageProcNodelet]: Could not find library corresponding to plugin ccny_rgbd/RGBDImageProcNodelet. Make sure the plugin description XML file has the correct name of the library and that the library actually exists.
[FATAL] [1380277981.435695830]: Service call failed!
process[camera_rgb_optical_frame_tf-6]: started with pid [7738]
[FATAL] [1380277981.446783568]: Service call failed!
[FATAL] [1380277981.447004115]: Service call failed!
[openni_driver-2] process has died [pid 7651, exit code 255, cmd /opt/ros/groovy/lib/nodelet/nodelet load openni_camera/driver rgbd_manager ir:=camera/ir rgb:=camera/rgb depth:=camera/depth __name:=openni_driver __log:=/home/dina/.ros/log/f9767520-275c-11e3-b82a-e006e61ca148/openni_driver-2.log].
log file: /home/dina/.ros/log/f9767520-275c-11e3-b82a-e006e61ca148/openni_driver-2*.log
[debayer-3] process has died [pid 7675, exit code 255, cmd /opt/ros/groovy/lib/nodelet/nodelet load image_proc/debayer rgbd_manager image_raw:=/camera/rgb/image_raw image_color:=/camera/rgb/image_color __name:=debayer __log:=/home/dina/.ros/log/f9767520-275c-11e3-b82a-e006e61ca148/debayer-3.log].
log file: /home/dina/.ros/log/f9767520-275c-11e3-b82a-e006e61ca148/debayer-3*.log
[rgbd_image_proc-4] process has died [pid 7708, exit code 255, cmd /opt/ros/groovy/lib/nodelet/nodelet load ccny_rgbd/RGBDImageProcNodelet rgbd_manager __name:=rgbd_image_proc __log:=/home/dina/.ros/log/f9767520-275c-11e3-b82a-e006e61ca148/rgbd_image_proc-4.log].
log file: /home/dina/.ros/log/f9767520-275c-11e3-b82a-e006e61ca148/rgbd_image_proc-4*.log

基本上用release版本都是可以通的,我已经改过cmakelist

KCF_ROS + TLD_ROS 原理以及源码分析_第2张图片


作者在上面也提供了cmake 编译的版本,他的目录是:
KCF_ROS + TLD_ROS 原理以及源码分析_第3张图片


KCF_ros理论参考博客:

http://www.cnblogs.com/YiXiaoZhou/p/5925019.html
http://blog.csdn.net/shenxiaolu1984/article/details/50905283

调试的过程
首先确保你安装了opencv3.0.如果你安装opencv3.2 或者3.1 或者2.4建议都吧opencv先卸载掉。
卸载推荐博客
blog.csdn.net/xulingqiangac/article/details/52496701
卸载之后,重新安装opencv 简单来说就是

mkdir build
cd build
cmake ..
make -j8
sudo make install

然后 下载张子洋的PKGhttps://github.com/sunzuolei/kcf_tracking_ros
然后 放到你的工作空间 catkin_make
这个时候,会报错,说没有cv_bridge.
https://www.baidu.com/link?url=jafijzMLiJlDrJqh6CuvrAojetRloaqWpSeD9zGFfc9Y7Iq-z_rwjkIH8ARHEc5A&wd=&eqid=997421330004232300000002591f1496
去roswiki上面找到cv_bridge,然后放到你的工作空间中,一边编译 就过了。
然后就是该一些话题的映射

需要修改的地方:

image_transport::ImageTransport it(nh); 
  image_transport::Subscriber sub_rgb= it.subscribe("/camera/rgb/image_raw", 1, rgbimageCallback);
image_transport::Subscriber sub_depth = it.subscribe("/camera/depth/image_raw", 1, depthimageCallback);

这里深度的最小距离是65cm.最大的深度值80

int depthmini = 650000;
int depthmax = 800000;
msg.z>depthmax
那么就发速度为+
msg.z0

launch文件修改如下:

<launch>  
  
    <node pkg="follower" type="follower" name="follower">
    node>
launch>

follower.cpp文件的修改如下

pub = m.advertise<geometry_msgs::Twist>("cmd_vel", 1000);

基本上就是这么修改。
在运行rosrun turlebot_cf_tracking KCFcpp的时候,出现下面这个报错是,正常的。
KCF_ROS + TLD_ROS 原理以及源码分析_第4张图片

为了方便大家检索,我就这条报错信息贴出来

(Draw Bounding Box:29410): GLib-GObject-CRITICAL **: g_object_unref: assertion '

正常情况下,会弹出三个框。其中KCFcpp这个框是黑色的。还有一个Draw Bounding Box的框,这个框是和TLD一样就是要进行选框。然后就是深度图的框。turtlebot_depthimage。当你在Draw Bounding Box中选了一个框之后Draw Bounding Box就会消失,刚刚 黑色的KCFcpp的框,就会显示视频流。

KCF_ROS + TLD_ROS 原理以及源码分析_第5张图片
同时在终端,就可以看见这些参数的输出
KCF_ROS + TLD_ROS 原理以及源码分析_第6张图片
其中msg.z就是表示的深度。
通过将深度的值,和depthmini ,depthmax进行比较来判断发速度的大小。

if ( (msg.z > depthmini ) && (msg.z < depthmax) )
      controlSpeed = 0;
      else if ( (msg.z < depthmini) || (msg.z == depthmini))
      controlSpeed = (-1)*std::min(CONTROL_SPEED*CONTROL_SPEED_RATIO*(depthmini - msg.z),CONTROL_SPEED_MAX);
      else if ( (msg.z > depthmax) || (msg.z == depthmax))
      controlSpeed = std::min(CONTROL_SPEED*CONTROL_SPEED_RATIO*(msg.z - depthmax),CONTROL_SPEED_MAX);
      else
      controlSpeed = 0;

启动的顺序
roslaunch p3dx_description p3dx.launch
rosla unch openni_launch openni.launch
rosrun turlebot_cf_tracking KCFcpp
roslaunch follower turtlebot_cf_tacking.launch
基本上记得的就是这样
下一步的方向,使用DSScpp再做一遍
然后跑张子扬的另外一个包,看看效果


看ros代码的一些感触:
这里有一个很经典的套路,通过这个在订阅kinect发布的话题之后,然后需要做一个回调函数,通过这个回调函数,。指的注意的地方就是这个地方的写法
KCF_ROS + TLD_ROS 原理以及源码分析_第7张图片
然后在实例化的句柄之前,一定要先init一个节点
然后一个函数当中,如果要写一个函数,那么应该在最前面进行处理
下一个阶段,准备学习的东西就是VIM 的GDB,我准备吧原来的代码重新看一遍,然后能够让自己熟练使用VIM和gdb,这几个工具,然后接下来就是使用EIGEN的库,opencv和关于ROS的代码。以及那么多源码,自己也准备能够写一些代码


紧接着我又跑了一下张子洋的opentld。在话题映射部分和上面一样的修改。然后在使用的时候,建议大家看胰腺癌readme。然后在深度图的地方按快捷键r,随后可进行选框,选了框之后,按回车进行更新。最后的效果还算是理想的,至少没有需要前面哪几种现象。同样,将tld和KCF结合的代码,的流程也是一样的


1、 .cc就是表示的C++文件 区别于.c
2、 .hh就是为了表示C++的头文件

KCF的论文和算法步骤:
KCF_ROS + TLD_ROS 原理以及源码分析_第8张图片


KCF的帧率80度左右,然后因为是运动检测,所以需要在跟丢的地方才能找回框
TLD帧率很慢(我记得,可能记错了)当我框一个人的时候,很容易记框丢了,人不能旋转
KCF+TLD 这个旋转之后的尺度性,我根据很好
然后在openTLD的源码当中,大家可以看看readme。这个里面按E可以导出追踪物体的模型。
参考github链接:https://github.com/sunzuolei/kcf_tld_tracking_ros
增加了他的可重现率。然后我发现作者已经将cmake写的很完善了,那么我们就可以在那个源码的文件夹里面
mkdir build cd build cmake .. make 之后在 下面的文件夹里面找到
KCF_ROS + TLD_ROS 原理以及源码分析_第9张图片
找到可执行文件。然后打开一个终端,接着把可执行文件拖到终端里面,就可以直接运行了。这样的好处就是,我在有用开ros的节点了。

初始化框
KCF_ROS + TLD_ROS 原理以及源码分析_第10张图片
估计在这个地方进行改动,但是发现比自己想象的要更加复杂,我需要熟悉一个openTLD的流程,必将这个结合的算法,主要还是用的openTLD的框架。


这个地方是有巡检的部分,我觉得可以借鉴一下:
https://github.com/liminglong/turtlebot_patroller
https://github.com/liminglong/tld_turtlebot_follower.git

在阅读了readme之后,我发现
这里写图片描述
这个才是这个算法真正的主人,那么我下一步要找到这个人的论文
这个大牛的github链接:
https://github.com/klahaag/CFtld
里面会有一些例子,将来可以在论文里面写一个数据集
[-s] 这个参数可以让第一帧保持静止
作者的名字叫klahaag
这个地方应该是说明有一个matlab工具箱
首先,我的思路是,这个人github我是跑通了,最后运行的效果是能够打开笔记本上的摄像头。没有跟kinect相连接。
这个地方是对opentld的库文件进行的说明:
这里写图片描述
给我的感觉,真的用别人的还不如自己重新写。算了,我还是在直接在原来做作者的基础上面直接写吧,因为你在写这个这个过程中,你避免不了的要去修改很多关于CMAKE 的动态链接库。然后我想要使用打断点的技术的话,那么还是有roboware的开发成本是最低的。

找到一个TLD技术文档,就在上面的github文档当中。
单目标跟踪的定义:考虑到一组序列的图像I, … In评估每个目标帧的位置状态xk。将我们框住的框进行编码。
KCF_ROS + TLD_ROS 原理以及源码分析_第11张图片
手动跟随需要用户与每帧的图像进行交互。自动跟随的方法使用了一个先验的信息为了能够初始化跟踪的过程。
在半自动化跟踪的过程,需要用户指定初始化跟踪的目标。现在KCF,TLD 和他们的融合算法都属于半自动化跟踪的过程。目前目标跟踪的主要问题在于clutter, 当背景华环境差异很小的时候,这个clutter这个问题十分突出。那么如果出现这种情况下,我们通过扩大选框,来避免这个问题。
举个例子:
KCF_ROS + TLD_ROS 原理以及源码分析_第12张图片
在这样的一副图片下面,那么这个小车和后面的小车的差异度很比较小,在这个时候就比较容易出现clutter。另外一个挑战就是:物体本身的外观变化。内在变化:位姿的变化(就是朝向)和形状的变化(大小)外在变化包括:光照的变化和相机从不同角度拍摄的变换。为了解决这上面的问题,那么我们就需要不断更新模板(model)我觉得模型比较合适。错误的模板,将会使得bounding box偏离目标物体。与这个问题相关的是:stability-plasticly dilemma(稳定性和可塑性之间的平衡问题)那么我们就要在保持原有的资料和学习新的数据之间寻找一个平衡。当我们把相机部分遮挡住的时候。为了能够解决这个问题,我们必须要知道Bounding Box消失的时候位置。
这让我明白了TLD的全称 T:Tracking / L : learing /D : Detection
原文里面还有一些国内外研究现状,你如果要用的,就看下原文吧,我就直接不看了。我翻译一些核心的过程。让我对这个算法有个大体的框架,我现在想法,不管怎么样,分析源码首先要分析cmakelist。然后我下一步在看看要使用这个东西,到底需要哪些。

基于光流法的评估方法
这种方法的本质是一个递归算法,是在没有先验信息的情况下,需要初始化目标物体的位置。记住一个人的名字Kalal.他是这种方法的鼻祖。递归跟踪的方法是使用光流来评估目标的关键点,只保留特征点和BoundingBox框的变换估计。
KCF_ROS + TLD_ROS 原理以及源码分析_第13张图片
首先我们评估一个等距的Bounding box在。接下来每一点的光流估计采用的LK法(高博书里面有说过,第8章 )Lucas-Kanada。对于keypoint是角点,那么效果最好。如果所有误差的中位数都高于一个特定的阈值,我们将会完全停止跟踪。
2.1描述的LK光流
Lucas and Kanade有三个假设;第一个假设是亮度恒定这里写图片描述I 表示的图片 x 表示的是位置 I(x)表示的是这个像素的亮度,在下一帧的图片J当中,d表示的是位移矢量。那么总体而言,从图片I 到图片J 像素X的亮度是不变的,从图片I 到图片J上唯一变化的就是这个像素的位置的变换。第二个假设是时间持久性。当位移向量很小的时候,这里写图片描述那么我就可以用I(x)的一阶泰勒展开来替代J(x).
这里写图片描述对于任意一个像素而言,这个方式是多解。
第三个假设是空间的相干性。说明的是在一个窗口内,所有的像素点的运动都是相关的。通过这个假设,我们希望d能够最小化这里写图片描述这是一个(最小二乘估计的问题)W的大小应该考虑到每个像素。这里写图片描述其中,这里写图片描述这里写图片描述
e表示的是误差。(原文当中有推导的链接)
2.2误差措施:error measure
为了能够增加递归跟踪的鲁棒性,我们三条准则来滤除那些无效的点。第一条准侧是这里写图片描述在这个公式当中,我们的待求的是d, 前提是G必须是可逆的。G必须有两个大的特征值()G 有两个方向的梯度。这里写图片描述Shi and Tomasi 公式
Kalal提出了第二条准则 forward-backward error measure. 如下面这个图所示 ,在左边这个图当中,关键点 1 能够被正确的跟踪上,但是关键点 却有一个错误的定位。这条准则说明 这个跟踪点必须是可翻转。我们用欧氏距离来作为这里写图片描述,其中这里写图片描述这意味着LK法将会用到P点两次。

KCF_ROS + TLD_ROS 原理以及源码分析_第14张图片

在forward-backward error measure 使用这里写图片描述
正常化相关系数(Normalised Correlation Coefficient)对于两个p1和p2定义
这里写图片描述是u1 u2表示P1和P2的平均值,剩下的两个表示的标准差。这个normalised 也可能翻译成归一化。对于亮度均匀不变,NCC也是不变的。

2.3平移模板模型(model)
我们能够计算forward-backward error的中值这里写图片描述这里写图片描述使用所有的similarity measure。并且让forward-backward 误差小于medFB,并且大于medNCC.如果medFB大于先前定义的这里写图片描述,我们将不会用这个点去计算。成对的计算他的尺度性。水平方向上点,通过使用整个框当中像素的位移来计算。
算法的框图如下:我们使用的单元格是10*10,这个窗的大小W=10 这个这里写图片描述简单来说就是大于这个阈值的点都不参与计算。

分析这下面的算法:
输入时 图片I 的亮度 和图片I 和图J 然后产生特征点,对所有的特征点进行LK光流,然后光流后的特征点在进行LK光流 将一次光流和两次光流点饿像素做差 ,求出误差, 然后通过NCC来计算归一化正常系数求出 ,然后在求出平均 ,如果大于阈值,就将这个地方的亮度弄成0 ,否则的话, 来计算平移。
KCF_ROS + TLD_ROS 原理以及源码分析_第15张图片
从这个方面,我感觉光流法就是来计算像素的位移的变化。
2.4总结
在这个章节,我们堆一幅图片当中的感兴趣的区域采用递归评估。在没有物体先验信息的情况下。
KCF_ROS + TLD_ROS 原理以及源码分析_第16张图片
只要有这个模型就能被跟踪上 我们引入两种评判误差。medFB 和medNCC. 然而这种方法没有办法做的第二次出线的时候,再次识别物体。


3、Detection
针对于object detection。object detection能够使我们解决上面光流法的问题,就是说,当一个人再次出现的时候,我们能够识别他。尽管递归跟踪依赖于前面那帧消失的位置,object detection却能够在这个画面当中,进行无穷的进行搜索。虽然有无数个小的窗口对输入的图像进行评估。但是我们在object detection上花费的时间是最多的。我们object detector是基于滑动窗的方法,这种方法如下图所示:
KCF_ROS + TLD_ROS 原理以及源码分析_第17张图片
首先对于前景物体进行特征提取 之后进行方差滤波,然后是集成分类器 最后 进行模板匹配。在一个滑窗检测方法当红在那个,子窗口都是进行独立检测的。我们采用cascaded 方法(级联分类器)来减少计算时间。
对一个子窗口进行分类,初始化object的大小 我们大概使用了50000到20000 (5万到20万的子窗口)(前提是视频是640*480的视频流)每个子窗口都被独立测试。只有当一个子窗口通过一个cascade被接收,下一个状态才能被启动。cascaded object detector目的是阻止很多不相关的子窗口参与计算,从而使得计算量最少。我们将他分成4个阶段,首先我们使用背景消除法(其实就是个名字,没啥大不了的,相当于三帧差法,就是把背景的灰度值减去 background subtraction method)这样做的目的就是说,能够将搜索的范围仅限于前景图(foreground). 这个阶段我们需要背景模型(background model)第二个阶段,将低于摸个阈值的子窗口进行删除。第三个阶段基于random ferns 组成一个ensemble classifier 集成分类器。我们通过使用一个非最大值抑制策略来处理重叠窗口
3.1 介绍滑窗的方法
基于滑动窗口的目标检测方法,输入的图像是包含这感兴趣区域的。一般认为,输入的每幅图像都包含感兴趣区域。一个VGA图像有23507020800个可能子窗口。
我们设置了一些限制条件,在空间R上
1、我们认为感兴趣区域保留他的长宽比例。
2、我们引入dx和dy在两个相邻的子窗口之间,并且设置 dx 和dy的值是原来boundingbox的值的1/10.。为了能够实现多尺度的搜索。我们引入了尺度因子:
这里写图片描述同时我们也考虑到子窗口最小的面积是25个pixels(25个像素),那么所有的子窗口的限制条件可以写作:
这里写图片描述
在这个公式当中,w和h表示的是初始化框的宽度和高度。n和m表示的是这个是图片的宽度和高度。默认情况下一个Bounding box的 w=80 h=60.一个VGA图片是146*190.每个子窗口都是独立测试。我们做了很多角点和线程来完成滑动窗口的方法。

3.2如何将搜索空间限制为前景区域的背景模型
确定一个video当中的运动的物体的方法是背景相减法,将视频流的帧与背景图像做比较。我们的目的是加快检测的过程。我们总共采用四种方法。
关于背景相减法的过程:
1、左边第一幅是输入图像
2、背景图像
3、相减的结果
4、滤波之后
5、删除一些小的部件
6、在前景区域当中的最小的Bounding box
KCF_ROS + TLD_ROS 原理以及源码分析_第18张图片
上面的组图当中,第2张图片是是背景图片 Ibg 第一张图片进行图片的跟踪 我们计算输入图像和背景图片的绝对误差 I absDiff=| Ibg-I |
减掉之后的结果就是图片3。

3.3介绍方差滤波器

3.4介绍集成分类器能够快速确定positive 子窗口(positive可能是正 也可能表示的活动)

3.5介绍模板匹配

3.6重叠检测如何合并成一个单一的结果

3.7总结

如何去融合跟踪的结果,以及在学习过程的发生了什么

算法的对比

与最后的结果进行对比


main.h
之后在debug之后,然后才能进行调试。
这里写图片描述

Main *main = new Main();
tld = new tld::TLD();
TLD::TLD()
 trackerEnabled = true;
numTress=10
numFeatures=13

然后实例化一个NCC分类器

阈值FP和TP

thetaFP = .5;
thetaTP = .65;
clustering

KCF_ROS + TLD_ROS 原理以及源码分析_第19张图片
这么久才走了一行。
给我看下来,就是这个Main *main = new Main();初始化了所有的参数
首先看KCF的关于ROS的回调是怎么写,先看上一遍,然后在接着写。

修改LI MING的 turtlebot TLD follow
KCF_ROS + TLD_ROS 原理以及源码分析_第20张图片

这个地方就是对Bounding box进行了一系列的赋值。
KCF_ROS + TLD_ROS 原理以及源码分析_第21张图片

我想起来了,这个地方这么写是因为在是在除了自己本身的框之外,自己有一个更大的框。
KCF_ROS + TLD_ROS 原理以及源码分析_第22张图片

将C++程序while循环语句存入到txt当中
框架:

#include
using namespace std;
int main()
{
ofstream fout;
fout.open("output.txt");
int num=5;
fout<

最后给大家补充一个ROS当中发布速度的框架



#include 
#include 
#include 
#include 

    ros::NodeHandle n;
    ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("cmd_vel", 200);
    geometry_msgs::Twist twi;
     while(ros::ok())
    {
            if(rect.width < 0  ||  rect.height < 0)
            {
                ROS_INFO("rect is fail");
                return -1;
            }
            if(rect.width<100)
                twi.linear.x=0.1;
            else if(rect.width>150)
                twi.linear.x=-0.1;
            vel_pub.publish(twi);
           ROS_INFO_STREAM("cmd_vel="<

当然你不用while(ros::ok())
{
}做循环也可以,只要你能找到合适的循环,能够找到合适的地方就可以。
如何找到循环的地方
有个小技巧,就是ROS_INFO_STREAM("cmd_vel="<
看他在程序运行的时候,能否在终端循环起来。


2017.6.11 关于跟随的博客就更新到这里。接下来我打算将自己的精力放在路径规划上面。
祝好~

你可能感兴趣的:(【SLAM探索】)