在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_64F
和 float
对我来说似乎不兼容。 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