我目前正在使用Emgu cv框架在C#中编写立体视觉程序。我们的想法是在一个框架内跟踪一个球,并显示它与相机的实际距离。到目前为止我完成的任务如下:
1)我对相机校准进行操作,棋盘的角落由一系列彩色线条和圆圈标记。
2)我添加了代码以便对每个图像进行无效处理,以便在创建视差图时获得准确的匹配。
3)我使用立体块匹配显示视差图,并使用Emgu Cv中的reprojectImageTo3D()方法重新投影图像点
4)我在每个摄像机框架中跟踪球,并确定球中心的x和y坐标
目前我遇到的问题是如何显示reprojectImageTo3D方法中包含的视差图的X,Y和Z值?此变量是MCvPoint3D32f类型的数组,它是Emgu Cv类的一部分。我已经尝试了从点数组中检索值的常用方法,但没有成功。以下是包含此代码的方法:
private void Computer3DPointsFromStereoPair(Image<Gray, Byte> left, Image<Gray, Byte> right, out Image<Gray, short> disparityMap, out MCvPoint3D32f[] points)
{
Size size = left.Size;
disparityMap = new Image<Gray, short>(size);
//thread safe calibration values
using (StereoSGBM stereoSolver = new StereoSGBM(minDisparities, numDisparities, SAD, P1, P2, disp12MaxDiff, PreFilterCap, UniquenessRation, Speckle, SpeckleRange, fullDP))
//using (StereoBM stereoSolver = new StereoBM(Emgu.CV.CvEnum.Stereo_BM_TYPE.BASIC, 0))
{
stereoSolver.FindStereoCorrespondence(left, right, disparityMap);
points = PointCollection.ReprojectImageTo3D(disparityMap, Q);
}
}
提前致谢
此致
史蒂夫
答案 0 :(得分:2)
如果对ReprojectImageTo3D()
的调用成功(points != null
),您应该可以通过调用points[index].x
,points[index].y
和points[index].z
来访问各个点值分别为index
是有效的点索引。