【问题标题】:OpenCV uncalibrated camera rectification for 3D reconstruction用于 3D 重建的 OpenCV 未校准相机校正
【发布时间】:2012-09-10 05:03:00
【问题描述】:

我正在运行 OpenCV 2.4.2。

我的项目包含一个 3D 人脸识别。

我正在尝试根据由未校准的相机拍摄的一对图像创建一个 3D 模型。
我的目标是获得一些用于识别过程的 3D 特征。

我正在尝试校准和校正相机,但效果不佳。
我做了这些步骤:

  • 从 2 张图片中提取 SURF 特征
  • 找到两个图像特征之间的对应关系
  • 感谢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);

【问题讨论】:

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


    【解决方案1】:

    虽然我不确定你想用这种方法对面部图像完成什么,但我发现你的方法存在以下问题。

    在找到单应矩阵 H1、H2 之前一切都很好,但在那之后:

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

    查看参考:warpPerspective on opencv doc

    不应有 WARP_INVERSE_MAP 标志,因为 H1 是前向单应性而非后向单应性。通过不使用此标志并使用未校准的相机图像,我得到了正确的结果。实际上,当您使用未校准的相机时,只要您能够在多次迭代中始终如一地识别基本矩阵,就没有问题。

    试试这个,让我们知道它是否适合你。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        首先首先检测/识别与 3D 重建无关。假设您确实想通过一台未校准的相机对物体进行 3D 重建,通常有两种选择:

        1) 您首先使用校准图案(通常是象棋图案)校准相机;请参阅 camera_calibration.cpp 示例。

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

        祝你好运!

        【讨论】:

        • 我无法校准相机,因为它们来自在线数据集,所以我无法计算内在和外在矩阵。我已经计算了 2 张图像之间的匹配。然后我计算了 F 矩阵和“stereoRectifyUncalibrated”H1 和 H2,然后是视差图。我从视差图和“虚构”Q 矩阵计算了“reprojectImageTo3D”(我不知道如何构建这个矩阵,所以我使用了单位矩阵)。你说的三角化是什么意思?你能更具体一点吗?我想使用 3D 特征(如果你知道使用什么特征)进行识别
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-30
        • 2013-01-28
        • 2014-10-23
        • 1970-01-01
        • 2016-04-30
        • 2012-04-18
        • 2016-12-29
        相关资源
        最近更新 更多