本章主要具体解释的是compressive tracking框架中的第一部分:样本的採集和扩充部分。

在開始代码学习的前面,你须要知道的理论知识參见论文:Real-time Compressive Tracking。理论理解能够參见我的博客:http://blog.csdn.net/ikerpeng/article/details/19826409 。

这个模块中你须要知道一个主要的概念:代码里面几个变量指的是什么。上一张图:

或许你如今还不知道他们是什么,直接贴代码了。

相信有我的凝视你一定会懂的。

头文件 sampleRect.h

  1. #pragma once
  2. #include <opencv2\opencv.hpp>
  3. #include <vector>
  4. using namespace cv;
  5. using namespace std;
  6.  
  7. class sampleRect
  8. {
  9. public:
  10. sampleRect(void);//构造函数,初始化以下的rOuterpositive
  11. ~sampleRect(void);
  12.  
  13. private:
  14. int rOuterpositive;//这个设定的是正负样本的边界。在这个边界里面的就是正样本,外面的就是负样本。
  15.  
  16. void sampleRect0(Mat& _image, Rect& _objectPatch, float _rInner, float _rOuter, int _maxSampleNum, vector<Rect>& _sampleRect );
  17. //这个函数最重要,它是用来扩充正负样本的。
  18.  
  19. 他通过设定_rInner,_rOuter两个边界,选出的样本是_rInner里面的,_rOuter外面的。
  20.  
  21. 也就是说_rInner>_rOuter.
  22. //在进行正样本扩充的时候_rOuter=0._rInner=上面那个边界rOuterpositive;产生负样本的时候_rOuter=rOuterpositive。里面的參数在实现的时候说明
  23. void sampleRect1(Mat& _image, Rect& _objectPatch, float _srw, vector<Rect>& _sampleRect );//这个函数是要扩充待检測的样本的
  24.  
  25. };
  1. #include "sampleRect.h"
  2. #include <math.h>
  3. #include<iostream>
  4.  
  5. sampleRect::sampleRect()
  6. {
  7. int rOuterpositive=4;//这里我们都是以矩形框的左上角的点为參照的,若是要扩充的样本的这个点离目标位置的这个点的距离在4个像素以内则定义为正样本。否则为负。
  8. }
  9. sampleRect::~sampleRect()
  10. {
  11.  
  12. }
  13. void sampleRect::sampleRect0(Mat& _image, Rect& _objectPatch, float _rInner, float _rOuter, int _maxSampleNum, vector<Rect>& _sampleRect )
  14. {
  15. /*
  16. Arguments:
  17. -_image: processing frame
  18. -_objectBox: recent object position
  19. -_rInner: inner sampling radius
  20. -_rOuter: Outer sampling radius
  21. -_maxSampleNum: maximal number of sampled images
  22. -_sampleRect: Storing the rectangle coordinates of the sampled images.
  23. */
  24. int rowsz=_image.rows-_objectPatch.height-1;//y方向上取值的最大范围
  25. int colsz= _image.cols- _objectPatch.width-1;
  26. float rInnerSq=_rInner*_rInner;//这个相当于是外圆的距离的平方,为的是和后面的dist作比較的。小于这个值就在圆里面
  27. float rOuterSq=_rOuter*_rOuter;//同上,大于这个值就在选择的范围里面了。详细參见示意图1。
  28. int dist;
  29. RNG rng;
  30.  
  31. //以下这个是为了要确定选出来的patch快的范围(事实上是左上角点的坐标的范围)
  32. int minrow = max(0,(int)_objectPatch.y-(int)_rInner);//计算出的结果是y坐标的最小取值。相当于一个圆外接矩形的最上面的那个点。详细參见示意图1
  33. int maxrow = min(rowsz-1, (int)_objectPatch.y+(int)_rInner);//计算出的结果是y坐标的最大取值,相当于一个圆外接矩形的最以下的那个点。
  34.  
  35. int mincol = max(0,(int)_objectPatch.x-(int)_rInner);//计算出的结果是x坐标的最小取值,相当于一个圆外接矩形的最左边的那个点。
  36. int maxcol = min(colsz,(int)_objectPatch.x+(int)_rInner);//计算出的结果是x坐标的最大取值,相当于一个圆外接矩形的最右边的那个点。
  37.  
  38. float prob=_maxSampleNum/(maxrow-minrow+1)/(maxcol-mincol+1);//这个值的设定是为了将扩充正负样本的函数统一到一个函数里面
  39. // 由于负样本的扩充时设定的最外面的边界_rInner是比較大的。
  40.  
  41. 那就非常产生非常多的样本,这个时候我们就通过这个值的推断随机的选择一些
  42. //_maxSampleNum设置是非常大的。上面的式子是相当于除以后面两个的乘积啦。
  43.  
  44. int r,c; //横纵坐标
  45. int i=0; //记住vector的尺寸
  46. _sampleRect.clear();// 非常重要。開始的时候一定清空样本存储的地方
  47. Rect rect(0,0,0,0); //用来记录每个被选到的样本块
  48.  
  49. for ( r=minrow; r<=maxrow; r++)
  50. {
  51. for( c=mincol; c<=maxcol; c++)
  52. {
  53. dist=(_objectPatch.y-r)*(_objectPatch.y-r)+(_objectPatch.x-c)*(_objectPatch.x-c);//到目标点的距离
  54. if((rng.uniform(0., 1.)<prob)&&(dist<=rInnerSq)&&(dist>=rOuterSq))
  55. //这里就是将正负样本的扩充统一起来了。对于正样本,由于满足的范围小,prob一定>1。所以满足条件的都要。
  56. //对于负样本来说,rng.uniform(0., 1.)<prob)就不一定成立,所以是随机的保存所产生的满足要求的负样本。
  57.  
  58. //(附加说明一点,_maxSampleNum这里设置的是10000.一般一个图像至少320*240,所以prob=1/6左右。也就是保存了所有负样本的1/6左右)
  59. {
  60. rect.x=c;//满足上面的条件以后就採集样本并存储到_sampleRect中
  61. rect.y=r;
  62. rect.height=_objectPatch.height;
  63. rect.width=_objectPatch.width;
  64. _sampleRect.push_back(rect);
  65. i++;
  66. }
  67.  
  68. }
  69. }
  70. _sampleRect.resize(i);//这个操作是要确定这个vector的尺寸。
  71.  
  72. 由于vector给你分配的空间往往是大于你所要的。
  73.  
  74. }
  75.  
  76. //以下的操作基本上是一样的了,其作用是在上一帧的位置附近生成一些待检測的样本。这被觉得是可能的目标出现的位置。
  77. void sampleRect::sampleRect1(Mat& _image, Rect& _objectPatch, float _srw, vector<Rect>& _sampleRect )
  78. {
  79. int rowsz=_image.rows-_objectPatch.height-1;
  80. int colsz =_image.cols -_objectPatch.width-1;
  81. int radSq= _srw*_srw;
  82.  
  83. int dist;
  84. Rect rect;
  85.  
  86. int minrow=max(0,(int)_objectPatch.y-(int)_srw);
  87. int maxrow=min(rowsz,(int)_objectPatch.y+(int)_srw);
  88. int mincol =max(0,(int)_objectPatch.x-(int)_srw);
  89. int maxcol =max(colsz,(int)_objectPatch.x+(int)_srw);
  90.  
  91. int r,c;
  92. int i=0;
  93.  
  94. for( r=minrow; r<=maxrow;r++)
  95. {
  96. for ( c=mincol; c<=maxcol; c++)
  97. {
  98. dist=(_objectPatch.y-r)*(_objectPatch.y-r)+(_objectPatch.x-c)*(_objectPatch.x-c);
  99. if(dist<=radSq )//不在须要prob来限制量了,以下都是一样的了。
  100.  
  101. {
  102. rect.x=c;
  103. rect.y=r;
  104. rect.height=_objectPatch.height;
  105. rect.width=_objectPatch.width;
  106. _sampleRect.push_back(rect);
  107. i++;
  108.  
  109. }
  110.  
  111. }
  112. }
  113. _sampleRect.resize(i);
  114. }
  115. //本节搞定。

