C++ 用于三维重建的OpenCV未标定相机校正

C++ 用于三维重建的OpenCV未标定相机校正,c++,opencv,3d,camera-calibration,homography,C++,Opencv,3d,Camera Calibration,Homography,我正在运行OpenCV 2.4.2 我的项目包括3D人脸识别 我正试图从未校准的相机拍摄的一对图像创建一个3D模型 我的目标是获得一些3D特征用于识别过程 我正在尝试校准和校正相机,但没有得到好的结果。 我采取了以下步骤: 从2幅图像中提取冲浪特征 找到了两个图像特征之间的对应关系 由于findFundamentalMat 使用stereographic获得单应矩阵 对第一幅图像和第一个单应矩阵使用透视,以查看结果 我得到了一个非常糟糕的结果,我不知道现在该怎么办 那个算法正确吗?有什么建议

我正在运行OpenCV 2.4.2

我的项目包括3D人脸识别

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

我正在尝试校准和校正相机,但没有得到好的结果。
我采取了以下步骤:

  • 从2幅图像中提取冲浪特征
  • 找到了两个图像特征之间的对应关系
  • 由于
    findFundamentalMat
  • 使用
    stereographic
    获得单应矩阵
  • 对第一幅图像和第一个单应矩阵使用
    透视
    ,以查看结果
我得到了一个非常糟糕的结果,我不知道现在该怎么办

那个算法正确吗?有什么建议吗

我可以使用什么样的3D特征来获得更好的人脸识别

此处显示校准代码:

///conversionone-di-1-vettori-di-Point2f中的关键点
向量点索引;
矢量点索引前端;
for(vector::iterator it=matches_FL.begin();it!=matches_FL.end();+it){
//印度埃斯特拉齐奥酒店
PointIndexLeft.向后推(it->queryIdx);
PointIndexFront.向后推(it->trainIdx);
}
//转换点2F中的dei关键点
向量selPointsLeft,selPointsFront;
KeyPoint::convert(keypoints\u left、selPointsLeft、pointindexelft);
KeyPoint::convert(keypoints\u front、selpointsffront、pointindexsffront);
//Calcolo della matrice fondamentale酒店
Mat F=findFundamentalMat(
Mat(selPointsFront),//第一个图像中的点
Mat(selPointsLeft),//第二个图像中的点
CV_FM_RANSAC);//八点法
///雷蒂菲科照相机
math1,H2;
立体校正未校准(selPointsFront、selPointsLeft、F、img_front.size()、H1、H2、3);
Mat out_right=Mat::零(img_front.rows、img_front.cols、img_front.depth());
Mat out_left=Mat::零(img_left.rows、img_left.cols、img_front.depth());
warpPerspective(img_front,out_right,H1,img_front.size(),INTER_LINEAR | WARP_Reverse_MAP,BORDER_TRANSPARENT);
warpPerspective(img_left,out_left,H2,img_left.size(),内部线性扭曲反转贴图,边框透明);
imshow(“右外”,右外);
imshow(“左外”,左外);

首先,第一次检测/识别与三维重建无关。假设您确实希望从一个未校准的摄影机对对象进行三维重建,通常有两个选项:

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

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


祝你好运!

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


你也可以查看下面的帖子:

尽管我不确定你想用这种方法处理人脸图像,但我发现你的方法有以下问题

在找到单应矩阵H1、H2之前,一切正常,但在此之后:

warpPerspective(img_front,out_right,H1,img_front.size(),INTER_LINEAR | WARP_reverse_MAP,BORDER_TRANSPARENT);

warpPerspective(img_left,out_left,H2,img_left.size(),INTER_LINEAR | WARP_reverse_MAP,BORDER_TRANSPARENT);
我无法校准相机,因为它们来自在线数据集,所以我无法计算内部和外部矩阵。我已经计算了两幅图像之间的匹配。然后我计算了F矩阵和“重建”H1和H2,然后是视差图。我从视差图和一个“想象的”Q矩阵中计算了“重投影到3D”(我不知道如何构建这个矩阵,所以我使用了一个单位矩阵)。你说三角测量是什么意思?你能更具体一点吗?我想使用3D功能(如果您知道使用什么功能)用于识别