-1

2 つの 3D ポイントクラウドを表す point3f 変数の 2 つのベクトル (p1 と p2) があります。これら 2 つの点群を一致させるために、SVD を使用してこの変換を見つけたいと考えています。問題は、SVD が行列 (p1*p2 転置) を必要とすることです。私の質問は、サイズ Y のベクトルを Yx3 行列に変換するにはどうすればよいですか?

cv::Mat p1Matrix(p1) を試しましたが、これにより 2 次元の行ベクトルが得られます。fitLine も見つかりましたが、これは 2D でのみ機能すると思います。

前もって感謝します。

4

2 に答える 2

0

ポイントのベクトルをMatに変換するためにreshape関数を使用します。

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);
于 2015-08-09T14:47:58.953 に答える
0

次のようなものはどうですか:

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;
}

これで目的の結果が得られる場合は、かなり遅いfunctionの代わりにポインターを使用して、コードを高速化できat<>()ます。

于 2014-07-28T08:44:06.520 に答える