27 #include <pcl/common/colors.h> 
   28 #include <pcl/io/pcd_io.h> 
   36     visionx::PointContentType
 
   37     getPointContentType<pcl::PointXYZ>()
 
   39         return visionx::ePoints;
 
   43     visionx::PointContentType
 
   44     getPointContentType<pcl::PointXYZL>()
 
   46         return visionx::eLabeledPoints;
 
   50     visionx::PointContentType
 
   51     getPointContentType<pcl::PointXYZI>()
 
   53         return visionx::eIntensity;
 
   58     getPointContentType<pcl::PointNormal>()
 
   60         return visionx::eOrientedPoints;
 
   64     visionx::PointContentType
 
   65     getPointContentType<pcl::PointXYZRGBA>()
 
   67         return visionx::eColoredPoints;
 
   71     visionx::PointContentType
 
   72     getPointContentType<pcl::PointXYZRGBL>()
 
   74         return visionx::eColoredLabeledPoints;
 
   78     visionx::PointContentType
 
   79     getPointContentType<pcl::PointXYZRGBNormal>()
 
   81         return visionx::eColoredOrientedPoints;
 
   89             case visionx::ePoints:
 
   90                 return sizeof(visionx::Point3D);
 
   92             case visionx::eColoredPoints:
 
   93                 return sizeof(visionx::ColoredPoint3D);
 
   95             case visionx::eOrientedPoints:
 
   96                 return sizeof(visionx::OrientedPoint3D);
 
   98             case visionx::eColoredOrientedPoints:
 
   99                 return sizeof(visionx::ColoredOrientedPoint3D);
 
  101             case visionx::eLabeledPoints:
 
  102                 return sizeof(visionx::LabeledPoint3D);
 
  104             case visionx::eColoredLabeledPoints:
 
  105                 return sizeof(visionx::ColoredLabeledPoint3D);
 
  107             case visionx::eIntensity:
 
  108                 return sizeof(visionx::IntensityPoint3D);
 
  121             case visionx::eColoredPoints:
 
  122             case visionx::eColoredOrientedPoints:
 
  123             case visionx::eColoredLabeledPoints:
 
  135             case visionx::eLabeledPoints:
 
  136             case visionx::eColoredLabeledPoints:
 
  146         const unsigned int Area = sourcePtr->width * sourcePtr->height;
 
  147         visionx::ColoredPoint3D* pBuffer = 
new visionx::ColoredPoint3D[
Area];
 
  149         size_t size = sourcePtr->points.size();
 
  150         auto& points = sourcePtr->points;
 
  151         for (
size_t i = 0; i < size; i++)
 
  154             auto& pB = pBuffer[i];
 
  164         memcpy(
target[0], pBuffer, 
Area * 
sizeof(visionx::ColoredPoint3D));
 
  170                  visionx::MetaPointCloudFormatPtr pointCloudFormat,
 
  171                  pcl::PointCloud<pcl::PointXYZRGBA>::Ptr targetPtr)
 
  173         if (pointCloudFormat->type == visionx::ePoints)
 
  175             targetPtr->width = 
static_cast<uint32_t
>(pointCloudFormat->width);
 
  176             targetPtr->height = 
