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);