我是实实在在的刚開始学习的人,发现问题请指正啊!谢谢!

压缩跟踪(CT)代码具体学习_模块1(样本的採集和扩充)的更多相关文章

  1. webpack学习_模块热替换(Hot Module Peaplacement)

    模块热替换(Hot Module Replacement 或 HMR) 是webpack提供的最有用的功能之一.允许在u女性是更新各种模块,而无需进行完全刷新. 启用HMR 承接之前的代码 webpa ...

  2. 高速压缩跟踪(fast compressive tracking)(CT)算法分析

    本文为原创,转载请注明出处:http://blog.csdn.net/autocyz/article/details/44490009 Fast Compressive Tracking (高速压缩跟 ...

  3. 压缩跟踪Compressive Tracking

    好了,学习了解了稀疏感知的理论知识后,终于可以来学习<Real-Time Compressive Tracking>这个paper介绍的感知跟踪算法了.自己英文水平有限,理解难免出错,还望 ...

  4. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块

    正则表达式   语法:             mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...

  5. 『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍

    一.论文介绍 读论文系列:Object Detection ECCV2016 SSD 一句话概括:SSD就是关于类别的多尺度RPN网络 基本思路: 基础网络后接多层feature map 多层feat ...

  6. python学习——常用模块

    在学习常用模块时我们应该知道模块和包是什么,关于模块和包会单独写一篇随笔,下面先来了解有关在python中的几个常用模块. 一.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文 ...

  7. 浅谈android代码保护技术_ 加固

    浅谈android代码保护技术_加固 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结果被人反编译了,那心情真心不舒服.虽然我们混淆,做到native层,但 ...

  8. jQuery源代码学习_工具函数_type

    jquery源代码学习_工具函数_type jquery里面有一个很重要的工具函数,$.type函数用来判断类型,今天写这篇文章,是来回顾type函数的设计思想,深入理解. 首先来看一下最终结果: 上 ...

  9. 从别人的代码中学习golang系列--01

    自己最近在思考一个问题,如何让自己的代码质量逐渐提高,于是想到整理这个系列,通过阅读别人的代码,从别人的代码中学习,来逐渐提高自己的代码质量.本篇是这个系列的第一篇,我也不知道自己会写多少篇,但是希望 ...

