c# - Emgu (OpenCV for C#) - 使用 cvStereoRectify 构建视差图

标签 c# emgucv disparity-mapping

我一直在使用用于 OpenCV 的出色 Emgu C# 包装器从自制立体装置收集图像。两个网络摄像头用 bolt 固定在一 block 木头上,相距 35 厘米,希望能让我生成 10-20 米范围内的深度图。我已将它们设置为尽可能平行(三角测量测试大约 89.3 度)。

我正在尝试根据这些制作视差图,尽管该过程作为代码运行,但结果非常随机。我的意思是,每次我尝试运行立体校正时,我都会得到非常不同的结果,而且图像经常严重扭曲,屏幕上几乎看不到任何东西。

据我了解,执行此操作的方法如下:


1) 打印棋盘图案(例如 6 x 8 的内角)- 贴在平坦的东西上。

2)用相机1拍摄一组10张左右的棋盘全景照片,但位置不同。

3) 使用 CameraCalibration.FindChessboardCorners 找到内角(6 x 8)

4) 使用 img.FindCornerSubPix() 将这些角点位置细化到子像素级别

5) 使用 CameraCalibration.CalibrateCamera() 计算内在相机细节,并将其保存为 XML 文件

6) 对相机 2 重复上述操作。

7) 现在您拥有相机内部失真信息,您可以拍摄立体照片对并使用 CameraCalibration.StereoCalibrate() 和先前计算的内部数据来计算外部信息(相机 1 和 2 之间的偏移和旋转)。

8) 使用 CvInvoke.cvStereoRectify() 和 CvInvoke.cvInitUndistortRectifyMap() 然后使用 CvInvoke.cvRemap() 构建输出图像,该图像应在 Y 中排列,以便您可以运行其中一个立体对应测试。

我发现您需要使用 Emgu 2.1 ver 806 才能使 cvStereoRectify 正常工作而不会出现访问冲突错误。


我想我的问题是:

A) 我的流程是否正确?我一直在将相机内部校准作为一个单独的过程进行,因为由于相机相距 35 厘米,所以很难在办公室里看到棋盘并四处移动棋盘......因为它很快就会偏离一边其中一个相机 View 。我认为由于这些值是固有的,因此这些值与相机有关,因此应该转移到立体程序 OK。这是正确的吗?

似乎内在值在 cvStereoRectify 过程中发生了变化,并且变得非常不同。

例如。第一阶段的失真值 = 0.22,-1.2,0.01,-0.01,2.6 在 cvStereoRectify 之后,值更改为= 10,-489,-0.03,-0.09,13208

我不是专家,但第一组似乎更像是我从其他人的评论中看到的,而第二组似乎很奇怪!

B) 有什么方法可以阻止在 cvStereoRectify 期间更新固有失真值吗?

C) 这对于内在值 (937,0,290,0,932,249,0,0,1) 来说是否正确?

非常感谢您提供的任何提示...我已经坚持了一段时间...而且我真的不确定过程的哪一部分引发了错误。任何提示或建议都将非常受欢迎......

最佳答案

我已经有几年没有使用 EMGU 了,但我用它来校准相机和 Kinect。

我发现如果矩形是完全水平的,矩形角的顺序可能会有些困惑 - 我从来没有真正弄清楚为什么,这似乎对我有用。尝试设置电路板,使矩形呈 45 度角滚动(即,从前面看,您会看到更多的菱形,如果这有意义的话)。

我最基本的理解是,这应该让两个摄像头都能轻松确保它们选择与第一个角相同的角来开始计数。

我不能保证这会解决您的问题 - 可能只是我的代码中存在严重错误,这就是为什么当棋盘是平的时它无法产生正常结果的原因。话又说回来,测试不会花很长时间,而且可能会奏效。

关于c# - Emgu (OpenCV for C#) - 使用 cvStereoRectify 构建视差图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3816791/

相关文章:

c# - 如何在C#中动态创建连接字符串

c# - 在 DataGrid.ItemsSource 更改后保持对一行的关注

c# - Razor Pages - 部分 View 和从模型获取数据的问题

opencv - 线性判别分析和主成分分析的主要区别是什么

c# - 更新内存数据表中的单元格

opencv - Emgu CV Blob 检测 - 视频监控示例

python - 用于在opencv3上进行视差映射的cv2.StereoSGBM_create()和cv2.StereoBM_create()函数之间有什么区别?

opencv - 使用 opencv StereoBM 的差视差图

matlab - Matlab/OpenCV立体视觉距离测量不准确

opencv - Visual Studio 2017 上的 EmguCV,无法构建示例解决方案