예제 #1
0
    // Generate a point cloud from depth and RGB data

    internal List<ColoredPoint3d> GeneratePointCloud(
      KinectSensor kinect, short[] depth, byte[] color,
      int sampling, bool withColor = false
    )
    {
      if (depth == null || color == null)
        return null;

      int depWidth = 640;

      // We will return a list of our ColoredPoint3d objects

      List<ColoredPoint3d> res = new List<ColoredPoint3d>();

      // Loop through the depth information - we process two
      // bytes at a time

      for (int i = 0; i < depth.Length; i += sampling)
      {
        // The x and y positions can be calculated using modulus
        // division from the array index

        int x = i % depWidth;
        int y = i / depWidth;

        SkeletonPoint p =
          kinect.MapDepthToSkeletonPoint(
            DepthImageFormat.Resolution640x480Fps30,
            x, y, depth[i]
          );

        // A zero value for Z means there is no usable depth for
        // that pixel

        if (p.Z > 0)
        {
          // Create a ColoredPoint3d to store our XYZ and RGB info
          // for a pixel

          ColoredPoint3d cv = new ColoredPoint3d();
          cv.X = p.X;
          cv.Y = p.Z;
          cv.Z = p.Y;

          // Only calculate the colour when it's needed (as it's
          // now more expensive, albeit more accurate)

          if (withColor)
          {
            // Get the colour indices for that particular depth
            // pixel

            ColorImagePoint cip =
              kinect.MapDepthToColorImagePoint(
                DepthImageFormat.Resolution640x480Fps30,
                x, y, depth[i],
                ColorImageFormat.RgbResolution640x480Fps30
              );

            // Extract the RGB data from the appropriate place
            // in the colour data

            int colIndex = 4 * (cip.X + (cip.Y * depWidth));
            if (colIndex <= color.GetUpperBound(0) - 2)
            {
                cv.B = (byte)(color[colIndex + 0]);
                cv.G = (byte)(color[colIndex + 1]);
                cv.R = (byte)(color[colIndex + 2]);
            }
          }
          else
          {
            // If we don't need colour information, just set each
            // pixel to white

            cv.B = 255;
            cv.G = 255;
            cv.R = 255;
          }

          // Add our pixel data to the list to return

          res.Add(cv);
        }
      }

      // Apply a bounding box filter, if one is defined

      if (_ext.HasValue)
      {
        // Use LINQ to get the points within the
        // bounding box

        var vecSet =
          from ColoredPoint3d vec in res
          where
            vec.X > _ext.Value.MinPoint.X &&
            vec.X < _ext.Value.MaxPoint.X &&
            vec.Y > _ext.Value.MinPoint.Y &&
            vec.Y < _ext.Value.MaxPoint.Y &&
            vec.Z > _ext.Value.MinPoint.Z &&
            vec.Z < _ext.Value.MaxPoint.Z
          select vec;

        // Convert our IEnumerable<> into a List<>

        res = vecSet.ToList<ColoredPoint3d>();
      }

      return res;
    }
예제 #2
0
        // Generate a point cloud from depth and RGB data

        internal List <ColoredPoint3d> GeneratePointCloud(
            KinectSensor kinect, ushort[] depth, byte[] color,
            int sampling, bool withColor = false
            )
        {
            if (depth == null || color == null)
            {
                return(null);
            }

            // We will return a list of our ColoredPoint3d objects

            var res = new List <ColoredPoint3d>();

            // We now need a CoordinateMapper to map the points

            var cm = _kinect.CoordinateMapper;

            // Loop through the depth information - we process two
            // bytes at a time

            for (int i = 0; i < depth.Length; i += sampling)
            {
                // The x and y positions can be calculated using modulus
                // division from the array index

                var pt = new DepthSpacePoint();
                pt.X = i % _depthWidth;
                pt.Y = i / _depthWidth;

                var p = cm.MapDepthPointToCameraSpace(pt, depth[i]);

                // A zero value for Z means there is no usable depth for
                // that pixel

                if (p.Z > 0)
                {
                    // Create a ColoredPoint3d to store our XYZ and RGB info
                    // for a pixel

                    var cv = new ColoredPoint3d();
                    cv.X = p.X;
                    cv.Y = p.Z;
                    cv.Z = p.Y;

                    // Only calculate the colour when it's needed

                    if (withColor)
                    {
                        // Get the colour indices for that particular depth
                        // pixel

                        var cip = cm.MapDepthPointToColorSpace(pt, depth[i]);

                        // Extract the RGB data from the appropriate place
                        // in the colour data

                        long colIndex =
                            (long)(4 * (Math.Floor(Math.Abs(cip.X)) +
                                        (Math.Floor(Math.Abs(cip.Y)) * _colorWidth))
                                   );
                        bool inside = colIndex < color.LongLength;
                        cv.B = (byte)(inside ? color[colIndex] : 0);
                        cv.G = (byte)(inside ? color[colIndex + 1] : 0);
                        cv.R = (byte)(inside ? color[colIndex + 2] : 0);
                    }
                    else
                    {
                        // If we don't need colour information, just set each
                        // pixel to white

                        cv.B = 255;
                        cv.G = 255;
                        cv.R = 255;
                    }

                    // Add our pixel data to the list to return

                    res.Add(cv);
                }
            }

            // Apply a bounding box filter, if one is defined

            if (_ext.HasValue)
            {
                // Use LINQ to get the points within the
                // bounding box

                var vecSet =
                    from ColoredPoint3d vec in res
                    where
                    vec.X > _ext.Value.MinPoint.X &&
                    vec.X <_ext.Value.MaxPoint.X &&
                           vec.Y> _ext.Value.MinPoint.Y &&
                    vec.Y <_ext.Value.MaxPoint.Y &&
                           vec.Z> _ext.Value.MinPoint.Z &&
                    vec.Z < _ext.Value.MaxPoint.Z
                    select vec;

                // Convert our IEnumerable<> into a List<>

                res = vecSet.ToList <ColoredPoint3d>();
            }

            return(res);
        }
예제 #3
0
        // Generate a point cloud from depth and RGB data

        internal List <ColoredPoint3d> GeneratePointCloud(
            KinectSensor kinect, short[] depth, byte[] color,
            int sampling, bool withColor = false
            )
        {
            if (depth == null || color == null)
            {
                return(null);
            }

            int depWidth = 640;

            // We will return a list of our ColoredPoint3d objects

            List <ColoredPoint3d> res = new List <ColoredPoint3d>();

            // Loop through the depth information - we process two
            // bytes at a time

            for (int i = 0; i < depth.Length; i += sampling)
            {
                // The x and y positions can be calculated using modulus
                // division from the array index

                int x = i % depWidth;
                int y = i / depWidth;

                SkeletonPoint p =
                    kinect.MapDepthToSkeletonPoint(
                        DepthImageFormat.Resolution640x480Fps30,
                        x, y, depth[i]
                        );

                // A zero value for Z means there is no usable depth for
                // that pixel

                if (p.Z > 0)
                {
                    // Create a ColoredPoint3d to store our XYZ and RGB info
                    // for a pixel

                    ColoredPoint3d cv = new ColoredPoint3d();
                    cv.X = p.X;
                    cv.Y = p.Z;
                    cv.Z = p.Y;

                    // Only calculate the colour when it's needed (as it's
                    // now more expensive, albeit more accurate)

                    if (withColor)
                    {
                        // Get the colour indices for that particular depth
                        // pixel

                        ColorImagePoint cip =
                            kinect.MapDepthToColorImagePoint(
                                DepthImageFormat.Resolution640x480Fps30,
                                x, y, depth[i],
                                ColorImageFormat.RgbResolution640x480Fps30
                                );

                        // Extract the RGB data from the appropriate place
                        // in the colour data

                        int colIndex = 4 * (cip.X + (cip.Y * depWidth));
                        if (colIndex <= color.GetUpperBound(0) - 2)
                        {
                            cv.B = (byte)(color[colIndex + 0]);
                            cv.G = (byte)(color[colIndex + 1]);
                            cv.R = (byte)(color[colIndex + 2]);
                        }
                    }
                    else
                    {
                        // If we don't need colour information, just set each
                        // pixel to white

                        cv.B = 255;
                        cv.G = 255;
                        cv.R = 255;
                    }

                    // Add our pixel data to the list to return

                    res.Add(cv);
                }
            }

            // Apply a bounding box filter, if one is defined

            if (_ext.HasValue)
            {
                // Use LINQ to get the points within the
                // bounding box

                var vecSet =
                    from ColoredPoint3d vec in res
                    where
                    vec.X > _ext.Value.MinPoint.X &&
                    vec.X <_ext.Value.MaxPoint.X &&
                           vec.Y> _ext.Value.MinPoint.Y &&
                    vec.Y <_ext.Value.MaxPoint.Y &&
                           vec.Z> _ext.Value.MinPoint.Z &&
                    vec.Z < _ext.Value.MaxPoint.Z
                    select vec;

                // Convert our IEnumerable<> into a List<>

                res = vecSet.ToList <ColoredPoint3d>();
            }

            return(res);
        }