1

OpenCV 2.4.2 を実行しています。

私のプロジェクトは、3D 顔識別で構成されています。

キャリブレーションされていないカメラで撮影した画像のペアから 3D モデルを作成しようとしています。
私の目標は、識別プロセスに使用する 3D 機能を取得することです。

カメラのキャリブレーションと修正を試みていますが、良い結果が得られませんでした。
次の手順を実行しました。

  • 2 つの画像から抽出された SURF 特徴
  • 2 つの画像特徴間の一致が見つかりました
  • のおかげで基礎行列を計算しましたfindFundamentalMat
  • stereoRectifyUncalibratedホモグラフィ行列を取得するために 使用されます
  • warpPerspective最初の画像と最初のホモグラフィ行列と共に使用して、結果を確認します。

結果が悪くて、どうしたらいいのかわからない…

そのアルゴリズムは正しいですか?なにか提案を?

顔をより正確に識別するには、どのような 3D 機能を使用できますか?

ここにキャリブレーションコード:

/// Conversione di 1 vettore di keypoints in 2 vettori di Point2f
vector<int> pointIndexesLeft;
vector<int> pointIndexesFront;

for (vector<DMatch>::iterator it= matches_FL.begin(); it!= matches_FL.end(); ++it) {
    // Estrazione degli indici
    pointIndexesLeft.push_back(it->queryIdx);
    pointIndexesFront.push_back(it->trainIdx);
}

// Convrsione dei keypoints in Point2f
vector<cv::Point2f> selPointsLeft, selPointsFront;
KeyPoint::convert(keypoints_left,selPointsLeft,pointIndexesLeft);
KeyPoint::convert(keypoints_front,selPointsFront,pointIndexesFront);

// Calcolo della matrice fondamentale
Mat F = findFundamentalMat(
                           Mat(selPointsFront), // points in first image
                           Mat(selPointsLeft), // points in second image
                           CV_FM_RANSAC);       // 8-point method


/// Rettifico la camera
Mat H1,H2;
stereoRectifyUncalibrated(selPointsFront, selPointsLeft, F, img_front.size(), H1, H2,3);

Mat out_right= Mat::zeros(img_front.rows, img_front.cols, img_front.depth());
Mat out_left= Mat::zeros(img_left.rows, img_left.cols, img_front.depth());

warpPerspective(img_front,out_right, H1, img_front.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT);
warpPerspective(img_left,out_left, H2, img_left.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT);

imshow("out_right", out_right);
imshow("out_left", out_left);
4

3 に答える 3

2

まず第一に、最初の検出/識別は 3D 再構築とは関係ありません。キャリブレーションされていない 1 台のカメラから実際にオブジェクトの 3D 再構成を行いたい場合、通常は 2 つのオプションがあります。

1) まず、キャリブレーション パターン (通常はチェスのようなパターン) を使用してカメラをキャリブレーションします。camera_calibration.cpp の例を参照してください。

2) キャリブレーションと 3D 再構成の両方を同時に行うことができ、最も簡単なプロセスは次のようになります。最初に任意の特徴検出アルゴリズムを使用して顕著な点 (特徴) を抽出します (それぞれに長所と短所がありますが、いずれを使用しても取得する必要があります作業結果)、見つかった特徴の記述子を抽出し、条件の整った 2 つの写真の記述子を照合し、基本行列 F を見つけ、F から 2 つの射影行列 (3x4 行列) を抽出し、一致した特徴を三角測量し、その後、切除によって再帰的に続行します。 : すでに計算され、新しい写真の特徴と一致した 3D ポイントを使用して、そのカメラ行列 (内因性行列と外因性行列の両方) を計算し、新しい写真によってもたらされた新しい特徴を三角測量し、再構成された空間全体 (カメラと3D ポイント)。

幸運を!

于 2012-09-18T20:48:01.863 に答える
0

固有データなしでの 3D 再構成は苦痛です、私を信じてください。私は修正されたフラットベッドスキャナーで同じことをしています。

次の投稿もチェックしてください:カメラに関する情報なしの 2 つの画像からの 3D 再構成

于 2012-12-10T19:32:06.297 に答える