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);
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
@Photon Pour obtenir l'ensemble des données, j'écris habituellement 'float * imageData = (float *) image.data;' – Sunreef
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