KCF_ROS + TLD_ROS 原理以及源码分析

2023-05-16

扩展链接:百度搜素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

这里写图片描述
代码结构:

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

这里写图片描述


作者在上面也提供了cmake 编译的版本,他的目录是:
这里写图片描述


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.z<depthmin
那就发速度为-
中间部分
就发速度为0

launch文件修改如下:

<launch>  
  <!--  Load turtlebot follower into the 3d sensors nodelet manager to avoid pointcloud serializing -->
    <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的时候,出现下面这个报错是,正常的。
这里写图片描述

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

(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的框,就会显示视频流。

这里写图片描述
同时在终端,就可以看见这些参数的输出
这里写图片描述
其中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发布的话题之后,然后需要做一个回调函数,通过这个回调函数,。指的注意的地方就是这个地方的写法
这里写图片描述
然后在实例化的句柄之前,一定要先init一个节点
然后一个函数当中,如果要写一个函数,那么应该在最前面进行处理
下一个阶段,准备学习的东西就是VIM 的GDB,我准备吧原来的代码重新看一遍,然后能够让自己熟练使用VIM和gdb,这几个工具,然后接下来就是使用EIGEN的库,opencv和关于ROS的代码。以及那么多源码,自己也准备能够写一些代码


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


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

KCF的论文和算法步骤:
这里写图片描述


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

初始化框
这里写图片描述
估计在这个地方进行改动,但是发现比自己想象的要更加复杂,我需要熟悉一个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,TLD 和他们的融合算法都属于半自动化跟踪的过程。目前目标跟踪的主要问题在于clutter, 当背景华环境差异很小的时候,这个clutter这个问题十分突出。那么如果出现这种情况下,我们通过扩大选框,来避免这个问题。
举个例子:
这里写图片描述
在这样的一副图片下面,那么这个小车和后面的小车的差异度很比较小,在这个时候就比较容易出现clutter。另外一个挑战就是:物体本身的外观变化。内在变化:位姿的变化(就是朝向)和形状的变化(大小)外在变化包括:光照的变化和相机从不同角度拍摄的变换。为了解决这上面的问题,那么我们就需要不断更新模板(model)我觉得模型比较合适。错误的模板,将会使得bounding box偏离目标物体。与这个问题相关的是:stability-plasticly dilemma(稳定性和可塑性之间的平衡问题)那么我们就要在保持原有的资料和学习新的数据之间寻找一个平衡。当我们把相机部分遮挡住的时候。为了能够解决这个问题,我们必须要知道Bounding Box消失的时候位置。
这让我明白了TLD的全称 T:Tracking / L : learing /D : Detection
原文里面还有一些国内外研究现状,你如果要用的,就看下原文吧,我就直接不看了。我翻译一些核心的过程。让我对这个算法有个大体的框架,我现在想法,不管怎么样,分析源码首先要分析cmakelist。然后我下一步在看看要使用这个东西,到底需要哪些。

基于光流法的评估方法
这种方法的本质是一个递归算法,是在没有先验信息的情况下,需要初始化目标物体的位置。记住一个人的名字Kalal.他是这种方法的鼻祖。递归跟踪的方法是使用光流来评估目标的关键点,只保留特征点和BoundingBox框的变换估计。
这里写图片描述
首先我们评估一个等距的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点两次。

这里写图片描述

在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 ,否则的话, 来计算平移。
这里写图片描述
从这个方面,我感觉光流法就是来计算像素的位移的变化。
2.4总结
在这个章节,我们堆一幅图片当中的感兴趣的区域采用递归评估。在没有物体先验信息的情况下。
这里写图片描述
只要有这个模型就能被跟踪上 我们引入两种评判误差。medFB 和medNCC. 然而这种方法没有办法做的第二次出线的时候,再次识别物体。


3、Detection
针对于object detection。object detection能够使我们解决上面光流法的问题,就是说,当一个人再次出现的时候,我们能够识别他。尽管递归跟踪依赖于前面那帧消失的位置,object detection却能够在这个画面当中,进行无穷的进行搜索。虽然有无数个小的窗口对输入的图像进行评估。但是我们在object detection上花费的时间是最多的。我们object detector是基于滑动窗的方法,这种方法如下图所示:
这里写图片描述
首先对于前景物体进行特征提取 之后进行方差滤波,然后是集成分类器 最后 进行模板匹配。在一个滑窗检测方法当红在那个,子窗口都是进行独立检测的。我们采用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
这里写图片描述
上面的组图当中,第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

这里写图片描述
这么久才走了一行。
给我看下来,就是这个Main *main = new Main();初始化了所有的参数
首先看KCF的关于ROS的回调是怎么写,先看上一遍,然后在接着写。

修改LI MING的 turtlebot TLD follow
这里写图片描述

这个地方就是对Bounding box进行了一系列的赋值。
这里写图片描述

我想起来了,这个地方这么写是因为在是在除了自己本身的框之外,自己有一个更大的框。
这里写图片描述

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

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

}

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



