Создать заголовок cv :: Mat для константных данных - PullRequest
20 голосов
/ 13 апреля 2011

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

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

Но, если мои данные постоянны

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 float awesome_data[24] = {0};
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, const_cast<float *>(awesome_data));

Ответы [ 4 ]

4 голосов
/ 07 сентября 2015

Данные в 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 "или" const cv :: Mat "в качестве параметров функции? ):

const cv::Mat mat = cv::Mat::zeros(6, 4, CV_32F);
mat += 1; // compiles and runs fine!
2 голосов
/ 15 сентября 2011

Насколько я знаю, 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));

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

0 голосов
/ 01 августа 2018

Единственный способ сделать это полностью безопасно - это сделать копию awesome_data (так или иначе). решение от @ R1tschY делает копию данных методом OpenCV, который сам требует const_cast. Чтобы вообще избежать const_cast, память следует копировать за пределы OpenCV (поскольку OpenCV не учитывает постоянные данные). Это будет один из способов:

const float awesome_data[24] = {0};
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F); //Allocates its own memory
memcpy(awesome_mat.data, awesome_data, 24*sizeof(float)); //Copy into the allocated memory.
0 голосов
/ 19 мая 2011

Я могу набрать его без константного приведения как:

const float awesome_data[24] = {0}; 
Mat awesome_mat = Mat(6, 4, CV_32F, (void*)awesome_data,0); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...