我一直在使用Emgu C#封装的OpenCV来收集家庭立体摄像机拍摄的图像。两个网络摄像头固定在一块木板上,间距为35厘米,希望能够产生10-20米范围内的深度图。我已经尽力让它们尽可能平行(根据三角测量测试结果约为89.3度)。
我正在尝试从这些图像中制作视差图,虽然代码可以正常运行,但结果非常随机。我的意思是每次尝试运行立体矫正时,都会得到非常不同的结果,并且图像通常变形得非常严重,屏幕上几乎什么也看不到。
据我了解,做法如下:
1.打印棋盘格图案(例如6x8个内角),粘贴在平面物体上。
2.从相机1拍摄大约10张照片,保持棋盘格完全可见但位置不同。
3.使用CameraCalibration.FindChessboardCorners查找内角(6x8)。
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厘米,在办公室很难使棋盘格同时出现在两个相机视野中并且还要移动它。我认为由于这些值是内在的,因此与相机相关,因此应该可以顺利地传递到立体程序中。这是正确的吗?
似乎在cvStereoRectify过程中会改变内在值,并使其非常不同。
例如:第一阶段的畸变值=0.22、-1.2、0.01、-0.01、2.6;经过cvStereoRectify处理后,这些值被更改为10、-489、-0.03、-0.09、13208。
我正在尝试从这些图像中制作视差图,虽然代码可以正常运行,但结果非常随机。我的意思是每次尝试运行立体矫正时,都会得到非常不同的结果,并且图像通常变形得非常严重,屏幕上几乎什么也看不到。
据我了解,做法如下:
1.打印棋盘格图案(例如6x8个内角),粘贴在平面物体上。
2.从相机1拍摄大约10张照片,保持棋盘格完全可见但位置不同。
3.使用CameraCalibration.FindChessboardCorners查找内角(6x8)。
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厘米,在办公室很难使棋盘格同时出现在两个相机视野中并且还要移动它。我认为由于这些值是内在的,因此与相机相关,因此应该可以顺利地传递到立体程序中。这是正确的吗?
似乎在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),这个结果看起来正确吗?
非常感谢任何提示...我已经卡在这里有一段时间了...我真的不确定哪个部分出现了错误。任何提示或建议都将不胜感激...