我正在运行 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);