首页 文章

OpenCV立体匹配/校准

提问于
浏览
9

我最初在OpenCV论坛上发布了这个,但不幸的是,我没有得到太多的意见/回复,所以我发布在这里希望有人可能有一个方向可以建议吗?

我正在使用Bumblebee XB3立体相机,它有3个镜头 . 我花了大约三个星期阅读论坛,教程,学习OpenCV书以及使用立体声校准和立体声匹配功能的实际OpenCV文档 . 总而言之,我的问题是我生成了一个很好的视差图,但是非常差的点 Cloud ,看起来像是倾斜/压扁,并不能代表实际的场景 .

What I have done so far:

使用OpenCV stereo_calibration和stereo_matching示例:

使用国际象棋棋盘图像校准我的立体相机

1)原始场景图像:http://answers.opencv.org/upfiles/1380850337241986.jpg
2)在摄像机校准后使用矩阵校正从摄像机获得的原始图像
http://answers.opencv.org/upfiles/13808502665723237.png
3)使用立体匹配(SGBM)从校正后的图像生成视差图像
:4)将这些差异预测为3D点 Cloud

What I have done so far as elimination towards my problem:

  • 我尝试了第1和第2张图像,然后是第2张和第3张镜头,最后是第1张和第2张 .

  • 我通过改变距离(更近/更远)重新校准我的棋盘捕获

  • 我使用了20多个立体声对进行校准

  • 使用了不同的棋盘尺寸:我使用了9x6棋盘图像进行校准,现在切换为使用8x5图像

  • 我尝试过使用Block Matching和SGBM变体来获取
    结果比较相似 . 入门
    到目前为止,SGBM的结果更好 .

  • 我改变了差异范围,改变了SAD窗口大小等几乎没有改进

What I suspect the problem is:

我的视差图像看起来相对可接受,但下一步是使用Q矩阵转到3D点 Cloud . 我怀疑,我没有正确校准相机以生成正确的Q矩阵 . 不幸的是,我在思考我还能做些什么来获得更好的Q矩阵时,已经碰壁了 . 有人可以提出未来的建议吗?

我认为可能有问题的另一件事是我在使用cv :: stereoCalibrate函数时所做的假设 . 目前,我单独校准每个摄像头以获得摄像头和失真(cameraMatrix [0],distCoeffs [0]和cameraMatrix [1],distCoeffs [1])矩阵,因此它使stereoCalibrate功能的复杂性更容易一些 .

stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
                    cameraMatrix[0], distCoeffs[0],
                    cameraMatrix[1], distCoeffs[1],
                    imageSize, R, T, E, F,
                    TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
                    //CV_CALIB_FIX_ASPECT_RATIO +
                    //CV_CALIB_ZERO_TANGENT_DIST +
                    //CV_CALIB_SAME_FOCAL_LENGTH +
                    CV_CALIB_RATIONAL_MODEL 
                    //CV_CALIB_FIX_K3 + CV_CALIB_FIX_K4 + CV_CALIB_FIX_K5
                    );

另外,我认为提及我如何从差异到点 Cloud 可能是有用的 . 我正在使用OpenCV的cv :: reprojectImageTo3D,然后将数据写入PCL Point Cloud 结构 . 这是相关代码:

cv::reprojectImageTo3D( imgDisparity16S, reconstructed3D, Q, false, CV_32F);
  for (int i = 0; i < reconstructed3D.rows; i++)
  {
    for (int j = 0; j < reconstructed3D.cols; j++)
    {
        cv::Point3f cvPoint = reconstructed3D.at<cv::Point3f>(i, j);  
            //Filling in a PCL structure
            pcl::PointXYZRGB point;
            point.x = cvPoint.x;
            point.y = cvPoint.y;
            point.z = cvPoint.z;
            point.rgb = rectified_imgRight.at<cv::Vec3b>(i,j)[0]; //Grey information

            point_cloud_ptr->points.push_back (point);
    }
  }

  point_cloud_ptr->width = (int) point_cloud_ptr->points.size();
  point_cloud_ptr->height = 1;
  pcl::io::savePCDFileASCII("OpenCV-PointCloud.pts", *point_cloud_ptr);

PS:我选择上传这些图片的原因是场景有一些纹理,所以我期待回复说场景太均匀了 . 隔板和椅子上的盖子在质地方面也非常丰富 .

Few Questions:

你能帮我删除似乎是点 Cloud 一部分的图像/差异平面吗?为什么会这样?

有什么明显的东西我做错了吗?我会发布我的代码,但它与提供的OpenCV示例非常相似,我认为我没有更有创意地做任何事情 . 如果有一个特定的部分可能会引起关注,我可以 .

在我的天真看来,似乎差异图像是可以的 . 但点 Cloud 绝对不是我所期望的相对不错的差异图像,它更糟糕 .

如果有帮助的话,我已经提到了相机校准后得到的Q矩阵,可以看出明显的跳跃 . 将其与Learning OpenCV学习书相比较,我认为没有任何明显不正确的内容......

Q: rows: 4
   cols: 4
   data: [ 1., 0., 0., -5.9767076110839844e+002, 0., 1., 0.,
       -5.0785438156127930e+002, 0., 0., 0., 6.8683948509213735e+002, 0.,
       0., -4.4965180874519222e+000, 0. ]

感谢阅读,我会诚实地感谢任何建议......

1 回答

  • 0

    我在使用OpenCV(v.2.4.6)3D重建功能时发现了类似的问题 . 有些人,比如马丁·佩里斯,已经自己再次实施了 . http://blog.martinperis.com/2012/01/3d-reconstruction-with-opencv-and-point.html

    可悲的是,有时我在使用我的数据的两个实现中都发现了问题 . 所以,我认为在这些情况下我的问题是由于外部相机参数描述不佳造成的 . 也许,这也是你的情况 . : - ?

    PS . 为了摆脱背景你需要细分它 . 或者,至少在重建工作后检查大于阈值的深度值 . handleMissingValues标志仅消除“无穷大”PS2处的点 . 请告诉我们您是否解决了这个问题 . 我认为这对所有社区都有 Value . 日Thnx

相关问题