static_cast<uint32_t
>(pointCloudFormat->height);
 
  177             targetPtr->points.resize(pointCloudFormat->size /
 
  179             visionx::Point3D* pBuffer = 
reinterpret_cast<visionx::Point3D*
>(*source);
 
  180             size_t size = targetPtr->points.size();
 
  181             auto& points = targetPtr->points;
 
  182             for (
size_t i = 0; i < size; i++)
 
  185                 auto& pB = pBuffer[i];
 
  191         else if (pointCloudFormat->type == visionx::eColoredPoints)
 
  193             targetPtr->width = 
static_cast<uint32_t
>(pointCloudFormat->width);
 
  194             targetPtr->height = 
static_cast<uint32_t
>(pointCloudFormat->height);
 
  195             targetPtr->points.resize(pointCloudFormat->size /
 
  197             visionx::ColoredPoint3D* pBuffer = 
reinterpret_cast<visionx::ColoredPoint3D*
>(*source);
 
  198             size_t size = targetPtr->points.size();
 
  199             auto& points = targetPtr->points;
 
  200             for (
size_t i = 0; i < size; i++)
 
  203                 auto& pB = pBuffer[i];
 
  213         else if (pointCloudFormat->type == visionx::eColoredLabeledPoints)
 
  216             pcl::PointCloud<pcl::PointXYZRGBL>::Ptr temp(
new pcl::PointCloud<pcl::PointXYZRGBL>());
 
  218             pcl::copyPointCloud(*temp, *targetPtr);
 
  225         const unsigned int Area = sourcePtr->width * sourcePtr->height;
 
  226         visionx::LabeledPoint3D* pBuffer = 
new visionx::LabeledPoint3D[
Area];
 
  228         for (
size_t i = 0; i < sourcePtr->points.size(); i++)
 
  230             pBuffer[i].point.x = sourcePtr->points[i].x;
 
  231             pBuffer[i].point.y = sourcePtr->points[i].y;
 
  232             pBuffer[i].point.z = sourcePtr->points[i].z;
 
  233             pBuffer[i].label = 
static_cast<int>(sourcePtr->points[i].label);
 
  236         memcpy(
target[0], pBuffer, 
Area * 
sizeof(visionx::LabeledPoint3D));
 
  242                  visionx::MetaPointCloudFormatPtr pointCloudFormat,
 
  243                  pcl::PointCloud<pcl::PointXYZL>::Ptr targetPtr)
 
  245         targetPtr->width = 
static_cast<uint32_t
>(pointCloudFormat->width);
 
  246         targetPtr->height = 
static_cast<uint32_t
>(pointCloudFormat->height);
 
  247         targetPtr->points.resize(pointCloudFormat->size / 
getBytesPerPoint(pointCloudFormat->type));
 
  248         visionx::LabeledPoint3D* pBuffer = 
reinterpret_cast<visionx::LabeledPoint3D*
>(*source);
 
  250         for (
size_t i = 0; i < targetPtr->points.size(); i++)
 
  252             targetPtr->points[i].x = pBuffer[i].point.x;
 
  253             targetPtr->points[i].y = pBuffer[i].point.y;
 
  254             targetPtr->points[i].z = pBuffer[i].point.z;
 
  255             targetPtr->points[i].label = 
static_cast<uint32_t
>(pBuffer[i].label);
 
  262         const unsigned int Area = sourcePtr->width * sourcePtr->height;
 
  263         visionx::IntensityPoint3D* pBuffer = 
new visionx::IntensityPoint3D[
Area];
 
  265         for (
size_t i = 0; i < sourcePtr->points.size(); i++)
 
  267             pBuffer[i].point.x = sourcePtr->points[i].x;
 
  268             pBuffer[i].point.y = sourcePtr->points[i].y;
 
  269             pBuffer[i].point.z = sourcePtr->points[i].z;
 
  270             pBuffer[i].intensity = sourcePtr->points[i].intensity;
 
  273         memcpy(
target[0], pBuffer, 
Area * 
sizeof(visionx::IntensityPoint3D));
 
  279                  visionx::MetaPointCloudFormatPtr pointCloudFormat,
 
  280                  pcl::PointCloud<pcl::PointXYZI>::Ptr targetPtr)
 
  282         targetPtr->width = 
static_cast<uint32_t
>(pointCloudFormat->width);
 
  283         targetPtr->height = 
static_cast<uint32_t
>(pointCloudFormat->height);
 
  284         targetPtr->points.resize(pointCloudFormat->size / 
getBytesPerPoint(pointCloudFormat->type));
 
  285         visionx::IntensityPoint3D* pBuffer = 
reinterpret_cast<visionx::IntensityPoint3D*
>(*source);
 
  287         for (
size_t i = 0; i < targetPtr->points.size(); i++)
 
  289             targetPtr->points[i].x = pBuffer[i].point.x;
 
  290             targetPtr->points[i].y = pBuffer[i].point.y;
 
  291             targetPtr->points[i].z = pBuffer[i].point.z;
 
  292             targetPtr->points[i].intensity = pBuffer[i].intensity;
 
  299         const unsigned int Area = sourcePtr->width * sourcePtr->height;
 
  300         visionx::Point3D* pBuffer = 
