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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
virtual void calc_khi_deux(int vcount, int var_count,const float** vecs, const float * another , float* results);
en ligne 521 , j'ai ajouter le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
enum { LINEAR=0, POLY=1, RBF=2, SIGMOID=3 , KHI=4};
après , j'ai ajouté dans le fichier mlsvm.cpp :

CvSVMKernel::create( const CvSVMParams* _params, Calc _calc_func ): J'ai ajoute un nouveau ligne entre les lignes 224 et 228 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
params->kernel_type == CvSVM::KHI ? &CvSVMKernel::calc_khi_deux:
bool CvSVM::set_params( const CvSVMParams& _params ) : dans cette fonction , j'ai juste modifié dans le condition si en ligne 1258 , j'ai ajouté :
void CvSVM::write_params( CvFileStorage* fs ) const :dans cette fonction ;J'ai juste ajouté en ligne 2069 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
kernel_type == CvSVM::KHI ? "KHI" :
void CvSVM::read_params( CvFileStorage* fs, CvFileNode* svm_node ) : j'ai ajouté en ligne 2241 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
strcmp( kernel_type_str, "KHI" ) == 0 ? CvSVM::KHI :
et j'ai ajouté mon fonction pour calculer le nouveau noyau :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 );
}
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 .

je ne sais pas ou se trouve le problème .