使用emgu cv以C#的形式返回重投影3D方法的X、Y和Z值

使用emgu cv以C#的形式返回重投影3D方法的X、Y和Z值,c#,emgucv,C#,Emgucv,我目前正在使用Emgu cv框架用C#编写一个立体视觉程序。这个想法是在一帧内跟踪一个球,并显示它与摄像机的实际距离。到目前为止,我完成的任务如下: 1) 我有摄像机校准操作,棋盘的角落由一系列彩色线和圆圈标记 2) 我添加了代码,以便在创建视差贴图时不失真每个图像,从而获得精确的匹配 3) 我使用立体块匹配显示视差图,并使用Emgu Cv中的ReprojectMageto3D()方法重新投影图像点 4) 我在每个摄像头框架中跟踪球,并确定球中心的x和y坐标 然而,我目前面临的问题是如何显示重投

我目前正在使用Emgu cv框架用C#编写一个立体视觉程序。这个想法是在一帧内跟踪一个球,并显示它与摄像机的实际距离。到目前为止,我完成的任务如下:

1) 我有摄像机校准操作,棋盘的角落由一系列彩色线和圆圈标记

2) 我添加了代码,以便在创建视差贴图时不失真每个图像,从而获得精确的匹配

3) 我使用立体块匹配显示视差图,并使用Emgu Cv中的ReprojectMageto3D()方法重新投影图像点

4) 我在每个摄像头框架中跟踪球,并确定球中心的x和y坐标

然而,我目前面临的问题是如何显示重投影3D方法中包含的视差贴图的X、Y和Z值?此变量是属于Emgu Cv类的MCvPoint3D32f类型数组。我尝试了从点数组中检索值的常用方法,但没有成功。下面是我包含此代码的方法:

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);            
    }

}
private void computer3dpoints fromstereopair(图像左、图像右、输出图像差异映射、输出MCvPoint3D32f[]点)
{
大小=左。大小;
disparityMap=新图像(大小);
//线程安全校准值
使用(立体声GBM立体声Solver=新的立体声GBM(明度、亮度、SAD、P1、P2、disp12MaxDiff、预滤器盖、单向压缩、散斑、散斑范围、全DP))
//使用(StereoBM-stereoSolver=新的StereoBM(Emgu.CV.CvEnum.Stereo\u BM\u TYPE.BASIC,0))
{
立体解决方案。发现立体对应(左、右、差异映射);
点=点集合。重新投影到3D(disparityMap,Q);
}
}
提前谢谢

问候


Steve

如果调用
重新投影3D()
成功(
点!=null
),您应该能够通过分别调用
点[index].x
点[index].y
点[index].z来访问各个点值,其中
索引
是一个有效的点索引。

非常感谢您的回答。这非常有效。