随机推荐

  1. Install SVN (Subversion) Server on Fedora 20/19, CentOS/Red Hat (RHEL) 6.5/5.10

    Install SVN (Subversion) Server on Fedora 20/19, CentOS/Red Hat (RHEL) 6.5/5.10 Updated by JR on Mar ...

  2. Eclipse导入git上的maven web项目 部署 - lpshou

    http://www.tuicool.com/articles/fqm2Qf   推酷 文章 微博 主题 站点 活动 应用 周刊 登录   Eclipse导入git上的maven web项目 部署 - ...

  3. myeclipse单元测试

    步骤:1.新建new-other 2.选择Junit Test Case 3.注意红线圈出部分 4.选择需要测试的方法5.Finish后出现如下 示例代码: package com.jrgc.dao; ...

  4. Springboot项目启动报错,提示Cannot determine embedded database driver class for database type NONE

    我在springboot项目里面引入了数据库的配置: <dependency> <groupId>org.mybatis.spring.boot</groupId> ...

  5. Windows下的Qt Creator的安装

    采用Qt和Qt creator分别下载和安装的方式:(需要手动设置关联Qt和Qt Creator)   一.软件下载 从http://qt-project.org/downloads分别下载Qt和Qt ...

  6. 使用JAVA的URL类处理url事例

    import java.net.*; import java.io.*; public class ParseURL { public static void main(String[] args) ...

  7. Web Storage与Cookie相比存在的优势:

    (1).存储空间更大:IE8下每个独立的存储空间为10M,其他浏览器实现略有不同,但都比Cookie要大很多. (2).存储内容不会发送到服务器:当设置了Cookie后,Cookie的内容会随着请求一 ...

  8. SpringMVC学习笔记六:使用 hibernate-validator注解式数据校验

    对客户端传过来的参数,在使用前一般需要进行校验. SpringMVC框架内置了Validator验证接口,但是实现起来太麻烦.我们一般使用 hibernate-validator进行数据校验. 1:j ...

  9. 一条SQL语句获取具有父子关系的分类列表(mysql)

    有如下表数据: 获取“菜单”分类的子分类数据列表: SELECT a.cat_id, a.cat_name, a.sort_order AS parent_order, a.cat_id, b.cat ...

  10. 〖Linux〗将Jar文件打包成Linux可执行文件

    因为不想敲写 java -jar jarfile,而是想直接敲写  ./jarfile 就能够跑起程序 #!/bin/bash - #================================= ...