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

Posted

技术标签:

【中文标题】使用 OpenCV 在 C++ 中将 std::list 转换为 cv::Mat【英文标题】:Convert std::list to cv::Mat in C++ using OpenCV 【发布时间】: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

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

【问题讨论】:

【参考方案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 元素的矩阵中。这就是为什么我不得不再次询问。

以上是关于使用 OpenCV 在 C++ 中将 std::list 转换为 cv::Mat的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenCv c++ 中将图像添加到图像

如何在 C++ 中将 TF_Tensor 转换为 opencv Mat?

在 C++ 中将 vector<Rect> OpenCV 转换为 vector<vector<float>>

在 C++ 中将 NCHW 转换为 NHWC

在 C++ 中将 bmp 转换为 LINEAR jpeg

如何在 Android 中将 OpenCV 旋转和平移矢量与 OpenGL ES 一起使用?