new visionx::Point3D[
Area];
 
  302         for (
size_t i = 0; i < sourcePtr->points.size(); i++)
 
  304             pBuffer[i].x = sourcePtr->points[i].x;
 
  305             pBuffer[i].y = sourcePtr->points[i].y;
 
  306             pBuffer[i].z = sourcePtr->points[i].z;
 
  309         memcpy(
target[0], pBuffer, 
Area * 
sizeof(visionx::Point3D));
 
  315                  visionx::MetaPointCloudFormatPtr pointCloudFormat,
 
  316                  pcl::PointCloud<pcl::PointXYZ>::Ptr targetPtr)
 
  318         targetPtr->width = 
static_cast<uint32_t
>(pointCloudFormat->width);
 
  319         targetPtr->height = 
static_cast<uint32_t
>(pointCloudFormat->height);
 
  320         targetPtr->points.resize(pointCloudFormat->size / 
getBytesPerPoint(pointCloudFormat->type));
 
  321         visionx::Point3D* pBuffer = 
reinterpret_cast<visionx::Point3D*
>(*source);
 
  323         for (
size_t i = 0; i < targetPtr->points.size(); i++)
 
  325             targetPtr->points[i].x = pBuffer[i].x;
 
  326             targetPtr->points[i].y = pBuffer[i].y;
 
  327             targetPtr->points[i].z = pBuffer[i].z;
 
  334         targetPtr->points.resize(targetPtr->size());
 
  336         for (
size_t i = 0; i < targetPtr->points.size(); i++)
 
  338             targetPtr->points[i].x = 
source.at(i).point.x;
 
  339             targetPtr->points[i].y = 
source.at(i).point.y;
 
  340             targetPtr->points[i].z = 
source.at(i).point.z;
 
  341             targetPtr->points[i].r = 
source.at(i).color.r;
 
  342             targetPtr->points[i].g = 
source.at(i).color.g;
 
  343             targetPtr->points[i].b = 
source.at(i).color.b;
 
  344             targetPtr->points[i].a = 
source.at(i).color.a;
 
  350                    ColoredPointCloud& 
target)
 
  352         target.resize(sourcePtr->size());
 
  354         for (
size_t i = 0; i < 
target.size(); i++)
 
  356             target.at(i).point.x = sourcePtr->points[i].x;
 
  357             target.at(i).point.y = sourcePtr->points[i].y;
 
  358             target.at(i).point.z = sourcePtr->points[i].z;
 
  359             target.at(i).color.r = sourcePtr->points[i].r;
 
  360             target.at(i).color.g = sourcePtr->points[i].g;
 
  361             target.at(i).color.b = sourcePtr->points[i].b;
 
  362             target.at(i).color.a = sourcePtr->points[i].a;
 
  369         const unsigned int Area = sourcePtr->width * sourcePtr->height;
 
  370         visionx::ColoredLabeledPoint3D* pBuffer = 
new visionx::ColoredLabeledPoint3D[
Area];
 
  372         for (
size_t i = 0; i < sourcePtr->points.size(); i++)
 
  374             pBuffer[i].point.x = sourcePtr->points[i].x;
 
  375             pBuffer[i].point.y = sourcePtr->points[i].y;
 
  376             pBuffer[i].point.z = sourcePtr->points[i].z;
 
  377             pBuffer[i].color.r = sourcePtr->points[i].r;
 
  378             pBuffer[i].color.g = sourcePtr->points[i].g;
 
  379             pBuffer[i].color.b = sourcePtr->points[i].b;
 
  380             pBuffer[i].color.a = sourcePtr->points[i].a;
 
  381             pBuffer[i].label = 
static_cast<int>(sourcePtr->points[i].label);
 
  384         memcpy(
target[0], pBuffer, 
Area * 
sizeof(visionx::ColoredLabeledPoint3D));
 
  390                    ColoredLabeledPointCloud& 
