在c++中使用OpenCV将std::list转换为cv::Mat



我试图用SVD解决一个方程组:cv::SVD::solveZ(A, x);,但A需要是一个矩阵。OpenCV不提供std::listcv::Mat的任何转换。所以我的问题是,是否有一种聪明的方法来转换它,而不必将std::list转换为std::vector之前。

矩阵A是一个3xN矩阵。我的列表包含N cv::Point3d元素。

我的代码看起来像这样:

std::list<cv::Point3d> points; // length: N
cv::Mat A = cv::Mat(points).reshape(1); // that's how I do it with a std::vector<cv::Point3d>
cv::Mat x;
cv::SVD::solveZ(A, x); // homogeneous linear equation system Ax = 0

如果有人有什么想法,请告诉我。

cv::Mat只能处理连续存储的数据,因此无法从std::list进行合适的转换。但是您可以自己实现它,如下所示:

std::list<cv::Point3d> points;
cv::Mat matPoints(points.size(), 1, CV_64FC3);
int i = 0;
for (auto &p : points) {
    matPoints.at<cv::Vec3d>(i++) = p;
}
matPoints = matPoints.reshape(1);

相关内容

  • 没有找到相关文章

最新更新