我正在处理一些代码,其中执行大量 3x3 矩阵乘法,还使用旋转矩阵对 3d 点进行一些转换等。我决定使用 OpenCV 核心功能进行数学运算。使用最近添加到的构造函数的可能性cv::Mat
类来转换cv::Point3d
直接到 3x1cv::Mat
大大减少和简化了代码。
我现在想知道是否有一种简单的方法来转换 3x1 或 1x3cv::Mat
to an 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));
or
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
方法)。
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
),万一你really需要额外的一点性能。然而,正如所有与性能相关的建议一样:通过分析确保您正在优化的内容实际上是瓶颈。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)