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 :
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 :
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 :
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 :
kernel_type == CvSVM::KHI ? "KHI" :
void CvSVM::read_params( CvFileStorage* fs, CvFileNode* svm_node ) : j'ai ajouté en ligne 2241 :
strcmp( kernel_type_str, "KHI" ) == 0 ? CvSVM::KHI :
et j'ai ajouté mon fonction pour calculer le nouveau noyau :
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 .
Partager