Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为常量数据创建cv::Mat标头_C++_Opencv - Fatal编程技术网

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

C++ 为常量数据创建cv::Mat标头,c++,opencv,C++,Opencv,通常,如果我的数据是非常量的,我可以初始化它上面的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); 将出现错误:无法从常量

通常,如果我的数据是非常量的,我可以初始化它上面的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);
将出现错误:
无法从常量void*转换为void*
。我知道我不会去换太棒的垫子,最好的办法是什么

目前,我必须做一个常量演员

const float awesome_data[24] = {0};
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, const_cast<float *>(awesome_data));
const float\u data[24]={0};
cv::Mat awesome_Mat=cv::Mat(6,4,cv_32F,const_cast(awesome_数据));

我可以在不使用常量转换的情况下键入它:

const float awesome_data[24] = {0}; 
Mat awesome_mat = Mat(6, 4, CV_32F, (void*)awesome_data,0); 

据我所知,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));
const float\u data[24]={0};
常数cv::Mat awesome_Mat=cv::Mat(6,4,cv_32F,常数cast(awesome_数据));

保持恒定。

始终可以修改
cv::Mat
中的数据。为了更安全,您应该复制数据:

const float awesome_data[24] = {0};
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, const_cast<float *>(awesome_data)).clone();

完全安全地执行此操作的唯一方法是复制
awesome_数据
(一种或另一种方式)。by@R1tschY使用OpenCV方法制作数据的副本,该方法本身需要一个
常量
。为了完全避免常量转换,应该将内存复制到OpenCV之外(因为OpenCV不考虑常量数据)。这将是一种方式:

const float\u data[24]={0};
cv::Mat awesome_Mat=cv::Mat(6,4,cv_32F)//分配自己的内存
memcpy(awesome_mat.data,awesome_data,24*sizeof(float))//复制到分配的内存中。

您想用它实现什么?如果对象是cv::Mat,我可以执行任何线性代数、图像处理。。。操作。我能不能用它做些什么?:-)我不是那个意思。康斯特·卡斯特作品-你还有什么想要或期待的吗?@fazo:没有。const_cast在语义上是错误的。通过丢弃constness,您可以移除保护层,以防止意外更改数据。只是没有cv::Mat构造函数允许您传递const指针,所以不,这是不可能的。也并没有一个特殊的const_Mat…为什么这个解决方案比const_cast更好?你们的帖子似乎和@R1tschY的帖子(和我的经验)不一致。你能谈谈你所说的“康斯特内斯”是什么意思吗?我想这是个糟糕的建议。使用此解决方案,下一行可能会修改AWU数据本身。这不是任何有意义的常量数据。
const cv::Mat mat = cv::Mat::zeros(6, 4, CV_32F);
mat += 1; // compiles and runs fine!