2015-05-27 198 views
0

我試圖使用SVD求解方程系統:cv::SVD::solveZ(A, x);,但A需要是Matrix。 OpenCV不提供任何std::listcv::Mat的轉換。所以我的問題是,是否有一種聰明的方式來轉換它而不必將std::list轉換爲std::vector使用OpenCV將std :: list轉換爲cv :: Mat使用OpenCV

矩陣A是一個3xN矩陣。我的清單包含Ncv::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 

如果有人有關於它的想法,那麼請告訴我。

回答

2

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

對不起,但我不禁要問:matPoint是一個3xN的三維矩陣(或者至少被OpenCV視爲)?如果我這樣寫,matPoints有一行和N列。這導致x具有N行和1列。但x應該是1x3 ... – jkl

+0

對不起,我混合了行和列。我編輯了答案。現在'matPoints'有(points.size())行3列。 @jkl – akarsakov

+0

啊,好的。涼。謝謝。我不是用在包括Vec3d元素的矩陣中。這就是爲什麼我不得不再次問。 – jkl