2016-12-12 15 views
1

次のOpenCVコードを使用して、四角形マーカーの姿勢を推定し、画像上にマーカーの3つの軸を描きます。しかし、マーカーのZ軸は、下の図のように時々180度回転します。どのようにz軸を安定させるには?単一カメラを使用したマーカー姿勢推定のエラー

// Marker world coordinates 
vector<Point3f> objecPoints; 
objecPoints.push_back(Point3f(0, 0, 0)); 
objecPoints.push_back(Point3f(0, 2.4, 0)); 
objecPoints.push_back(Point3f(2.4, 2.4, 0)); 
objecPoints.push_back(Point3f(2.4, 0.0, 0)); 

// 2D image coordinates of 4 marker corners. They are arranged in the same order for each frame 
vector<Point2f> marker2DPoints; 

// Calculate Rotation and Translation 
cv::Mat Rvec; 
cv::Mat_<float> Tvec; 
cv::Mat raux, taux; 
cv::solvePnP(objecPoints, marker2DPoints, camMatrix, distCoeff, raux, taux); 

// Draw marker pose on the image 
vector<Point3f> axisPoints3D; 
axisPoints3D.push_back(Point3f(0, 0, 0)); 
axisPoints3D.push_back(Point3f(2.4, 0, 0)); 
axisPoints3D.push_back(Point3f(0, 2.4, 0)); 
axisPoints3D.push_back(Point3f(0, 0, 2.4)); 

vector<Point2f> axisPoints2D; 

// Take the camMatrix and distCoeff from camera calibration results 
projectPoints(axisPoints3D, Rvec, Tvec, camMatrix, distCoeff, axisPoints2D); 

line(srcImg, axisPoints2D[0], axisPoints2D[1], CV_RGB(0, 0, 255), 1, CV_AA); 
line(srcImg, axisPoints2D[0], axisPoints2D[2], CV_RGB(0, 255, 0), 1, CV_AA); 
line(srcImg, axisPoints2D[0], axisPoints2D[3], CV_RGB(255, 0, 0), 1, CV_AA); 

Pose estimation results at time t Pose estimation results at time t+1

+0

右のマーカー(ID 4)は対称的です(あなたが軸の上に置いた場合、同じArucoマーカーとして登録されます)。その場合、タグの向きがあいまいであるように見えます。これはID4にのみ起こりますか? (ID3は対称ではありません; ID4を同様の非対称タグに切り替えることができるのだろうかと思います)。 –

答えて

0

これはおそらくコメントとして良いだろうが、私はそのための十分な評判を持っていません。 solvePnPがあなたのタグの座標を取得しているので、これが起こっていると思います。 さらに、solvePnPは(この場合)3D平面上の4つの点を画像内の4つの2D点に一致させようとしているだけなので、複数の解決策があります。タグは、その上の軸の周りを回転させることができ、逆さまに反転させることもできる。 solvePnPは、上向きの方向である提供された点からはわかりません。

Iは、安定したタグの検出アルゴリズムは、安定した順序で姿勢推定コードにコーナーを供給することができなければならないようsolvePnPこの問題のために少しも一般的であることを直感を持っています。

編集:コーナーの順序は重要で、solvePnPで与えられる解はそれに依存します。おそらくコーナーポイントを生成するアルゴリズムは、一貫した順序でコーナーを提供していないでしょうか? tags.pointsの出力を共有してください

+0

私はこれを[最新のOpenCVのソース](https://github.com/opencv/opencv_contrib/blob/master/modules/aruco/src/aruco.cpp#L843)で発見しました。内部的にはsolvePnPを使ってArUcoと呼ばれる新しいタグの姿勢を推定する。 – allsey87

+0

マーカの四隅は、すでに正しく注文されており、すべてのフレームで一貫しています。コーナーポイントは、異なる色のドット(緑、青、黒およびシアン)でマークされ、上下の画像に示すように一貫しています。 – Udaya

関連する問題