为const数据创建cv :: Mat头

时间:2011-04-13 19:40:44

标签: c++ opencv

通常,如果我的数据是非常量的,我可以在它上面初始化一个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 cast

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

4 个答案:

答案 0 :(得分:4)

始终可以修改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时,只有矩阵标头是只读的,而不是数据(Differences of using "const cv::Mat &", "cv::Mat &", "cv::Mat" or "const cv::Mat" as function parameters?):

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

答案 1 :(得分:2)

据我所知,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 :(得分:0)

完全安全地执行此操作的唯一方法是制作awesome_data的副本(一种或另一种方式)。 @ R1tschY的solution使用OpenCV方法复制数据,该方法本身需要const_cast。为了完全避免使用const_cast,应将内存复制到OpenCV之外(因为OpenCV不遵守const数据)。这将是一种方式:

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.

答案 3 :(得分:-2)

我可以在没有const cast的情况下键入它:

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