【问题标题】:Convert std::list to cv::Mat in C++ using OpenCV使用 OpenCV 在 C++ 中将 std::list 转换为 cv::Mat
【发布时间】:2015-05-27 09:26:56
【问题描述】:

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

如果有人对此有任何想法,请告诉我。

【问题讨论】:

    标签: c++ list opencv mat svd


    【解决方案1】:

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

    【讨论】:

    • 对不起,但我不得不问:matPoints 是 3xN 维矩阵(或者至少被 OpenCV 视为这样)?如果我这样写,那么 matPoints 有一行 N 列。这导致 x 具有 N 行和 1 列。但是之后 x 应该是 1x3...
    • 抱歉,我把行和列弄混了。我编辑了答案。现在matPoints 有 (points.size()) 行和 3 列。 @jkl
    • 啊,好的。凉爽的。谢谢。我不是用在包括 Vec3d 元素的矩阵中。这就是为什么我不得不再次询问。
    猜你喜欢
    • 2022-06-25
    • 1970-01-01
    • 2021-05-07
    • 2017-06-03
    • 1970-01-01
    • 2017-12-24
    • 2018-04-16
    • 2011-06-28
    • 1970-01-01
    相关资源
    最近更新 更多