75

3D 座標系でオブジェクトを見つけるタスクがあります。ほぼ正確な X 座標と Y 座標を取得する必要があるため、この図のオレンジ色のボールのように、移動オブジェクトの上部に配置される既知の Z 座標を持つ 1 つのカラー マーカーを追跡することにしました。 歪みのない

最初に、カメラのキャリブレーションを行って内部パラメーターを取得し、その後、次のコードのように cv::solvePnP を使用して回転と平行移動ベクトルを取得しました。

std::vector<cv::Point2f> imagePoints;
std::vector<cv::Point3f> objectPoints;
//img points are green dots in the picture
imagePoints.push_back(cv::Point2f(271.,109.));
imagePoints.push_back(cv::Point2f(65.,208.));
imagePoints.push_back(cv::Point2f(334.,459.));
imagePoints.push_back(cv::Point2f(600.,225.));

//object points are measured in millimeters because calibration is done in mm also
objectPoints.push_back(cv::Point3f(0., 0., 0.));
objectPoints.push_back(cv::Point3f(-511.,2181.,0.));
objectPoints.push_back(cv::Point3f(-3574.,2354.,0.));
objectPoints.push_back(cv::Point3f(-3400.,0.,0.));

cv::Mat rvec(1,3,cv::DataType<double>::type);
cv::Mat tvec(1,3,cv::DataType<double>::type);
cv::Mat rotationMatrix(3,3,cv::DataType<double>::type);

cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec);
cv::Rodrigues(rvec,rotationMatrix);

すべての行列を取得した後、画像ポイントを世界座標に変換するのに役立つこの方程式:

変換式

ここで、M は cameraMatrix、R - 回転マトリックス、t - tvec、s は不明です。Zconst はオレンジ色のボールの高さを表し、この例では 285 mm です。したがって、最初に前の方程式を解いて「s」を取得する必要があります。その後、イメージ ポイントを選択して X 座標と Y 座標を見つけます。 式2

これを解決すると、行列の最後の行を使用して変数 "s" を見つけることができます。これは、Zconst が既知であるためです。そのための次のコードを次に示します。

cv::Mat uvPoint = (cv::Mat_<double>(3,1) << 363, 222, 1); // u = 363, v = 222, got this point using mouse callback

cv::Mat leftSideMat  = rotationMatrix.inv() * cameraMatrix.inv() * uvPoint;
cv::Mat rightSideMat = rotationMatrix.inv() * tvec;

double s = (285 + rightSideMat.at<double>(2,0))/leftSideMat.at<double>(2,0)); 
//285 represents the height Zconst

std::cout << "P = " << rotationMatrix.inv() * (s * cameraMatrix.inv() * uvPoint - tvec) << std::endl;

この後、結果が得られました: P = [-2629.5, 1272.6, 285.]

それを測定値と比較すると、次のようになります。 Preal = [-2629.6, 1269.5, 285.]

エラーは非常に小さく、非常に良いのですが、このボックスをこの部屋の端に移動すると、エラーが 20 ~ 40 mm になる可能性があり、これを改善したいと考えています。誰でもそれを手伝ってもらえますか、何か提案はありますか?

4

2 に答える 2

14

構成を考えると、エッジでの20〜40mmのエラーは平均的です。あなたはすべてをうまくやったようです。

カメラ/システム構成を変更しないと、改善は困難になります。カメラのキャリブレーションをやり直して、より良い結果を期待することはできますが、これによって大幅に改善されることはありません(最終的にはより悪い結果が得られる可能性があるため、実際の固有パラメーターを消去しないでください)

count0で述べたように、より高い精度が必要な場合は、複数の測定を行う必要があります。

于 2012-09-06T13:54:21.533 に答える