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

标签 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));

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

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

最佳答案

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),以防您真的需要它额外的一点性能。然而,就像所有与性能相关的建议一样:通过分析确保您正在优化的实际上是一个瓶颈。

关于c++ - 将 3x1 或 1x3 cv::Mat 转换为 cv::Point3d?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18523894/

相关文章:

c++ - 如何在Mac中编译/运行CPP文件

c++ - 如何在 C++ 中分配可变参数/变量参数

c++ - typedef 和非简单类型说明符

python - 从矩阵 B 的每一行中减去矩阵 A 的每一行,无需循环

python - ND矩阵乘法,无需使用numpy.dot

c - 如何使用c中的指针将两个矩阵相加?

c++ - Qt C++错误没有匹配函数调用 'QString::QString(KeySequence)'

c++ - 启动项目的最佳方式 : OpenCV + GUI (C++)

python - 使用opencv完成边缘补全

opencv - 如何将值分配给opencv矩阵Mat?