我正在处理一些代码,其中使用旋转矩阵进行大量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));
或
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
方法)。
答案 0 :(得分:11)
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
),以防真正需要额外的一点点性能。但是,正如所有与性能相关的建议一样:确保您所优化的内容实际上是分析的瓶颈。