opencv vector<point3f> to 3 column mat
У меня есть 2 вектора (p1 и p2) переменных point3f, которые представляют 2 трехмерных облака точек. Чтобы сопоставить эти два облака точек, я хочу использовать SVD, чтобы найти преобразование для этого. Проблема в том, что SVD требует матрицу (p1*p2 транспонирование). У меня вопрос, как мне преобразовать вектор размера Y в матрицу Yx3?
Я попытался cv::Mat p1Matrix(p1), но это дает мне вектор строки с двумя измерениями. Я также нашел fitLine, но я думаю, что это работает только для 2D.
Заранее спасибо.
2 ответа
Решение
Как насчет чего-то вроде:
cv::Mat p1copy(3, p1.size(), CV_32FC1);
for (size_t i = 0, end = p1.size(); i < end; ++i) {
p1copy.at<float>(0, i) = p1[i].x;
p1copy.at<float>(1, i) = p1[i].y;
p1copy.at<float>(2, i) = p1[i].z;
}
Если это дает желаемый результат, вы можете сделать код быстрее, используя указатель вместо довольно медленного at<>()
функция
Я использую функцию изменения формы для преобразования вектора точек в Mat.
vector<Point3f> P1,P2;
Point3f c1,c2;//center of two set
... //data association for two set
Mat A=Mat(P1).reshape(1).t();
Mat B=Mat(P2).reshape(1).t();
Mat AA,BB,CA,CB;
repeat(Mat(c1),1,P1.size(),CA);
repeat(Mat(c2),1,P2.size(),CB);
AA=A-CA;
BB=B-CB;
Mat H=AA*BB.t();
SVD svd(H);
Mat R_;
transpose(svd.u*svd.vt,R_);
if(determinant(R_)<0)
R_.at<float>(0,2)*=-1,R_.at<float>(1,2)*=-1,R_.at<float>(2,2)*=-1;
Mat t=Mat(c2)-R_*Mat(c1);