示例#1
0
DeviceArray<pcl::gpu::MarchingCubes::PointType>
pcl::gpu::MarchingCubes::run(const TsdfVolume& tsdf, DeviceArray<PointType>& triangles_buffer)
{
    if (triangles_buffer.empty())
        triangles_buffer.create(DEFAULT_TRIANGLES_BUFFER_SIZE);
    occupied_voxels_buffer_.create(3, triangles_buffer.size() / 3);

    device::bindTextures(edgeTable_, triTable_, numVertsTable_);

    int active_voxels = device::getOccupiedVoxels(tsdf.data(), occupied_voxels_buffer_);
    if(!active_voxels)
    {
        device::unbindTextures();
        return DeviceArray<PointType>();
    }

    DeviceArray2D<int> occupied_voxels(3, active_voxels, occupied_voxels_buffer_.ptr(), occupied_voxels_buffer_.step());

    int total_vertexes = device::computeOffsetsAndTotalVertexes(occupied_voxels);

    float3 volume_size = device_cast<const float3>(tsdf.getSize());
    device::generateTriangles(tsdf.data(), occupied_voxels, volume_size, (DeviceArray<device::PointType>&)triangles_buffer);

    device::unbindTextures();
    return DeviceArray<PointType>(triangles_buffer.ptr(), total_vertexes);
}
示例#2
0
ColorVolume::ColorVolume(const TsdfVolume& tsdf)
 : resolution_(tsdf.getResolution()),
   volume_size_(tsdf.getSize())
{
    int volume_x = resolution_(0);
    int volume_y = resolution_(1);
    int volume_z = resolution_(2);
    color_volume_.create(volume_y * volume_z, volume_x);
    reset();
}
示例#3
0
void 
pcl::gpu::RayCaster::run(const TsdfVolume& volume, const Affine3f& camera_pose)
{  
  camera_pose_ = camera_pose;
  volume_size_ = volume.getSize();
  device::Intr intr (fx_, fy_, cx_, cy_);

  vertex_map_.create(rows * 3, cols);
  normal_map_.create(rows * 3, cols);

  typedef Matrix<float, 3, 3, RowMajor> Matrix3f;
    
  Matrix3f R = camera_pose_.linear();
  Vector3f t = camera_pose_.translation();

  const  Mat33& device_R   = device_cast<const Mat33>(R);
  const float3& device_t   = device_cast<const float3>(t);
  
  float tranc_dist = volume.getTsdfTruncDist();  
  device::raycast (intr, device_R, device_t, tranc_dist, device_cast<const float3>(volume_size_), volume.data(), vertex_map_, normal_map_);  
}