target)
 
  394         for (std::size_t i = 0; i < 
source.size(); ++i)
 
  396             const pcl::PointXYZRGBL& p = 
source.points[i];
 
  397             target[i].point = visionx::Point3D{p.x, p.y, p.z};
 
  398             target[i].color = visionx::RGBA{p.r, p.g, p.b, p.a};
 
  399             target[i].label = 
static_cast<int>(p.label);
 
  408         for (std::size_t i = 0; i < 
source.size(); ++i)
 
  410             const visionx::ColoredLabeledPoint3D& p = 
source[i];
 
  419             target[i].label = 
static_cast<uint32_t
>(p.label);
 
  425                  visionx::MetaPointCloudFormatPtr pointCloudFormat,
 
  426                  pcl::PointCloud<pcl::PointXYZRGBL>::Ptr targetPtr)
 
  429         if (pointCloudFormat->type == visionx::eColoredLabeledPoints)
 
  431             targetPtr->width = 
static_cast<uint32_t
>(pointCloudFormat->width);
 
  432             targetPtr->height = 
static_cast<uint32_t
>(pointCloudFormat->height);
 
  433             targetPtr->points.resize(pointCloudFormat->size /
 
  436             visionx::ColoredLabeledPoint3D* pBuffer =
 
  437                 reinterpret_cast<visionx::ColoredLabeledPoint3D*
>(*source);
 
  439             for (
size_t i = 0; i < targetPtr->points.size(); i++)
 
  441                 targetPtr->points[i].x = pBuffer[i].point.x;
 
  442                 targetPtr->points[i].y = pBuffer[i].point.y;
 
  443                 targetPtr->points[i].z = pBuffer[i].point.z;
 
  444                 targetPtr->points[i].r = pBuffer[i].color.r;
 
  445                 targetPtr->points[i].g = pBuffer[i].color.g;
 
  446                 targetPtr->points[i].b = pBuffer[i].color.b;
 
  447                 targetPtr->points[i].a = pBuffer[i].color.a;
 
  448                 targetPtr->points[i].label = 
static_cast<uint32_t
>(pBuffer[i].label);
 
  451         else if (pointCloudFormat->type == visionx::eColoredPoints)
 
  454             pcl::PointCloud<pcl::PointXYZRGBA>::Ptr temp(
new pcl::PointCloud<pcl::PointXYZRGBA>());
 
  456             pcl::copyPointCloud(*temp, *targetPtr);
 
  458         else if (pointCloudFormat->type == visionx::eLabeledPoints)
 
  461             pcl::PointCloud<pcl::PointXYZL>::Ptr temp(
new pcl::PointCloud<pcl::PointXYZL>());
 
  463             pcl::copyPointCloud(*temp, *targetPtr);
 
  470         const unsigned int area = sourcePtr->width * sourcePtr->height;
 
  471         std::vector<visionx::ColoredOrientedPoint3D> buffer(area);
 
  473         for (
size_t i = 0; i < sourcePtr->points.size(); i++)
 
  475             buffer[i].point.x = sourcePtr->points[i].x;
 
  476             buffer[i].point.y = sourcePtr->points[i].y;
 
  477             buffer[i].point.z = sourcePtr->points[i].z;
 
  478             buffer[i].color.r = sourcePtr->points[i].r;
 
  479             buffer[i].color.g = sourcePtr->points[i].g;
 
  480             buffer[i].color.b = sourcePtr->points[i].b;
 
  481             buffer[i].normal.nx = sourcePtr->points[i].normal_x;
 
  482             buffer[i].normal.ny = sourcePtr->points[i].normal_y;
 
  483             buffer[i].normal.nz = sourcePtr->points[i].normal_z;
 
  487             buffer.begin(), buffer.end(), 
static_cast<visionx::ColoredOrientedPoint3D*
>(
target[0]));
 
  492                  visionx::MetaPointCloudFormatPtr pointCloudFormat,
 
  493                  pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr targetPtr)
 
  495         targetPtr->width = 
