将3x1或1x3 cv :: Mat转换为cv :: Point3d?

pip*_*azo 9 c++ opencv matrix

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

我现在想知道的是,是否有一种简单的方法将3x1或1x3 cv::Mat转换为cv::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));
Run Code Online (Sandbox Code Playgroud)

要么

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

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

Aur*_*ius 12

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

cv::Mat mat(3,1,CV_64FC1);
cv::Point3d p(mat);
Run Code Online (Sandbox Code Playgroud)

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

cv::Point3d p(1,2,3);
cv::Matx33d m = cv::Matx33d::eye();
cv::Point3d p2 = m * p;
Run Code Online (Sandbox Code Playgroud)

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