web-dev-qa-db-fra.com

Comment puis-je initialiser un cv :: Mat avec les données d'un tableau flottant

Je dois créer un cv::Mat variable qui est initialisée avec mes données à partir d'un float * tableau. Cela devrait être basique, mais j'ai du mal à le comprendre.

J'ai le code:

float *matrixAB = <120 floating point array created elsewhere>;
cv::Mat cv_matrixAB = cv::Mat(12, 10, CV_32F, &matrixAB);

mais cv_matrixAB ne contient jamais de valeurs float et, surtout, ne correspond pas aux données contenues dans matrixAB.

Si je change la ligne en:

cv::Mat cv_matrixAB = cv::Mat(12, 10, CV_32F, matrixAB);

puis le cv_matrixAB.data sont tous 0. J'ai également essayé d'utiliser CV_64F comme type, mais je vois le même comportement.

Quelqu'un peut-il m'aider à identifier où je me trompe? Selon le cv::Mat documentation constructeur, je devrais être en mesure de fournir mes données sous la forme d'un float * tableau.

pdate: un peu plus d'informations ici: Même le code suivant ne fonctionne pas. printf affiche 63, ce qui bien sûr n'est pas une valeur dans dummy_query_data.

float dummy_query_data[10] = { 1, 2, 3, 4,
                               5, 6, 7, 8 };
cv::Mat dummy_query = cv::Mat(2, 4, CV_32F, dummy_query_data);
printf("%f\n", (float)dummy_query.data[3]);
15
Brett

Tu t'en sors bien. Mais vous devez accéder à l'élément mat en utilisant at<float>() au lieu de .data (ce qui vous donnera uchar *). Ou utilisez simplement cout << mat; pour imprimer tous ses éléments. Cela vous donnera le résultat attendu.

float dummy_query_data[10] = { 1, 2, 3, 4, 5, 6, 7, 8 };
cv::Mat dummy_query = cv::Mat(2, 4, CV_32F, dummy_query_data);

cout << dummy_query.at<float>(0,2) << endl;
cout << dummy_query << endl;

Il produira:

3
[1, 2, 3, 4;
  5, 6, 7, 8]
27
herohuyongtao