2011-04-13 63 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!