使用 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::list
到cv::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的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中将 TF_Tensor 转换为 opencv Mat?