我试图用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
如果有人有什么想法,请告诉我。
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);