2

OpenCVのestimateAffine3D()関数を使用して、3Dの2セットの同一平面上の点間のアフィン変換を取得しようとしています。1つの変数を定数にすると、その変数の変換コンポーネントに定数エラーがあることがわかります。

私のテストコードは次のとおりです。

std::vector<cv::Point3f> first, second;
std::vector<uchar> inliers;
cv::Mat aff(3,4,CV_64F);

for (int i = 0; i <6; i++)
{
    first.push_back(cv::Point3f(i,i%3,1));
    second.push_back(cv::Point3f(i,i%3,1));
}

int ret = cv::estimateAffine3D(first, second, aff, inliers);
std::cout << aff << std::endl;

私が期待する出力は次のとおりです。

[1 0 0 0]  
[0 1 0 0]  
[0 0 1 0]

編集:私の期待は正しくありません。z座標が一定の場合、行列は[R|t]に分解されません。

しかし、私が得たものは(読みやすさのためにいくつかの丸めを加えて)次のとおりです。

[1 0 0 0]  
[0 1 0 0]  
[0 0 0.5 0.5]

この動作を修正する方法はありますか?2Dポイントのセットで同じことを行う機能はありますか?

4

2 に答える 2

2

コードをどのように実行しても、正常な出力が得られます。たとえば、あなたが投稿したとおりに実行すると、取得します。

[1,0,0 ,0]
[0,1,0 ,0]
[0,0,.5,.5]

同次座標の4番目の要素は1であると想定されているため、これは正しいです。2をz値として実行すると、次のようになります。

[1,0,0 ,0]
[0,1,0 ,0]
[0,0,.8,.4]

これも機能します(.8 * 2 + .4 = 2)。aff(2,2)を間違って読んだだけではありませんか?

于 2012-08-15T20:09:08.947 に答える
0

重要な問題は次のとおりです。目的は2セットの3Dポイント間の回転と平行移動を推定することですが、OpenCV関数estimateAffine3D()はその目的ではありません。その名前が示すように、この関数は2セットの3Dポイント間のアフィン変換を計算することです。アフィン変換を計算するとき、回転行列の制約は考慮されません。もちろん、結果は正しくありません。回転と平行移動を取得するには、SVDベースのアルゴリズムを実装する必要があります。Googleで「絶対標定」を検索できます。これは、古典的で閉じた形式のアルゴリズムです。

于 2013-11-26T08:55:31.697 に答える