次の質問について、お役に立てれば幸いです。
キャリブレーションされたステレオ リグからグレースケール イメージをキャプチャし、修正しました。現在、左の画像の特定の点の、左のカメラを基準とした現実世界の x、y、z 座標を取得しようとしています。そのために cvPerspectiveTransform を使用しようとしています。
私の短縮コードは以下のとおりです。
コードはある程度機能しているように見え、次の 4 つのデータ ポイント (15.4510、-474.7451、-527.0327、-912.6536) を返します。これは、x、y、z、および w を表すと理解しています。
質問 1) この仮定は正しいですか? - w による除算が既に行われ、XYZ が既に返されている可能性があります。その場合、-912.6536 は無視すべきアーティファクトです。これに関する意見を歓迎します。
質問 2) しかし、現実世界の座標 X、Y、Z を実現するために、それぞれ「x」、「y」、「z」を「w」で割る場合、結果の XYZ 座標はどの単位になりますか? それらはキャリブレーションで使用される「ポイント」に関連していると理解しています。この場合、チェス盤の角は 2.5 cm 離れていましたが、この場合のオブジェクトのカメラからの距離は約 60 cm でした...ご覧のとおり、数学はそうではありませんうまくいかない。
私は Bradski 本の関連するページを熱心に読みました (そしてオンラインで検索しました) が、何かが欠けているに違いありません。
Matrix<float> inputMatLeft = new Matrix<float>(4,1,3);
inputMatLeft[0,0] = xL; // xL, a float, the x coord of a point in the left image
inputMatLeft[1,0] = yL; // yL, a float, the y coord of same point in left image
inputMatLeft[2,0] = d; // d, a float, the disparity between the same featurepoint in the left and right rectified images, is calc'd and defined elsewhere
inputMatLeft[3,0] = 1F;
Matrix<float> rwCoords = new Matrix<float>(4,1,3);
rwCoords = computeRealWorldCoords(inputMatLeft);
// ....do stuff with rwCoords
public Matrix<float> computeRealWorldCoords(Matrix <float> leftSrc)
{
Matrix<float> leftDest = new Matrix<float>(4,1,3);
CvInvoke.cvPerspectiveTransform(leftSrc, leftDest, inputMatrixQ); // Q Matrix is 4x4 float
return leftDest;
}
ありがとう!