icvSplitIndicesCallback源码详细分析
来源:互联网 发布:单片机考试题库 编辑:程序博客网 时间:2024/09/21 06:19
下面这是我根据自己的理解来注释的,如有不对的地方请大家多多指出。本博原创,如需转载,请注明http://blog.csdn.net/ding977921830?viewmode=contents。
/* *icvSplitIndicesCallback *作用:根据阈值为样本序列分类 */staticvoid icvSplitIndicesCallback( int compidx, //快速haar特征的序号 float threshold, //分裂阈值 CvMat* idx, //存放样本的序号矩阵 CvMat** left, //存放小于阈值*normfactor乘积的样本序号 CvMat** right, //存放小于阈值*normfactor乘积的样本序号 void* userdata ) //存放训练样本数据和特征数据{ CvHaarTrainingData* data; //存放userdata的训练样本数据 CvIntHaarFeatures* haar_features; //存放userdata的特征数据 int i; int m; CvFastHaarFeature* fastfeature; data = ((CvUserdata*) userdata)->trainingData; haar_features = ((CvUserdata*) userdata)->haarFeatures; fastfeature = &haar_features->fastfeature[compidx]; m = data->sum.rows; //根据积分图的行来确定训练样本的数量,因为在积分图中一个样本占一行 *left = cvCreateMat( 1, m, CV_32FC1 ); *right = cvCreateMat( 1, m, CV_32FC1 ); (*left)->cols = (*right)->cols = 0; if( idx == NULL ) { for( i = 0; i < m; i++ ) //遍历所有训练样本 { if( cvEvalFastHaarFeature( fastfeature, //通过调用cvEvalFastHaarFeature来计算快速haar特征值,并将该值与阈值*normfactor的乘积相比较 (sum_type*) (data->sum.data.ptr + i * data->sum.step), (sum_type*) (data->tilted.data.ptr + i * data->tilted.step) ) < threshold * data->normfactor.data.fl[i] ) { (*left)->data.fl[(*left)->cols++] = (float) i; //当小于时,将第i个样本的序号按顺序存放入左边的矩阵 } else { (*right)->data.fl[(*right)->cols++] = (float) i; //当大于时,将第i个样本的序号按顺序存放入右边的矩阵 } } } else { uchar* idxdata; int idxnum; size_t idxstep; int index; idxdata = idx->data.ptr; idxnum = (idx->rows == 1) ? idx->cols : idx->rows; idxstep = (idx->rows == 1) ? CV_ELEM_SIZE( idx->type ) : idx->step; for( i = 0; i < idxnum; i++ ) { index = (int) *((float*) (idxdata + i * idxstep)); /*与上面不同的是这里需要求一下idx,因为在idx中的样本序列并不一定是和sum中的序列一致,为了针对某个 训练样本来使用下面的积分图,必须首先确定这个训练样本的序号*/ if( cvEvalFastHaarFeature( fastfeature, (sum_type*) (data->sum.data.ptr + index * data->sum.step), (sum_type*) (data->tilted.data.ptr + index * data->tilted.step) ) < threshold * data->normfactor.data.fl[index] ) { (*left)->data.fl[(*left)->cols++] = (float) index; //将小于阈值*normfactor乘积的样本序号放入左边的矩阵 } else { (*right)->data.fl[(*right)->cols++] = (float) index; //将大于阈值*normfactor乘积的样本序号放入右边的矩阵 } } }}
1 0
- icvSplitIndicesCallback源码详细分析
- g723源码详细分析(-)
- g723源码详细分析(-)
- DownloadProvider 源码详细分析
- cornerHarris源码详细分析
- icvCreateHaarTrainingData源码详细分析
- icvGetTrainingDataCallback源码详细分析
- DownloadProvider 源码详细分析
- android_launcher的源码详细分析
- Android_launcher的源码详细分析
- android_launcher的源码详细分析
- android_launcher的源码详细分析
- android_launcher的源码详细分析
- android_launcher的源码详细分析
- Android_launcher的源码详细分析
- Android_launcher的源码详细分析
- android_launcher的源码详细分析
- poll函数源码详细分析
- STL vector swap 交换操作是这样的
- 删除oracle表空间下的所有表
- HttpURLConnection与HttpClient浅析
- 系统登录功能测试用例
- 将java项目转为web项目,配置web项目的文件夹
- icvSplitIndicesCallback源码详细分析
- java成长历程2
- 搭建交叉调试环境 arm-linux-gdb配合gdbserver
- (Eclipse) 安装Subversion1.82(SVN)插件
- java基础==集合
- Linux常用命令大全
- vim 复制粘贴
- oracle clob ERROR org.hibernate.util.JDBCExceptionReporter - ORA-00932: 数据类型不一致: 应为 -, 但却获得 CLOB
- 一、树形dp(4)有线电视网