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);