繁体   English   中英

为const数据创建cv :: Mat头

[英]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只有矩阵头是r​​eadonly而不是数据( 使用“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM