2011-04-13 88 views
15

通常,如果我的数据是非常量的,我可以在它上面初始化一个cv :: Mat标头以进行代数操作。为const数据创建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投

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

,什么是你想达到与? – fazo 2011-04-13 19:43:13

+0

如果一个对象是cv :: Mat,我可以执行任何线性代数,图像处理,...操作。我不能用它做什么? :-) – 2011-04-13 19:46:14

+0

我不是那个意思。 const_cast的作品 - 有你想要或预期的其他东西吗? – fazo 2011-04-13 19:53:37

回答

-2

我qould键入它不常量投为:

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

为什么这个解决方案比const_cast <>更好? – 2011-05-20 14:19:21

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

你的帖子似乎不符合@ R1tschY的(与我的经验)。你能在什么样的“常量性”你的意思是,不要混淆任何人的意见? – MaciekS 2017-05-19 14:51:59

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只矩阵头是只读的,而不是数据(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!