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

Convert std::list to cv::Mat in C++ using OpenCV

我正在尝试使用 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);