opencv源代码分析:icvGetTrainingDataCallback简单介绍

本文详细解析了一个用于计算训练样本特征的回调函数icvGetTrainingDataCallback。此函数通过积分图计算Haar特征并标准化,支持批量样本处理,适用于机器视觉和图像处理中的特征提取任务。
部署运行你感兴趣的模型镜像
/*
*函数icvGetTrainingDataCallback介绍
*功能:对全部样本计算特征编号从first開始的num个特征,并保存到mat里。

*输入: *CvMat* mat矩阵样本总数个行,num个列。保存每一个样本的num个特征值。

*First:特征类型编号的開始处 *Num:要计算的特征类型个数。

*Userdata:积分矩阵和权重、特征模板等信息。 *输出: *CvMat* mat矩阵样本总数个行。num个列。保存每一个样本的num个特征值。 */ static void icvGetTrainingDataCallback( CvMat* mat, CvMat* sampleIdx, CvMat*, int first, int num, void* userdata ) { int i = 0; int j = 0; float val = 0.0F; float normfactor = 0.0F; CvHaarTrainingData* training_data; CvIntHaarFeatures* haar_features; #ifdef CV_COL_ARRANGEMENT assert( mat->rows >= num ); #else assert( mat->cols >= num ); #endif //userdata = cvUserdata( data, haarFeatures ) //userdata包括了參与训练的积分图和特征。其指针应该是用于回调的用户參数 training_data = ((CvUserdata*) userdata)->trainingData; haar_features = ((CvUserdata*) userdata)->haarFeatures; if( sampleIdx == NULL ) { int num_samples; #ifdef CV_COL_ARRANGEMENT num_samples = mat->cols; #else num_samples = mat->rows; #endif for( i = 0; i < num_samples; i++ )//样本数量 { for( j = 0; j < num; j++ )//每一个样本的第j个特征 { //计算一个样本(积分图为sum和tilted)的一个HaarFeature,并返回该值 val = cvEvalFastHaarFeature( ( haar_features->fastfeature + first + j ), (sum_type*) (training_data->sum.data.ptr + i * training_data->sum.step), (sum_type*) (training_data->tilted.data.ptr + i * training_data->tilted.step) ); normfactor = training_data->normfactor.data.fl[i]; val = ( normfactor == 0.0F ) ? 0.0F : (val / normfactor); #ifdef CV_COL_ARRANGEMENT CV_MAT_ELEM( *mat, float, j, i ) = val; #else CV_MAT_ELEM( *mat, float, i, j ) = val; #endif } } } else { uchar* idxdata = NULL; size_t step = 0; int numidx = 0; int idx = 0; assert( CV_MAT_TYPE( sampleIdx->type ) == CV_32FC1 ); idxdata = sampleIdx->data.ptr; if( sampleIdx->rows == 1 ) { step = sizeof( float ); numidx = sampleIdx->cols; } else { step = sampleIdx->step; numidx = sampleIdx->rows; } for( i = 0; i < numidx; i++ ) { for( j = 0; j < num; j++ ) { idx = (int)( *((float*) (idxdata + i * step)) ); val = cvEvalFastHaarFeature( ( haar_features->fastfeature + first + j ), (sum_type*) (training_data->sum.data.ptr + idx * training_data->sum.step), (sum_type*) (training_data->tilted.data.ptr + idx * training_data->tilted.step) ); normfactor = training_data->normfactor.data.fl[idx]; val = ( normfactor == 0.0F ) ? 0.0F : (val / normfactor); #ifdef CV_COL_ARRANGEMENT CV_MAT_ELEM( *mat, float, j, idx ) = val; #else CV_MAT_ELEM( *mat, float, idx, j ) = val; #endif } } } #if 0 /*def CV_VERBOSE*/ if( first % 5000 == 0 ) { fprintf( stderr, "%3d%%\r", (int) (100.0 * first / haar_features->count) ); fflush( stderr ); } #endif /* CV_VERBOSE */ }

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值