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