#include <geometry_msgs/Twist.h>
#include <string>
#include <geometry_msgs/Twist.h>
#include <ros/ros.h>

    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="<<twi.linear.x);
    }

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


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KCF_ROS + TLD_ROS 原理以及源码分析 的相关文章

  • 1. 从0开始学ARM-安装Keil MDK uVision集成开发环境

    关于ARM的一些基本概念 xff0c 大家可以参考我之前的文章 xff1a 到底什么是Cortex ARMv8 arm架构 ARM指令集 soc xff1f 一文帮你梳理基础概念 科普 二 安装Keil MDK uVision集成开发环境
  • Linux信号量(3)-内核信号量

    概念 Linux内核的信号量在概念和原理上和用户态的System V的IPC机制信号量是相同的 xff0c 不过他绝不可能在内核之外使用 xff0c 因此他和System V的IPC机制信号量毫不相干 如果有一个任务想要获得已经被占用的信号
  • 二维码识别的原理

    二维码的特征定位和信息识别 背景介绍 视觉的方法可以用来估计位置和姿态 最容易想到的是在目标上布置多个容易识别的特征 xff0c 这样使用opencv相机标定和 相机畸变矫正 轮廓提取 solvepnp来获取目标相对于相机的位姿 在实际使用
  • Linux iptables命令详解

    iptables 是 Linux 防火墙系统的重要组成部分 xff0c iptables 的主要功能是实现对网络数据包进出设备及转发的控制 当数据包需要进入设备 从设备中流出或者由该设备转发 路由时 xff0c 都可以使用 iptables
  • 一座5g基站造价多少?

    想知道5G基站的大致价格 xff0c 我们可以通过中国移动2020年5G设备采购方案简单计算得出 xff1a 本次采购5G基站数量为23 2万个 xff0c 采购总额为亿元 xff0c 折合每个5G基站的成本在16万元左右 相当于4G基站价
  • 华为交换机查看端口相关信息常用命令,排查故障法宝,转发收藏

    一 查看接口状态 1 显示接口的运行状态和相关信息 display interface Ethernet brief 查看以太网端口的简要信息 xff0c 物理端口是否连通 xff0c 端口是否是全双工 xff0c 带宽是多少 xff0c
  • 从0学Linux驱动第一期视频已经录制完毕,资料全部奉送

    历时4个多月 xff0c 第一期Linux驱动视频录制完毕 xff0c 一共32期 xff0c 现在全部同步到了B站 如果你觉得视频对你有用 xff0c 建议大家多多点赞 xff0c 投投免费硬币 xff0c 算是对我辛苦的劳动的认可 视频
  • 千年虫”是什么东西?一个在计算机诞生之初,遗留下的巨大BUG

    说起来 xff0c 现在社会科技中 xff0c 除了真正学过计算机专业的人 xff0c 大部分人对于 千年虫 这个称号都有些陌生 xff0c 甚至有些人连听都没听过 xff0c 不知道的网友听到 虫 这个字可能还会脑补出一大堆不明生物的样子
  • 小灵通为什么会退市?

    价廉物美的 小灵通 退市最主要的原因 xff0c 其一是因为 小灵通 本身月租太便宜 xff0c 让别的移动运营商无钱可挣 xff1b 其二则是中国电信自己的CDMA网络也发展起来了 xff0c 小灵通 让自己无钱可挣 所以 小灵通 必须退
  • Camera | 4.瑞芯微平台MIPI摄像头应用程序编写

    前面3篇我们讲解了camera的基础概念 xff0c MIPI协议 xff0c CSI2 xff0c 常用命令等 xff0c 本文带领大家入门 xff0c 如何用c语言编写应用程序来操作摄像头 Linux下摄像头驱动都是基于v4l2架构 x
  • Camera | 9.如何让camera支持闪光灯?-基于rk3568

    一 闪光灯基本原理 工作模式 Camera flash led分flash和torch两种模式 flash xff1a 拍照时上光灯瞬间亮一下 xff0c 电流比较大 xff0c 目前是1000mA xff0c 最大电流不能超过led最大承
  • 我的新书上架了!

    talk is cheap xff0c show you my book xff01 新书 从0开始学ARM 终于在各大平台上架了 xff01 xff01 一 关于本书 1 本书主要内容 ARM体系架构是目前市面上的主流处理器体系架构 xf
  • 签名预售活动圆满结束!各位敬等快递,第一个付款的兄弟来领取大礼!

    我的新书经过千难万险终于上架 xff0c 为了感谢众多老铁的支持 xff0c 所以上周日搞了签名预售的活动 xff0c 挂了300本 xff0c 一上线很快就被大家买光了 xff0c 留言需要单独写一些话的老铁 xff0c 我也都尽量满足了
  • Android P(Android 9)出现Detected problems with API compatibility问题解决

    安卓系统升级到Android P后打开应用出现Detected problems with API compatibility问题 xff0c 如下图 通过查询发现是 Android P 后谷歌限制了开发者调用非官方公开API 方法或接口
  • eclipse + GDB + JLink 搭建MCU调试环境

    安装Java环境 1 进入Java官网 http www oracle com technetwork java javase downloads index html 2 下载安装包 如果是先要安装Java开发环境 xff0c 就安装JD
  • Jeston TX2 使用cmake 运行测试realsense D435i相关代码(C++)

    Jeston TX2 使用cmake 运行测试realsense D435i相关代码 xff08 C 43 43 xff09 前言 xff1a 我这些天作毕设的TX2上面的Jetpack包是4 3的 然后我又自己用JetPack4 6 1包
  • C++ 服务器通过Tcp传输图片 到 QT客户端显示

    C 43 43 服务器通过Tcp传输图片 到 QT客户端显示 简单的方法通过流数据传输图片 xff0c 并且在QT上面显示出来这里贴出核心代码 xff0c 供大家参考 xff1a 先附上资源源码 xff1a Qt客户端和C 43 43 服务
  • Docker 安装部署

    目录 Docker 安装部署 一 Docker 安装 二 设置镜像加速 三 网络优化 开启路由转发的作用 四 总结 docker server端配置文件建议配置 Docker 安装部署 一 Docker 安装 开源社区 xff1a dcok
  • 学习笔记:SLAM_因子图优化

    SLAM 因子图优化 Factor graoh 模型 概率模型到因子图模型 定义一个简单的机器人问题 xff08 SLAM xff09 假设有一个机器人在往前运动 xff0c 运动过程中能观测到两个路标点 xff0c 定义了三个时间 xff
  • [NVIDIA]-2 从零入手 Jetson Xavier NX 内核编译、源码编译流程

    NVIDIA 从零入手 Jetson Xavier NX 内核编译 源码编译流程 注明 xff1a 感谢网友提醒 xff0c 我当时买的时候nx套件还没开售 xff0c 因为核心板兼容b01 xff0c 先买了核心板和b01的板子合在一起用

