繁体   English   中英

opencv 向量<point3f>到 3 柱垫

[英]opencv vector<point3f> to 3 column mat

我有代表 2 个 3D 点云的 point3f 变量的 2 个向量(p1 和 p2)。 为了匹配这两个点云,我想使用 SVD 找到一个转换。 问题是 SVD 需要一个矩阵(p1*p2 转置)。 我的问题是如何将大小为 Y 的向量转换为 Yx3 矩阵?

我试过 cv::Mat p1Matrix(p1) 但这给了我一个二维的行向量。我也找到了 fitLine 但我认为这仅适用于 2D。

先感谢您。

怎么样:

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<>()函数来使代码更快

我使用 reshape 函数将点向量转换为 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM