【问题标题】:Converting Kinect depth image to Real world coordinate将 Kinect 深度图像转换为真实世界坐标
【发布时间】:2014-06-15 12:19:32
【问题描述】:

我正在使用 kinect,使用 OpenNI 2.x、c++、OpenCV。

我能够获得 kinect 深度流并获得灰度 cv::Mat。只是为了说明它是如何定义的:

cv::Mat m_depthImage;
m_depthImage= cvCreateImage(cvSize(640, 480), 8, 1);

我假设最近的值用“0”表示,最远的用“255”表示。

之后,我将深度坐标转换为世界坐标。我逐个元素地执行 cv::Mat 灰度矩阵,并在 PointsWorld[640*480] 中收集数据。 为了显示这些数据,我调整了比例以便在 2000x2000x2000 矩阵中收集值。

cv::Point3f depthPoint;
cv::Point3f PointsWorld[640*480];
for (int j=0;j<m_depthImage.rows;j++)
    {
        for(int i=0;i<m_depthImage.cols; i++)
        {
            depthPoint.x = (float) i;
            depthPoint.y = (float) j;
            depthPoint.z = (float) m_depthImage.at<unsigned char>(j, i);

            if (depthPoint.z!=255)
            {
                  openni::CoordinateConverter::convertDepthToWorld(*m_depth,depthPoint.x,depthPoint.y,depthPoint.z, &wx,&wy,&wz);
                wx = wx*7,2464; //138->1000
                if (wx<-999)    wx = -999;
                if (wx>999)     wx = 999;

                wy = wy*7,2464; //111->1000 with 9,009
                if (wy<-999)    wy = -999;
                if (wy>999)     wy = 999;

                wz=wz*7,8431;   //255->2000
                if (wz>1999)        wy = 1999;

                Xsp = P-floor(wx);
                Ysp = P+floor(wy);
                Zsp = 2*P-floor(wz);

                PointsWorld[k].x = Xsp;
                PointsWorld[k].y = Ysp;
                PointsWorld[k].z = Zsp;

                k++;
            }
        }
    }

但我确信这样做不会让我理解点之间的实际距离。一个 x,y,z 坐标意味着什么? 有一种方法可以知道点之间的真实距离,知道有多远,例如矩阵“255”的灰度值?以及 wx,wy,wz 它们的用途是什么?

【问题讨论】:

  • 你为什么代表0到255的深度?你这样做是为了显示深度吗?或者你需要它来获得点之间的距离?如果它是第二个,您应该使用任何双精度/浮点值,甚至更好地使用其他库,如 PCL。如果您进行了缩放以保存图像,我的建议是您应该使用其他方式来保存它们,例如 yml/xml(opencv 文件存储)或 .pcd 文件(PCL)

标签: c++ opencv kinect openni depth


【解决方案1】:

如果您使用 OpenNI 支持构建 OpenCV,您应该能够执行以下操作:

int ptcnt;
cv::Mat real;
cv::Point3f PointsWorld[640*480];
if( capture.retrieve(real, CV_CAP_OPENNI_POINT_CLOUD_MAP)){
    for (int j=0;j<m_depthImage.rows;j++)
    {
        for(int i=0;i<m_depthImage.cols; i++){
            PointsWorld[ptcnt] = real.at<cv::Vec3f>(i,j);
            ptcnt++;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2012-02-06
    • 2012-07-31
    • 1970-01-01
    • 2018-07-03
    • 2022-08-20
    相关资源
    最近更新 更多