随机推荐

  • [NVIDIA]-1 入手Jetson Xavier NX 刷机+开机配置+系统烧录+Bring up

    NVIDIA 入手 Jetson Xavier NX 刷机 43 开机配置 43 系统烧录 43 Bring up 注明 xff1a 感谢网友提醒 xff0c 我当时买的时候nx套件还没开售 xff0c 因为核心板兼容b01 xff0c 先
  • RTOS解读一

    什么是RTOS 维基百科定义 实时操作系统 Real Time Operating System RTOS xff0c 通常读作 34 R toss 34 xff0c 指的是专为实时应用而设计的多任务操作系统 其应用场合包括嵌入式系统 可编
  • switch-case使用方法

    switch case 语句判断一个变量与一系列值中某个值是否相等 xff0c 每个值称为一个分支 switch case 语句语法格式如下 xff1a switch语句应用举例1 xff1a public class VariableTe
  • Linux单片机串口通信总结

    这是一个目录 Linux与单片机串口通信运行ROS串口发送节点后异常中断栈溢出问题catkin make报错 xff1a 函数未定义的引用ERROR L107 ADDRESS SPACE OVERFLOW串口实验总结程序组织串口调试 Lin
  • Apache Options指令详解

    前言 xff1a Options指令是Apache配置文件中一个比较常见也比较重要的指令 xff0c Options指令可以在Apache服务器核心配置 server config 虚拟主机配置 virtual host 特定目录配置 di
  • 欠驱动机械臂运动学仿真

    这是个目录 三轴机械臂建模及运动学仿真各仿真项目的个人理解三轴机械臂 xff08 欠驱动 xff09 分析难点更改RTB中逆解求解源码求解析解数值求解工作空间筛选 实用的解析解法总结 三轴机械臂建模及运动学仿真 在开始具体的机械结构及驱动结
  • postman安装使用教程(标贝科技)

    postman安装使用教程 文章目录 postman安装使用教程前言一 postman安装二 postman使用 前言 postman是Chrome浏览器的插件 xff0c 是一款功能强大的网页调试工具 xff08 接口调试神器 xff09
  • 流媒体推流原理

    我们知道一个完整的直播过程 xff0c 包括采集 处理 编码 封包 推流 传输 转码 分发 解码 播放等 xff0c 这一过程所采用的技术 xff0c 我们也称之为 流媒体技术 其中推流是指使用推流工具等内容抓取软件把直播内容传输到服务器的
  • 机器学习必知必会10大算法!

    Datawhale干货 作者 xff1a Fahim ul Haq xff0c 编译 xff1a InfoQ 现在 xff0c 机器学习有很多算法 如此多的算法 xff0c 可能对于初学者来说 xff0c 是相当不堪重负的 今天 xff0c
  • C语言结构体及链表定义

    最近在看 大话数据结构 xff0c 一边看书一边跑一下书中的案例 xff0c 加深下理解 书中的案例都是C写的 xff0c 顺便熟悉下C语言 此处第三章线性表链式存储 xff1a 在用代码描述单链表之前 xff0c 我们需要定义一个结构体来
  • 【ROS教程 005】ROS可视化

    在ROS系统中它可以通过一些通用工具轻松绘制标量数据图 xff0c 它要求对每一个标量字段数据分别绘制成二维曲线 xff08 1 xff09 用rxplot画出时间趋势曲线 在ROS系统中 xff0c 标量数据可以根据消息中提供的时间戳作为
  • C/C++/Windows/VC/MFC/Unix/Linux编程书籍推荐

    C C 43 43 编程书籍 C Primer Plus C 43 43 Primer C 43 43 Primer Plus C和指针 C陷阱与缺陷 C专家编程 C 43 43 沉思录 C语言深度剖析 Effective C 43 43
  • 使用CPM管理CMake C++工程中的外部依赖库

    严正声明 xff1a 本文系作者davidhopper原创 xff0c 未经许可 xff0c 不得转载 众所周知 xff0c 对于外部依赖库的管理是CMake C 43 43 工程中一个令人头疼的问题 人们一直希望能有一个工具来自动配置CM
  • 字典和集合2:高效性和可哈希

    目录 1 字典和集合的高效性 2 散列表操作 2 1 散列表的写入 2 2 散列表的查找 2 3 散列表的缺点 3 可哈希 1 字典和集合的高效性 许多时候 xff0c 将列表改为字典或集合后 xff0c 执行效率将会有巨大的飞跃 xff0
  • 卡尔曼滤波(Kalman filter)公式推导详细版

    卡尔曼滤波 xff08 Kalman filter xff09 公式推导详细版 记得很早的时候 xff0c 我曾经手工推导过卡尔曼滤波 xff0c 但是之前的已经大多记不起来了 今天帮着老师整理PPT的时候 xff0c 老师让我补充完相应的
  • 4g dtu透传模块

    4g dtu透传模块 xff0c 是一款支持双向透明传输的产品 xff0c 用户使用无需关心复杂的协议 xff0c 产品为双向透传 xff0c 只需要简单配置即可 同时产品为4G全网通 xff0c 支持国内全部运营商网络 xff0c 通讯模
  • PCB设计学习笔记(一)原理图界面

    一 画原理图库 多个引脚可以ctrl 43 c一个引脚后 xff0c 编辑 gt 设置粘贴阵列 xff0c 一次性复制出来多个引脚 二 原理图界面 生成原理图库 xff1a 在一个现成的原理图界面可以直接将现有的原理图内的原件生成一个原理图
  • novatel计算odom--GPS坐标与UTM坐标转换

    保证你的novatel的driver是在ros drivers上的驱动 1 简介 1 1 消息 gps common定义了两个通用消息 xff0c 供GPS驱动程序输出 xff1a gps common GPSFix和gps common
  • 搭建自己的slam系统

    手头有的传感器 一个vlp16线激光雷达 一个120 的fisheye相机 一整套novatel GPS 43 IMU 采集了一个闭环的bag 第一步 数据预处理 将camera的数据单独提取出来 因为没有时间戳 因此无法做到传感器的紧耦合
  • KCF_ROS + TLD_ROS 原理以及源码分析

    扩展链接 xff1a 百度搜素vot2016 xff0c 会有相关的资料 KCF缺点是有边界效应 有一个改进的版本是 xff1a SRDCF 大牛的 CSDN博客 说明 xff1a http blog csdn net app 120620