如何在PCL中增长积分

时间:2016-04-22 09:35:35

标签: c++ visual-c++ image-processing computer-vision point-cloud-library

我有一套3D点云,我需要增加积分。通过这个,我的意思是我希望这些点能够获得一些直径。如果可能的话,我想像正方形而不是圆圈一样增长点。这是检测算法的第一步。现在我有3D点,但如果需要我可以将它们转换为2D。

这是试图解释我想要实现的目标的图像。也就是说,给定一个点(或一组点)展开它们。

enter image description here

谢谢你,Alex。

1 个答案:

答案 0 :(得分:1)

你需要扩张过滤器。

如果你的云被设置为bool数组,其中true代表点而虚假 - 空虚,你的云的大小是[width x height x depth],数组的大小是width * height * depth:< / p>

std::vector<bool> mask(width * height * depth);

point [x,y,z]由值掩码[x + y * width + z * width * height]表示

以下是扩展卷中每个真值的代码示例(您调用Dialte3D函数):

void DilateDirection(std::vector<bool> &mask, int dimension1, int dimension2, int dilateDimension3, 
                     int dim1offset, int dim2offset, int dim3offset, int radius)
{
  for (int k = 0; k < dimension2; k++)
    for (int j = 0; j < dimension1; j++)
    {
      int r = 0;
      for (int i = 0; i < dilateDimension3; i++)
      {
        if (mask[i * dim3offset + j * dim1offset + k * dim2offset])  //start expanding
          r = radius + 1;
        else
          r--;
        if (r > 0)
          mask[i * dim3offset + j * dim1offset + k * dim2offset] = true; //expand in + direction
      }
      r = 0;
      for (int i = dilateDimension3 - 1; i >= 0; i--)
      {
        if (mask[i * dim3offset + j * dim1offset + k * dim2offset]) //start expanding
          r = radius + 1;
        else
          r--;
        if (r > 0)
          mask[i * dim3offset + j * dim1offset + k * dim2offset] = true; //expand in - direction
      }
    }
}

void Dilate3D(std::vector<bool> &mask, int width, int height, int depth, int radius)
{
  DilateDirection(mask, height, depth, width, width, width * height, 1, radius); //dilate by X
  DilateDirection(mask, width, depth, height, 1, width * height, width, radius); //dilate by Y
  DilateDirection(mask, width, height, depth, 1, width, width * height, radius); //dilate by Z
}