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