6

SIFTアルゴリズムを実行して特徴を抽出した平面マーカーがあります。次に、ディテクターを実行してシーン内のこのマーカーを見つけ、再び特徴を抽出します。を使用して OpenCV でポイントを一致させ、一致したペアからホモグラフィを抽出しfindHomography()ます。

ここで、マーカーで検出された 2D ポイントを計算されたホモグラフィで投影して、シーンから測定された 3D ポイントと位置を比較し、再投影誤差を計算します。ピクセル座標、センチメートル、キャリブレーション マトリックスと混同しています。どの変換を最初に行うべきかわかりません。

誰かがこれに関するリンクを知っているか、方法を説明できますか?

4

1 に答える 1

6

ホモグラフィ行列 H を呼び出す場合、カメラ行列 K (ピクセルに変換する必要があります) は、解像度に応じて次のようになります。

Mat K= Mat::zeros(3,3,CV_32FC1);
K.at<float>(0,0)=500.0f;        
K.at<float>(0,2)=320.0f;      // width/2    
K.at<float>(1,1)=500.0f;    
K.at<float>(1,2)=240.0f;      // height/2 
K.at<float>(2,2)=1.0f;

マーカー ポイントが 2D のベクトル ポイントである場合:

vector<Point2f> marker_point; //containing coordinates in centimeters

投影はこのようになり、結果としてピクセル座標の 3D ポイントが得られます。

Mat point(3,1,CV_32FC1);        
point.at<float>(0) = marker_point.x;
point.at<float>(1) = marker_point.y;
point.at<float>(2) = 1.0f;
point = H* point;
point = point/point.at<float>(2);       //Normalize
point = K* point;                   //to pixels
于 2012-08-24T10:50:46.727 に答える