Как я могу инициализировать cv:: Mat с данными из массива float

Мне нужно создать переменную cv::Mat, которая инициализируется моими данными из массива float *. Это должно быть основополагающим, но мне трудно понять это.

У меня есть код:

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

но cv_matrixAB никогда не содержит значений float и, что более важно, не соответствует данным, содержащимся в matrixAB.

Если я изменил строку на:

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

тогда cv_matrixAB.data все 0. Я также попытался использовать CV_64F как тип, но я вижу то же поведение.

Может ли кто-нибудь помочь мне определить, где я ошибаюсь? В соответствии с документацией конструктора cv::Mat я должен предоставить свои данные в форме массива float *.

Обновление: немного больше информации здесь: Даже следующий код не работает. printf отображает 63, который, конечно, не является значением в 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]);

Ответ 1

У тебя все в порядке. Но вы должны получить доступ к элементу mat, используя at<float>() вместо .data (что даст вам uchar *). Или просто используйте cout << mat; для печати всех своих элементов. Это даст вам ожидаемый результат.

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;

Он выведет:

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