为const数据创建cv :: Mat头

Dat*_*Chu 20 c++ opencv

通常,如果我的数据是非常量的,我可以在它上面初始化一个cv :: Mat头来进行代数操作.

float awesome_data[24] = {0};
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, awesome_data);
Run Code Online (Sandbox Code Playgroud)

但是,如果我的数据是常量

const float awesome_data[24] = {0};
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, awesome_data);
Run Code Online (Sandbox Code Playgroud)

会有错误: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));
Run Code Online (Sandbox Code Playgroud)

R1t*_*chY 7

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

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

const cv::Mat只有矩阵头是只读的,但不是数据(使用“常量CV ::垫&”的差异,“CV ::垫&”,“CV ::垫”或“常量CV ::垫”为函数参数? ):

const cv::Mat mat = cv::Mat::zeros(6, 4, CV_32F);
mat += 1; // compiles and runs fine!
Run Code Online (Sandbox Code Playgroud)


Jak*_*kob 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));
Run Code Online (Sandbox Code Playgroud)

你保持恒定性。

  • 您的帖子似乎与 @R1tschY 的帖子(以及我的经验)不一致。您能否评论一下您所说的“常量”是什么意思,以免混淆任何人? (2认同)