Создать cv:: заголовок Mat для данных const

Обычно, если мои данные не являются константами, я могу инициализировать заголовок cv:: Mat поверх него для алгебраической манипуляции.

float awesome_data[24] = {0};
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, awesome_data);

Но если мои данные const

const float awesome_data[24] = {0};
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, awesome_data);

будет иметь ошибку: unable to convert from const void * to void *. Я знаю, что я не буду изменять awesome_mat, что это лучший способ сделать это?

В настоящее время я должен выполнить const cast

const float awesome_data[24] = {0};
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, const_cast<float *>(awesome_data));

Ответы

Ответ 1

Насколько я знаю, OpenCV не имеет класса const_Mat. Однако, используя

const float awesome_data[24] = {0};
const cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, const_cast<float *>(awesome_data));

вы сохраняете константу.

Ответ 2

Данные в cv::Mat всегда могут быть изменены. Чтобы быть более безопасным, вы должны скопировать данные:

const float awesome_data[24] = {0};
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, const_cast<float *>(awesome_data)).clone();

С const cv::Mat только заголовок матрицы только для чтения, но не данные (Различия в использовании "const cv:: Mat &" , "cv:: Mat &" , cv:: Mat & ", ", cv:: Mat" или "const cv:: Mat" в качестве функциональных параметров?):

const cv::Mat mat = cv::Mat::zeros(6, 4, CV_32F);
mat += 1; // compiles and runs fine!

Ответ 3

Я могу ввести его без const cast как:

const float awesome_data[24] = {0}; 
Mat awesome_mat = Mat(6, 4, CV_32F, (void*)awesome_data,0);