为常量数据创建cv :: Mat标头

|| 通常,如果我的数据是非常量的,则可以在其顶部初始化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));
    
已邀请:
cv::Mat
中的数据可以随时修改。为了更安全,您应该复制数据:
const float awesome_data[24] = {0};
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, const_cast<float *>(awesome_data)).clone();
对于“ 6”,仅矩阵标题是只读的,而不是数据(使用“ 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));
您可以保持不变。     
完全安全地执行此操作的唯一方法是复制
awesome_data
(一种方法或另一种方法)。 @ R1tschY的解决方案使用OpenCV方法复制数据,该方法本身需要
const_cast
。为了完全避免使用“ 10”,应将内存复制到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的情况下键入:
const float awesome_data[24] = {0}; 
Mat awesome_mat = Mat(6, 4, CV_32F, (void*)awesome_data,0); 
    

要回复问题请先登录注册