template <typename VoxelT, typename WeightT> template <typename PointT> void pcl::TSDFVolume<VoxelT, WeightT>::getVoxelCoord (const PointT &point, Eigen::Vector3i &coord) const { static Eigen::Array3f voxel_size = voxelSize().array(); // point coordinates in world coordinate frame and voxel coordinates Eigen::Array3f point_coord (point.x, point.y, point.z); Eigen::Array3f voxel_coord = (point_coord / voxel_size) - 0.5f; // 0.5f offset due to voxel center vs grid coord(0) = round(voxel_coord(0)); coord(1) = round(voxel_coord(1)); coord(2) = round(voxel_coord(2)); }
sender(async::dispatcher &worker, const t_syncRadiusList& syncRadien, t_terrainAccessor* tiles) : m_syncRadien(syncRadien) { BASSERT(tiles != nullptr); BASSERT(tiles->getNumLod() <= (int32)syncRadien.size()); real voxelSize(1.); for (int32 indLod = 0; indLod < tiles->getNumLod(); ++indLod) { const auto callback(boost::bind(&sender::isInRange, this, _1, _2, indLod)); t_simpleAccessor* toWork(tiles->getLod(indLod)); t_multipleTilesPtr lod(new t_multipleTiles(worker, voxelSize, callback, toWork)); voxelSize*=2.; m_multipleTiles.push_back(lod); lod->signalSendTileData()->connect(boost::bind(&sender::lodWantsToSendTileData, this, _1, _2, indLod)); } }
void ItkReader::ReadImageDirect(DataContainer& data) { typedef itk::ImageIOBase::IOComponentType ScalarPixelType; itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(p_url.getValue().c_str(), itk::ImageIOFactory::ReadMode); if (imageIO.IsNotNull()) { WeaklyTypedPointer wtp; imageIO->SetFileName(p_url.getValue()); imageIO->ReadImageInformation(); const ScalarPixelType pixelType = imageIO->GetComponentType(); const size_t numDimensions = imageIO->GetNumberOfDimensions(); LDEBUG("Reading Image with Reader " << imageIO->GetNameOfClass()); LDEBUG("Pixel Type is " << imageIO->GetComponentTypeAsString(pixelType)); LDEBUG("numDimensions: " << numDimensions); if (numDimensions > 3) { LERROR("Error: Dimensions higher than 3 not supported!"); return; } itk::ImageIORegion ioRegion(numDimensions); itk::ImageIORegion::IndexType ioStart = ioRegion.GetIndex(); itk::ImageIORegion::SizeType ioSize = ioRegion.GetSize(); cgt::vec3 imageOffset(0.f); cgt::vec3 voxelSize(1.f); cgt::ivec3 size_i(1); //we assured above that numDimensions is < 3 for (int i = 0; i < static_cast<int>(numDimensions); i++) { size_i[i] = imageIO->GetDimensions(i); imageOffset[i] = imageIO->GetOrigin(i); voxelSize[i] = imageIO->GetSpacing(i); ioStart[i] = 0; ioSize[i] = size_i[i]; } cgt::svec3 size(size_i); size_t dimensionality = (size_i[2] == 1) ? ((size_i[1] == 1) ? 1 : 2) : 3; LDEBUG("Image Size is " << size); LDEBUG("Voxel Size is " << voxelSize); LDEBUG("Image Offset is " << imageOffset); LDEBUG("component size: " << imageIO->GetComponentSize()); LDEBUG("components: " << imageIO->GetNumberOfComponents()); LDEBUG("pixel type (string): " << imageIO->GetPixelTypeAsString(imageIO->GetPixelType())); // 'vector' LDEBUG("pixel type: " << imageIO->GetPixelType()); // '5' switch (pixelType) { case itk::ImageIOBase::CHAR: wtp._baseType = WeaklyTypedPointer::INT8; break; case itk::ImageIOBase::UCHAR: wtp._baseType = WeaklyTypedPointer::UINT8; break; case itk::ImageIOBase::SHORT: wtp._baseType = WeaklyTypedPointer::INT16; break; case itk::ImageIOBase::USHORT: wtp._baseType = WeaklyTypedPointer::UINT16; break; case itk::ImageIOBase::INT: wtp._baseType = WeaklyTypedPointer::INT32; break; case itk::ImageIOBase::UINT: wtp._baseType = WeaklyTypedPointer::UINT32; break; case itk::ImageIOBase::DOUBLE: LWARNING("Pixel Type is DOUBLE. Conversion to float may result in loss of precision!"); case itk::ImageIOBase::FLOAT: wtp._baseType = WeaklyTypedPointer::FLOAT; break; default: LERROR("Error while loading ITK image: unsupported type: " << pixelType); return; } wtp._numChannels = imageIO->GetNumberOfComponents(); //Setup the image region to read ioRegion.SetIndex(ioStart); ioRegion.SetSize(ioSize); imageIO->SetIORegion(ioRegion); if (pixelType != itk::ImageIOBase::DOUBLE) { //Finally, allocate buffer and read the image data wtp._pointer = new uint8_t[imageIO->GetImageSizeInBytes()]; imageIO->Read(wtp._pointer); } else { //convert float volume to double volume double * inputBuf = new double[imageIO->GetImageSizeInComponents()]; wtp._pointer = new uint8_t[imageIO->GetImageSizeInComponents() * sizeof(float)]; imageIO->Read(inputBuf); double * dptr = inputBuf; float * fptr = static_cast<float*>(wtp._pointer); for (int i = 0, s = imageIO->GetImageSizeInComponents(); i < s; ++i) { *fptr = *dptr; fptr++; dptr++; } delete[] inputBuf; } ImageData* image = new ImageData(dimensionality, size, wtp._numChannels); ImageRepresentationLocal::create(image, wtp); image->setMappingInformation(ImageMappingInformation(size, imageOffset/* + p_imageOffset.getValue()*/, voxelSize /** p_voxelSize.getValue()*/)); data.addData(p_targetImageID.getValue(), image); } else { LWARNING("Unable to create ImageIO Instance; No suitable reader found!"); } }
void ItkReader::ReadImageSeries(DataContainer& data) { typedef itk::ImageIOBase::IOComponentType ScalarPixelType; std::vector<std::string> imageFileNames = GetImageFileNames(); if (!imageFileNames.size()) return; itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(imageFileNames[0].c_str(), itk::ImageIOFactory::ReadMode); const int numSlices = imageFileNames.size(); if (imageIO.IsNotNull()) { WeaklyTypedPointer wtp; imageIO->SetFileName(imageFileNames[0]); imageIO->ReadImageInformation(); const ScalarPixelType pixelType = imageIO->GetComponentType(); const size_t numDimensions = imageIO->GetNumberOfDimensions(); LDEBUG("Reading Image with Reader " << imageIO->GetNameOfClass()); LDEBUG("Pixel Type is " << imageIO->GetComponentTypeAsString(pixelType)); LDEBUG("numDimensions: " << numDimensions); if (numDimensions > 3) { LERROR("Error: Dimensions higher than 3 not supported!"); return; } itk::ImageIORegion ioRegion(numDimensions); itk::ImageIORegion::IndexType ioStart = ioRegion.GetIndex(); itk::ImageIORegion::SizeType ioSize = ioRegion.GetSize(); cgt::vec3 imageOffset(0.f); cgt::vec3 voxelSize(1.f); cgt::ivec3 size_i(1); //we assured above that numDimensions is < 3 for (int i = 0; i < static_cast<int>(numDimensions); i++) { size_i[i] = imageIO->GetDimensions(i); imageOffset[i] = imageIO->GetOrigin(i); voxelSize[i] = imageIO->GetSpacing(i); ioStart[i] = 0; ioSize[i] = size_i[i]; } cgt::svec3 size(size_i); size_t dimensionality = (size_i[2] == 1) ? ((size_i[1] == 1) ? 1 : 2) : 3; if (dimensionality > 2) { LERROR("Error: Cannot load image series with more than two dimensions!"); return; } LDEBUG("Image Size is " << size); LDEBUG("Voxel Size is " << voxelSize); LDEBUG("Image Offset is " << imageOffset); LDEBUG("component size: " << imageIO->GetComponentSize()); LDEBUG("components: " << imageIO->GetNumberOfComponents()); LDEBUG("pixel type (string): " << imageIO->GetPixelTypeAsString(imageIO->GetPixelType())); LDEBUG("pixel type: " << imageIO->GetPixelType()); switch (pixelType) { case itk::ImageIOBase::CHAR: wtp._baseType = WeaklyTypedPointer::INT8; break; case itk::ImageIOBase::UCHAR: wtp._baseType = WeaklyTypedPointer::UINT8; break; case itk::ImageIOBase::SHORT: wtp._baseType = WeaklyTypedPointer::INT16; break; case itk::ImageIOBase::USHORT: wtp._baseType = WeaklyTypedPointer::UINT16; break; case itk::ImageIOBase::INT: wtp._baseType = WeaklyTypedPointer::INT32; break; case itk::ImageIOBase::UINT: wtp._baseType = WeaklyTypedPointer::UINT32; break; case itk::ImageIOBase::DOUBLE: LWARNING("Pixel Type is DOUBLE. Conversion to float may result in loss of precision!"); case itk::ImageIOBase::FLOAT: wtp._baseType = WeaklyTypedPointer::FLOAT; break; default: LERROR("Error while loading ITK image: unsupported type: " << pixelType); return; } wtp._numChannels = imageIO->GetNumberOfComponents(); //Setup the image region to read ioRegion.SetIndex(ioStart); ioRegion.SetSize(ioSize); imageIO->SetIORegion(ioRegion); //allocate a temporary buffer if necessary double* inputBuf = (pixelType == itk::ImageIOBase::DOUBLE) ? new double[imageIO->GetImageSizeInComponents()] : nullptr; size_t sliceSize = (pixelType == itk::ImageIOBase::DOUBLE) ? imageIO->GetImageSizeInComponents() * sizeof(float) : imageIO->GetImageSizeInBytes(); wtp._pointer = new uint8_t[numSlices * sliceSize]; for (int idx = 0; idx < numSlices; ++idx) { itk::ImageIOBase::Pointer fileIO = imageIO; //itk::ImageIOFactory::CreateImageIO(imageFileNames[idx].c_str(), itk::ImageIOFactory::ReadMode); fileIO->SetFileName(imageFileNames[idx]); fileIO->ReadImageInformation(); fileIO->SetIORegion(ioRegion); size_t currentSliceSize = (pixelType == itk::ImageIOBase::DOUBLE) ? imageIO->GetImageSizeInComponents() * sizeof(float) : fileIO->GetImageSizeInBytes(); if (currentSliceSize != sliceSize) { LERROR("Image " << imageFileNames[idx] << " has different dimensionality or data type!"); delete static_cast<uint8_t*>(wtp._pointer); delete inputBuf; wtp._pointer = nullptr; return; } uint8_t* sliceBuffer = static_cast<uint8_t*>(wtp._pointer) + idx * sliceSize; if (pixelType != itk::ImageIOBase::DOUBLE) { // directly read slice into buffer fileIO->Read(sliceBuffer); } else { //convert float volume to double volume fileIO->Read(inputBuf); double* dptr = inputBuf; float* fptr = reinterpret_cast<float*>(sliceBuffer); for (int i = 0, s = fileIO->GetImageSizeInComponents(); i < s; ++i) { *fptr = static_cast<float>(*dptr); fptr++; dptr++; } } } delete[] inputBuf; size[2] = numSlices; //series adds one dimension ImageData* image = new ImageData(dimensionality+1, size, wtp._numChannels); ImageRepresentationLocal::create(image, wtp); image->setMappingInformation(ImageMappingInformation(size, imageOffset/* + p_imageOffset.getValue()*/, voxelSize /** p_voxelSize.getValue()*/)); data.addData(p_targetImageID.getValue(), image); } else { LWARNING("Unable to create ImageIO Instance; No suitable reader found!"); } }