static_cast<uint32_t
>(pointCloudFormat->width);
 
  496         targetPtr->height = 
static_cast<uint32_t
>(pointCloudFormat->height);
 
  497         targetPtr->points.resize(pointCloudFormat->size / 
getBytesPerPoint(pointCloudFormat->type));
 
  498         visionx::ColoredOrientedPoint3D* pBuffer =
 
  499             static_cast<visionx::ColoredOrientedPoint3D*
>(*source);
 
  501         for (
size_t i = 0; i < targetPtr->points.size(); i++)
 
  503             targetPtr->points[i].x = pBuffer[i].point.x;
 
  504             targetPtr->points[i].y = pBuffer[i].point.y;
 
  505             targetPtr->points[i].z = pBuffer[i].point.z;
 
  506             targetPtr->points[i].r = pBuffer[i].color.r;
 
  507             targetPtr->points[i].g = pBuffer[i].color.g;
 
  508             targetPtr->points[i].b = pBuffer[i].color.b;
 
  509             targetPtr->points[i].normal_x = pBuffer[i].normal.nx;
 
  510             targetPtr->points[i].normal_y = pBuffer[i].normal.ny;
 
  511             targetPtr->points[i].normal_z = pBuffer[i].normal.nz;
 
  520         visionx::ColoredPoint3D* pBuffer = 
