4

SIFT記述子を照合し、RANSACによって変換行列を見つけることにより、入力画像内の特定のオブジェクトを検索しようとしています。オブジェクトは、2D空間での相似変換(スケーリング、回転、平行移動)によってのみシーンで変更できるため、3D空間での3x3ホモグラフィ行列ではなく2x2変換行列を推定する必要があります。OpenCVでこれをどのように達成できますか?

4

2 に答える 2

5

EstimatorRigidTransform を使用できます( RANSACかどうかはわかりません。コードはhttp://code.opencv.org/projects/opencv/repository/revisions/2.4.4/entry/modules/video/src/lkpyramid.cppにあります)。 RANSAC はそのコメントで述べています)、3 番目のパラメーターは、falseスケール + 回転 + 移動だけを取得するために設定されます。

#include <vector>
#include <iostream>
#include "opencv2/video/tracking.hpp"

int main( int argc, char** argv )
{
    std::vector<cv::Point2f> p1s,p2s;

    p1s.push_back(cv::Point2f( 1, 0));
    p1s.push_back(cv::Point2f( 0, 1));
    p1s.push_back(cv::Point2f(-1, 0));
    p1s.push_back(cv::Point2f( 0,-1));

    p2s.push_back(cv::Point2f(1+sqrt(2)/2, 1+sqrt(2)/2));
    p2s.push_back(cv::Point2f(1-sqrt(2)/2, 1+sqrt(2)/2));
    p2s.push_back(cv::Point2f(1-sqrt(2)/2, 1-sqrt(2)/2));
    p2s.push_back(cv::Point2f(1+sqrt(2)/2, 1-sqrt(2)/2));

    cv::Mat t = cv::estimateRigidTransform(p1s,p2s,false);

    std::cout << t << "\n";

    return 0;
}

OpenCV 2.4.4 でコンパイルおよびテストされています。出力は次のとおりです。

[0.7071067988872528, -0.7071067988872528, 1.000000029802322;
  0.7071067988872528, 0.7071067988872528, 1.000000029802322]
于 2013-03-17T13:44:34.593 に答える
2

opencvを使用してポイントセット間のアフィン変換を見つけることができます。これは、形状のせん断変換も説明するため、説明しているケース(相似変換と呼ばれる)よりも少し一般的です。

関数を使用して実行できますgetAffineTransform(InputArray src, InputArray dst)。これは 2 セットの 3 点を取り、それらの間のアフィン変換を計算します。

于 2013-02-12T16:40:10.893 に答える