2016-07-21 2 views
0

Je veux représenter la matrice de cv::SIFT des descripteurs cv::Mat descriptors en tant que float*. C'est parce que je veux utiliser GMM from VLFeat (si vous avez une meilleure solution, s'il vous plaît faites le moi savoir). Voici le code que je suis venu avec:Comment convertir un cv :: Mat en un pointeur float?

if(!prova.isContinous()){ 
    std::err<<"Descriptor matrix not continuous!"<<std::endl; 
    return 1; 
} 
float *data = new float[desc.total()]; 
std::memcpy(data,prova.data,prova.total() * sizeof(float)); 

Essayer ce code avec une matrice de jouet:

cv::Mat prova = (cv::Mat_<float>(3,3) << 0.1, 0.3, 2.1, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8); 

et imprimer les valeurs:

for(int i=0;i<prova.total();i++) 
    std::cout<<*(data+i)<<std::endl; 

Cela fonctionne très bien, mais depuis nous avons affaire à des pointeurs (et c'est toujours une question dangereuse) je voudrais une opinion.

REMARQUE: juste pour donner un contexte, voilà comment je vais utiliser data:

VlGMM* gmm = vl_gmm_new(VL_TYPE_FLOAT, desc.cols, 2) ; 
vl_gmm_cluster (gmm, data, desc.rows); 

Répondre

2

Vous pouvez utiliser la méthode Mat::ptr pour obtenir le pointeur de flotteur au début de toute ligne. Plus précisément, le début de la matrice est:

const float* buffer=desc_mat.ptr<float>(0); 
+0

C'était difficile :) Mais je ne sais pas s'il est sûr de donner à '' gmm' simplement buffer' au lieu des données. Je suis encore inexpert avec 'VLFeat'. – justHelloWorld

+0

@Photon Pour obtenir l'ensemble des données, j'écris habituellement 'float * imageData = (float *) image.data;' – Sunreef

+0

Deux problèmes: J'essaie d'éviter le casting de style C, ce qui peut conduire à des conversions invalides. L'utilisation de la connaissance de l'implémentation qui peut changer un jour est généralement moins robuste que l'utilisation de l'interface. – Photon