reinterpret_cast<ColoredPoint3D*
>(
target);
 
  522         size_t size = sourcePtr->points.size();
 
  523         auto& points = sourcePtr->points;
 
  524         for (
size_t i = 0; i < size; i++)
 
  527             auto& pB = pBuffer[i];
 
  540                  visionx::MetaPointCloudFormatPtr pointCloudFormat,
 
  541                  pcl::PointCloud<pcl::PointXYZRGB>::Ptr targetPtr)
 
  543         if (pointCloudFormat->type == visionx::eColoredPoints)
 
  547             targetPtr->width = pointCloudFormat->width;
 
  548             targetPtr->height = pointCloudFormat->height;
 
  549             targetPtr->points.resize(pointCloudFormat->size /
 
  551             visionx::ColoredPoint3D* pBuffer = 
reinterpret_cast<visionx::ColoredPoint3D*
>(*source);
 
  552             size_t size = targetPtr->points.size();
 
  553             auto& points = targetPtr->points;
 
  554             for (
size_t i = 0; i < size; i++)
 
  557                 auto& pB = pBuffer[i];
 
  566         else if (pointCloudFormat->type == visionx::eColoredLabeledPoints)
 
  569             pcl::PointCloud<pcl::PointXYZRGBL>::Ptr temp(
new pcl::PointCloud<pcl::PointXYZRGBL>());
 
  571             pcl::copyPointCloud(*temp, *targetPtr);
 
  577                                 armarx::DebugDrawer24BitColoredPointCloud& 
target,
 
  581         target.pointSize = pointSize;
 
  583         std::size_t numPoints = sourcePtr->width * sourcePtr->height;
 
  584         target.points.reserve(numPoints);
 
  586         armarx::DebugDrawer24BitColoredPointCloudElement e;
 
  587         for (
const auto& p : sourcePtr->points)
 
  604                     float value = (
static_cast<int>(e.z) / 10) % 256;
 
  606                     e.color.r = 
static_cast<Ice::Byte
>((
value > 128) ? (
value - 128) * 2 : 0);
 
  607                     e.color.g = 
static_cast<Ice::Byte
>((
value < 128) ? 2 * 
value 
  608                                                                      : 255 - ((
value - 128) * 2));
 
  609                     e.color.b = 
static_cast<Ice::Byte
>((
value < 128) ? 255 - (2 * 
value) : 0);
 
  612                 target.points.push_back(e);
 
  619                                 armarx::DebugDrawer24BitColoredPointCloud& 
target,
 
  623         target.pointSize = pointSize;
 
  625         std::size_t numPoints = sourcePtr->width * sourcePtr->height;
 
  626         target.points.reserve(numPoints);
 
  627         std::map<uint32_t, pcl::RGB> colorMap;
 
  629         armarx::DebugDrawer24BitColoredPointCloudElement e;
 
  630         for (
const auto& p : sourcePtr->points)
 
  640                     if (!colorMap.count(p.label))
 
  642                         colorMap[p.label] = pcl::GlasbeyLUT::at(p.label % pcl::GlasbeyLUT::size());
 
  644                     const auto c = colorMap[p.label];
 
  653                     float value = (
static_cast<int>(e.z) / 10) % 256;
 
  655                     e.color.r = 
static_cast<Ice::Byte
>((
value > 128) ? (
value - 128) * 2 : 0);
 
  656                     e.color.g = 
static_cast<Ice::Byte
>((
value < 128) ? 2 * 
value 
  657                                                                      : 255 - ((
value - 128) * 2));
 
  658                     e.color.b = 
static_cast<Ice::Byte
>((
value < 128) ? 255 - (2 * 
value) : 0);
 
  661                 target.points.push_back(e);
 
  668                                 armarx::DebugDrawer24BitColoredPointCloud& 
target,
 
  674         target.pointSize = pointSize;
 
  676         std::size_t numPoints = sourcePtr->width * sourcePtr->height;
 
  677         target.points.reserve(numPoints);
 
  679         armarx::DebugDrawer24BitColoredPointCloudElement e;
 
  680         for (
const auto& p : sourcePtr->points)
 
  689                 float value = (
static_cast<int>(e.z) / 10) % 256;
 
  691                 e.color.r = 
static_cast<Ice::Byte
>((
value > 128) ? (
value - 128) * 2 : 0);
 
  693                     static_cast<Ice::Byte
>((
value < 128) ? 2 * 
value : 255 - ((
value - 128) * 2));
 
  694                 e.color.b = 
static_cast<Ice::Byte
>((
value < 128) ? 255 - (2 * 
value) : 0);
 
  696                 target.points.push_back(e);
 
  703                                 armarx::DebugDrawer24BitColoredPointCloud& 
target,
 
  707         target.pointSize = pointSize;
 
  709         std::size_t numPoints = sourcePtr->width * sourcePtr->height;
 
  710         target.points.reserve(numPoints);
 
  711         std::map<uint32_t, pcl::RGB> colorMap;
 
  713         armarx::DebugDrawer24BitColoredPointCloudElement e;
 
  714         for (
const auto& p : sourcePtr->points)
 
  730                     if (!colorMap.count(p.label))
 
  732                         colorMap[p.label] = pcl::GlasbeyLUT::at(p.label % pcl::GlasbeyLUT::size());
 
  734                     const auto c = colorMap[p.label];
 
  743                     float value = (
static_cast<int>(e.z) / 10) % 256;
 
  745                     e.color.r = 
static_cast<Ice::Byte
>((
value > 128) ? (
value - 128) * 2 : 0);
 
  746                     e.color.g = 
static_cast<Ice::Byte
>((
value < 128) ? 2 * 
value 
  747                                                                      : 255 - ((
value - 128) * 2));
 
  748                     e.color.b = 
static_cast<Ice::Byte
>((
value < 128) ? 255 - (2 * 
value) : 0);
 
  751                 target.points.push_back(e);
 
  824     static std::vector<std::string>
 
  825     makePointContentTypeNames()
 
  827         std::vector<std::string> 
names(7);
 
  828         names.at(ePoints) = 
"ePoints";
 
  829         names.at(eColoredPoints) = 
"eColoredPoints";
 
  830         names.at(eOrientedPoints) = 
"eOrientedPoints";
 
  831         names.at(eColoredOrientedPoints) = 
"eColoredOrientedPoints";
 
  832         names.at(eLabeledPoints) = 
"eLabeledPoints";
 
  833         names.at(eColoredLabeledPoints) = 
"eColoredLabeledPoints";
 
  834         names.at(eIntensity) = 
"eIntensity";
 
  841         static const std::vector<std::string> 
names = makePointContentTypeNames();
 
  842         return names.at(pointContent);