在opencv中创建4x4 mat矩阵时出错

Posted

技术标签:

【中文标题】在opencv中创建4x4 mat矩阵时出错【英文标题】:Error when creating a 4x4 mat matrix in opencv 【发布时间】:2019-10-28 13:09:43 【问题描述】:

我正在尝试使用cv::Mat(4,4,CV_64F, data_m); 创建一个 4x4 矩阵, 其中 data_m 是一个浮点数组

float data_m[] = rmatrix.at<float>(0,0),rmatrix.at<float>(0,1), rmatrix.at<float>(0,2), tvec[0],rmatrix.at<float>(1,0), rmatrix.at<float>(1,1), rmatrix.at<float>(1,2), tvec[1], rmatrix.at<float>(2,0), rmatrix.at<float>(2,1), rmatrix.at<float>(2,2), tvec[2],0.f ,0.f ,0.f, 1.f;    

rmatrix 是一个 3x3 矩阵,tvec 是一个 3x1 向量。

但是,在初始化translation_m

cv::Mat translation_m = cv::Mat(4,4,CV_64F, data_m);

translation_m 矩阵中的最后八个元素未成功初始化。它返回一些奇怪的外星人号码,例如4.59121e-41

有人知道这里发生了什么吗?

【问题讨论】:

CV_64Ffloat 对我来说似乎不兼容。 double 不是更合适吗? (我必须承认我没有 OpenCV 经验,但 float 是 32 位浮点,double 是 64 位。我发现 SO: Difference of OpenCV Mat types 可能会有所帮助。) 如果我理解文档。对,cv::Mat translation_m = cv::Mat(4,4,CV_64F, data_m); 调用 cv::Mat::Mat(int rows, int cols, int type, void *data, size_t step = AUTO_STEP)。请注意void *data 参数(它不支持任何类型检查)。看来我的上述担忧可能是有道理的。 您是否尝试将 data_m 作为指针传递?正如docs 中所建议的那样。 @MarKS float data_m[]cv::Mat(4,4,CV_64F, data_m) 中使用时衰减为指针。我怀疑这是问题所在。 【参考方案1】:

您正在混合double(64 位,CV_64F)和float(32 位,CV_32F)。 当您将浮点数组读取为 double 时,您将在向量结束之后进行读取,并且您正在读取未初始化的数据。

使用任一:

float data_m[] = ...
cv::Mat translation_m = cv::Mat(4,4,CV_32F, data_m);

double data_m[] = ...
cv::Mat translation_m = cv::Mat(4,4,CV_64F, data_m);

【讨论】:

Opps 对不起,我忽略了这一点,感谢@Miki 的帮助,我真的很感激 :)

以上是关于在opencv中创建4x4 mat矩阵时出错的主要内容,如果未能解决你的问题,请参考以下文章

选择一个 Mat 的子集并复制它们以在 C++/Opencv 中创建一个新的 mat

在android上的opencv中创建yuv mat

使用 std::vector 从数组中创建矩阵

在 Java 客户端中创建 Mat 对象,使用 opencv 从 C++ 服务器发送

如何在 NumPy 中创建一个空数组/矩阵?

从opencv中的像素数组创建矩阵