9

我正在处理一些代码,其中做了很多 3x3 矩阵乘法,还使用旋转矩阵等对 3d 点进行了一些平移。我决定使用 OpenCV 核心功能进行数学运算。使用最近添加到cv::Mat类中的构造函数将 acv::Point3d直接转换为 3x1的可能性cv::Mat大大减少并简化了代码。

我现在想知道的是是否有一种简单的方法可以将 3x1 或 1x3 转换cv::Matcv::Point3d? 我总是可以做类似的事情:

cv::Mat mat(3,1,CV_64FC1);
cv::Point3d p (mat.at<double>(0,0), mat.at<double>(1,0), mat.at<double>(2,0));

或者

cv::Mat mat(3,1,CV_64FC1);
const double *data = mat.ptr<double>(0);
cv::Point3d p (data[0], data[1], data[2]);

我非常担心性能(避免 3 次调用at方法)。

4

1 回答 1

13

cv::Point3d有一个允许直接创建的构造函数cv::Mat

cv::Mat mat(3,1,CV_64FC1);
cv::Point3d p(mat);

您可能没有考虑过的另一种可能性是使用cv::Matx而不是cv::Mat您的数学运算。我发现它更易于使用,并提供更多功能,例如Point无需转换的类型乘法:

cv::Point3d p(1,2,3);
cv::Matx33d m = cv::Matx33d::eye();
cv::Point3d p2 = m * p;

cv::Matx也是静态分配的,而不是动态分配的(如cv::Mat),以防您真的需要额外的一点性能。但是,正如所有与性能相关的建议一样:通过分析确保您正在优化的内容实际上是一个瓶颈。

于 2013-08-30T15:54:28.343 回答