OpenCV未经校准的摄像机校正用于3D重建

时间:2012-09-17 23:23:47

标签: c++ opencv 3d camera-calibration homography

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

2 个答案:

答案 0 :(得分:2)

首先,首先检测/识别与3D重建无关。假设您想要从一个未校准的相机中完成对象的3D重建,那么通常有两种选择:

1)首先使用校准模式校准相机(通常是国际象棋模式);请参阅camera_calibration.cpp示例。

2)你可以同时校准和进行3D重建,最简单的过程如下:首先使用任何特征检测算法提取显着点(特征)(每个都有优点和缺点,但任何一个都有你应该得到工作结果),为找到的特征提取描述符,匹配两个条件良好的照片的描述符,找到基本矩阵F,从F中提取两个投影矩阵(3x4矩阵),对匹配的特征进行三角测量,然后继续通过切除递归:使用已经计算的3D点和新照片中的匹配特征来计算其相机矩阵(内部和外部矩阵),对新照片带来的新特征进行三角测量,并对整个重建空间进行束调整(相机和3D点)。

祝你好运!

答案 1 :(得分:0)

没有任何内在数据的3D重构很痛苦,相信我。我用改进的平板扫描仪做同样的事情。

您还可以查看以下帖子:3d reconstruction from 2 images without info about the camera