![](/img/trans.png)
[英]Differences of using “const cv::Mat &”, “cv::Mat &”, “cv::Mat” or “const cv::Mat” as function parameters?
[英]Create cv::Mat header for const data
通常,如果我的数据是非常量的,我可以在它上面初始化一个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));
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
只有矩阵头是readonly而不是数据( 使用“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!
据我所知,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));
你保留了constness。
完全安全地完成此操作的唯一方法是制作awesome_data
的副本(以这种或那种方式)。 @ R1tschY的解决方案使用OpenCV方法复制数据,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.
我可以在没有const cast的情况下键入它:
const float awesome_data[24] = {0};
Mat awesome_mat = Mat(6, 4, CV_32F, (void*)awesome_data,0);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.