Bonjour ,
Je suis en train d 'implémenter un algorithme pour la détection d'objet .
et dans cette algorithme ils ont utilise un nouveau noyau , n'est pas implémenté en opencv.
donc j'ai essayé de l'ajouter en opencv :
premierement , dans le fichier ml.h :
en ligne 398 , j'ai ajoute :
en ligne 521 , j'ai ajouter le code suivant :Code:virtual void calc_khi_deux(int vcount, int var_count,const float** vecs, const float * another , float* results);
après , j'ai ajouté dans le fichier mlsvm.cpp :Code:enum { LINEAR=0, POLY=1, RBF=2, SIGMOID=3 , KHI=4};
CvSVMKernel::create( const CvSVMParams* _params, Calc _calc_func ): J'ai ajoute un nouveau ligne entre les lignes 224 et 228 :
bool CvSVM::set_params( const CvSVMParams& _params ) : dans cette fonction , j'ai juste modifié dans le condition si en ligne 1258 , j'ai ajouté :Code:params->kernel_type == CvSVM::KHI ? &CvSVMKernel::calc_khi_deux:
void CvSVM::write_params( CvFileStorage* fs ) const :dans cette fonction ;J'ai juste ajouté en ligne 2069 :Code:&& kernel_type != KHI
void CvSVM::read_params( CvFileStorage* fs, CvFileNode* svm_node ) : j'ai ajouté en ligne 2241 :Code:kernel_type == CvSVM::KHI ? "KHI" :
et j'ai ajouté mon fonction pour calculer le nouveau noyau :Code:strcmp( kernel_type_str, "KHI" ) == 0 ? CvSVM::KHI :
mais Ça pas marche , j'ai juste obtenu le même résultat avec la fonction predict quelque soit le paramètre gamma allant de 0.000001 a 100 .Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 void CvSVMKernel:: calc_khi_deux(int vcount, int var_count,const float** vecs, const float * another , Qfloat* results) { CvMat R = cvMat( 1, vcount, QFLOAT_TYPE, results ); double gamma = -params->gamma; int j, k; for( j = 0; j < vcount; j++ ) { const float* sample = vecs[j]; double s = 0; for( k = 0; k <= var_count; k ++ ) { double t0 = sample[k] - another[k]; double t2= sample[k] + another[k]; s +=( (t0*t0)/t2); } results[j] = (Qfloat)((0.5*s)*(gamma)); } if( vcount > 0 ) cvExp( &R, &R ); }
je ne sais pas ou se trouve le problème .