压缩跟踪(CT)代码详细学习_模块2(特征的提取和计算)
来源:互联网 发布:ai是什么软件 编辑:程序博客网 时间:2024/06/05 21:42
这个部分学习的是得到样本以后,如何进行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);};
//这是计算出图像特征的函数#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>());//指定特征中的个数 50featuresWeight=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;//存储数据}}}
2 0
- 压缩跟踪(CT)代码详细学习_模块2(特征的提取和计算)
- 压缩跟踪(CT)代码详细学习_模块1(样本的采集和扩充)
- 压缩跟踪(CT)代码详细学习0
- PET/CT图像的纹理特征提取
- CT-压缩跟踪Compressive Tracking
- CT-压缩跟踪Compressive Tracking
- 快速压缩跟踪(fast compressive tracking)CT算法剖析
- MFCC特征提取详细计算过程
- Tensorflow学习(5)参数和特征的提取
- 运动目标跟踪(七)--压缩跟踪之CT原理介绍
- 快速压缩跟踪(fast compressive tracking)(CT)算法剖析
- 快速压缩跟踪(fast compressive tracking)(CT)算法剖析
- CT跟踪
- tensorflow 1.0 学习:参数和特征的提取
- 图像特征提取_大致的特征类型
- 【机器学习PAI实践十二】机器学习实现男女声音识别分类(含语音特征提取数据和代码)
- SIFT特征提取和代码分析
- 目标识别与跟踪基础知识(四)---特征提取篇
- 黑马程序员--异常
- javaEE jsp与servlet之间通信
- Linux进程间通讯-IPC详解
- 新辰:浅谈一个顶级SEOer必须掌握的五大技能
- An internal error occurred during: "Launching 项目名 on MyEclipse Tomcat ". java.lang.NullPointerExcept
- 压缩跟踪(CT)代码详细学习_模块2(特征的提取和计算)
- 【闲来刷 leetcode】 Two Sum | leetcode OJ
- 在JavaScript中什么时候使用==是正确的?
- 蓝桥杯——基础练习之分治法_快速排序
- js与jQuery区别
- 第77天
- iOS测试网络
- 安卓开发 按两次返回键退出APP 2个方法
- 再次轻度破解EXE文件