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

tim*_*ror 7 c# disparity-mapping emgucv

我一直在使用用于OpenCV的伟大的Emgu C#包装器来收集家用立体声装备的图像.两个网络摄像头用螺栓固定在一块35厘米的木头上,希望能让我在10-20米范围内制作深度图.我将它们设置为尽可能平行(三角测试大约89.3度).

我正在尝试从这些中制作视差图,尽管该过程作为代码起作用,但结果非常随机.我的意思是每当我尝试运行立体声整流时,我会得到非常不同的结果,而且图像经常如此严重扭曲,屏幕上几乎看不到任何东西.

据我了解,这样做的方法如下:


1)打印出棋盘图案(例如6个8个内角) - 粘在平坦的东西上.

2)从相机1拍摄一组约10张照片,在全景但不同的位置拿着棋盘.

3)使用CameraCalibration.FindChessboardCorners查找内角(6乘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厘米,因为它们在办公室中并且很多时候移动它而不容易获得棋盘...因为它很快离开了其中一个相机视图.我认为由于值是固有的,因此它们与相机有关,因此应转移到立体声程序OK.它是否正确?

看起来内部值在cvStereoRectify过程中会发生变化,并且变得非常不同.

例如.cvStereoRectify后,第一阶段的失真值= 0.22,-1.2,0.01,-0.01,2.6,值变为= 10,-489,-0.03,-0.09,13208

我不是专家,但第一套看起来更像是我从其他人的评论中看到的,第二套似乎很明显!

B)有没有办法阻止在cvStereoRectify期间更新内在+失真值?

C)这似乎是正确的内在价值(937,0,290,0,932,249,0,0,1)?

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

mik*_*952 0

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

我发现,如果矩形完全水平,则矩形角的顺序可能会出现一些混乱 - 我从未真正了解原因,而这似乎对我有用。尝试设置板子,使矩形倾斜 45 度(即,从前面看,您会看到更多的菱形形状,如果这有意义的话)。

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

我不能保证这会解决你的问题 - 可能只是我的代码中有一些严重错误,这就是为什么当棋盘平坦时它无法产生常规结果。话又说回来,您不需要花很长时间进行测试,并且可能会起作用。