繁体   English   中英

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

[英]Emgu (OpenCV for C#) - building a disparity map using cvStereoRectify

我一直在使用用于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)?

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

我在几年内没有使用过EMGU,但是我用它来校准相机和Kinect。

我发现如果矩形是完全水平的,那么矩形角的排序可能会有些混乱 - 我从来没有真正理解为什么,这似乎对我有用。 尝试设置电路板,使矩形处于45度的卷(即从正面看,你会看到更多的钻石形状,如果这有任何意义)。

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

我不能保证这会解决你的问题 - 可能只是因为我的代码中存在严重错误,这就是为什么当棋盘平坦时它无法产生常规结果的原因。 再说一遍,它不会花费你很长时间来测试,可能只是工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM