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

C++ 在C+中将std::list转换为cv::Mat+;使用OpenCV,c++,list,opencv,mat,svd,C++,List,Opencv,Mat,Svd,我试图用SVD解一个方程组:cv::SVD::solveZ(A,x),但A需要是一个矩阵。OpenCV不提供将std::list转换为cv::Mat。因此,我的问题是,是否有一种聪明的方法可以将其转换,而不必在之前将std::list转换为std::vector 矩阵A是一个3xN矩阵。我的列表包含Ncv::Point3d元素 我的代码如下所示: std::list<cv::Point3d> points; // length: N cv::Mat A = cv::Mat(point

我试图用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
std::列出点;//长度:N
cv::Mat A=cv::Mat(点)。重塑(1);//这就是我使用std::vector的方法
cv::Mat x;
cv::SVD::solveZ(A,x);//齐次线性方程组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);
std::列出点;
cv::Mat matPoints(points.size(),1,cv_64FC3);
int i=0;
对于(自动和p:点){
matPoints.at(i++)=p;
}
拟合点=拟合点。重塑(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);
std::列出点;
cv::Mat matPoints(points.size(),1,cv_64FC3);
int i=0;
对于(自动和p:点){
matPoints.at(i++)=p;
}
拟合点=拟合点。重塑(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);
std::列出点;
cv::Mat matPoints(points.size(),1,cv_64FC3);
int i=0;
对于(自动和p:点){
matPoints.at(i++)=p;
}
拟合点=拟合点。重塑(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);
std::列出点;
cv::Mat matPoints(points.size(),1,cv_64FC3);
int i=0;
对于(自动和p:点){
matPoints.at(i++)=p;
}
拟合点=拟合点。重塑(1);

很抱歉,但我必须问:matPoints是3xN维矩阵吗(或者至少被OpenCV视为3xN维矩阵)?如果我这样写,那么matPoints有一行和N列。这导致x有N行和1列。但是x应该是1x3…对不起,我把行和列弄混了。我编辑了答案。现在
matPoints
有(points.size())行和3列@好的。酷。谢谢我在包括Vec3d元素的矩阵中不太常用。这就是我不得不再次问的原因。对不起,但我必须问:matPoints是3xN维矩阵吗(或者至少被OpenCV视为3xN维矩阵)?如果我这样写,那么matPoints有一行和N列。这导致x有N行和1列。但是x应该是1x3…对不起,我把行和列弄混了。我编辑了答案。现在
matPoints
有(points.size())行和3列@好的。酷。谢谢我在包括Vec3d元素的矩阵中不太常用。这就是我不得不再次问的原因。对不起,但我必须问:matPoints是3xN维矩阵吗(或者至少被OpenCV视为3xN维矩阵)?如果我这样写,那么matPoints有一行和N列。这导致x有N行和1列。但是x应该是1x3…对不起,我把行和列弄混了。我编辑了答案。现在
matPoints
有(points.size())行和3列@好的。酷。谢谢我在包括Vec3d元素的矩阵中不太常用。这就是我不得不再次问的原因。对不起,但我必须问:matPoints是3xN维矩阵吗(或者至少被OpenCV视为3xN维矩阵)?如果我这样写,那么matPoints有一行和N列。这导致x有N行和1列。但是x应该是1x3…对不起,我把行和列弄混了。我编辑了答案。现在
matPoints
有(points.size())行和3列@好的。酷。谢谢我在包括Vec3d元素的矩阵中不太常用。这就是为什么我不得不再问一次。