压缩跟踪(CT)代码详细学习_模块2(特征的提取和计算)
2014-05-19 08:42
369 查看
这个部分学习的是得到样本以后,如何进行Haar-like特征的提取和计算。详细的看注释吧。有问题我们讨论下吧(我初学者,以前学硬件的)。
// 图像的特征处理相关函数头文件
#pragma once
#include <opencv2\opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
class FeatureHandle
{
public:
FeatureHandle(void);
~FeatureHandle(void);
int featureMinNum;//每一个haar-like特征中含有的矩形框最少数目
int featureMaxNum;//最多数目
int featureNum;//每个patch块的haar-like特征的总数, 也就是弱分类器个数???
vector<vector<Rect>> features;//特征,使用一个向量来存储的,向量里面也是向量,每一个向量里面是矩形框
vector<vector<float>> featuresWeight;
void haarFeature(Rect& _objectPatch, int _featureNum);
void getFeatureValue(Mat& _imageIntegral, vector<Rect>& _sampleBox, Mat& _sampleFeatureValue);
};
// 图像的特征处理相关函数头文件
#pragma once
#include <opencv2\opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
class FeatureHandle
{
public:
FeatureHandle(void);
~FeatureHandle(void);
int featureMinNum;//每一个haar-like特征中含有的矩形框最少数目
int featureMaxNum;//最多数目
int featureNum;//每个patch块的haar-like特征的总数, 也就是弱分类器个数???
vector<vector<Rect>> features;//特征,使用一个向量来存储的,向量里面也是向量,每一个向量里面是矩形框
vector<vector<float>> featuresWeight;
void haarFeature(Rect& _objectPatch, int _featureNum);
void getFeatureValue(Mat& _imageIntegral, vector<Rect>& _sampleBox, Mat& _sampleFeatureValue);
};
//这是计算出图像特征的函数 #include "FeatureHandle.h" #include <math.h> #include<iostream> FeatureHandle::FeatureHandle() { int featureMinNum=2; int featureMaxNum=4; int featureNum=50; } FeatureHandle::~FeatureHandle() { } void FeatureHandle::haarFeature(Rect& _objectPatch, int _featureNum)//_featureNum形参,实验中就是featureNum,50 // _objectPatch是待处理的patch块,类型是 Rect { features=vector<vector<Rect>>(_featureNum,vector<Rect>());//指定特征中的个数 50 featuresWeight=vector<vector<float>>(_featureNum, vector<float>()); //接下来要做的就是将Rect放入到这个特征向量中,所以我们要定义Rect型的数据 Rect rectTemp;//矩形框有xy坐标以及height,width的属性 float weightTemp; //同时我们在2到3之间随机的产生每一个haar-like特征中的矩形的个数 int numRect; for (int i=0; i<_featureNum; i++) { RNG rng;//随机数生成器 //产生1到3之间的随机整数。 numRect=cvFloor(rng.uniform((double)featureMinNum,(double)featureMaxNum)); for(int j=0; j<numRect;j++) { //当我们得到这50个harr-like特征中每一个中含有的矩形框的数目以后,我们在这个patch块里面随机的 //产生矩形框。但是在产生矩形框的时候要注意范围应该不要太接近边框,因此设置到边框2到3个像素的距离 rectTemp.x=cvFloor(rng.uniform(0.0,(double)(_objectPatch.width-3))); rectTemp.y=cvFloor(rng.uniform(0.0,(double)(_objectPatch.height-3))); rectTemp.width=cvFloor(rng.uniform(0.0,(double)(_objectPatch.width-rectTemp.x-2))); rectTemp.height=cvFloor(rng.uniform(0.0,(double)(_objectPatch.height-rectTemp.y-2))); //终于生成好模板了,接下来将它压入到第 i 个特征的向量中保存。但是注意这里的xy是相当于patch块的位置 //而不是相对于整个image的位置 features[i].push_back(rectTemp); //同时生成各个矩形的权重 weightTemp = (float)pow(-1.0, cvFloor(rng.uniform(0.0, 2.0))) / sqrt(float(numRect)); featuresWeight[i].push_back(weightTemp); } } } void FeatureHandle::getFeatureValue(Mat& _imageIntegral, vector<Rect>& _sampleRect, Mat& _sampleFeatureValue) // 其中的 _imageIntegral是图片的积分图的值,通过函数integral(_frame, _imageIntegral, CV_32F);这里为了减少输入,未将它写入 { int sampleRectSize= _sampleRect.size();//得到样本的个数 _sampleFeatureValue.create(featureNum, sampleRectSize,CV_32F );//_sampleFeatureValue的数据类型是cvMat,这里构造的是一个 //featureNum*sampleRectSize的矩阵, 通过_sampleFeatureValue.at<float>(i, j)对里面的元素进行操作。 float tempValue;//用来暂时保存计算出来的haar-like特征的值。 int xMin;//样本的特征矩形框的左上角和右下角的点的坐标 int xMax; int yMin; int yMax; for( int i=0; i<featureNum; i++)//对于每一种特征 { for ( int j=0; j<sampleRectSize; j++)//在一种特征下,对于每一个样本进行如下操作 { tempValue=0.0f; for ( size_t k=0; k < features[i].size(); k++ ) { xMin =_sampleRect[j].x+features[i][k].x;//样本的特征矩形框的左上角点的坐标 yMin=_sampleRect[j].y+features[i][k].y; xMax = _sampleRect[j].x+features[i][k].x+features[i][k].width;//样本的特征矩形框右下角的点的坐标 yMax =_sampleRect[j].y+features[i][k].y+features[i][k].height; tempValue += featuresWeight[i][k]*( _imageIntegral.at<float>(xMin,yMin) + _imageIntegral.at<float>(xMax,yMax) -_imageIntegral.at<float>(xMin,yMax) - _imageIntegral.at<float>(xMax,yMin));//通过积分图像计算出矩形框内的加权的灰度值 } _sampleFeatureValue.at <float>(i,j) = tempValue;//存储数据 } } }
相关文章推荐
- 压缩跟踪(CT)代码详细学习_模块1(样本的采集和扩充)
- 压缩跟踪(CT)代码具体学习_模块1(样本的採集和扩充)
- 随时更新———个人喜欢的关于模式识别、机器学习、推荐系统、图像特征、深度学习、数值计算、目标跟踪等方面个人主页及博客
- Linux netfilter 学习笔记 之九 ip层netfilter的连接跟踪模块代码分析
- Linux netfilter 学习笔记 之九 ip层netfilter的连接跟踪模块代码分析
- [转载]kaldi学习笔记:run.sh(egs/timit/s5)详细分析:从数据准备到特征提取
- 转——kmeans特征提取原理,详细代码图解分析
- MFCC特征提取详细计算过程
- 压缩跟踪(CT)代码详细学习0
- kmeans特征提取原理,详细代码图解分析
- 个人喜欢的关于模式识别、机器学习、推荐系统、图像特征、深度学习、数值计算、目标跟踪等方面个人主页及博客
- BT源代码学习心得(六):跟踪服务器(Tracker)的代码分析(初始化) -- 转贴自 wolfenstein (NeverSayNever)
- SIFT算法学习:特征提取函数的使用
- 轻松学习 red5 教程 像视频一样很详细还有代码直接可Copy
- 小波矩特征提取matlab代码
- 小波矩特征提取matlab代码
- 传智博客佟老师jqurey学习笔记,以及例子代码详细注释。
- ASP操作数据库学习代码模块
- 学习Python列表内涵:一行代码搞定双倍超立方数计算