00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef PCL_IMPL_POINT_TYPES_HPP_
00039 #define PCL_IMPL_POINT_TYPES_HPP_
00040
00041
00042 #define PCL_POINT_TYPES \
00043 (pcl::PointXYZ) \
00044 (pcl::PointXYZI) \
00045 (pcl::PointXYZL) \
00046 (pcl::Label) \
00047 (pcl::PointXYZRGBA) \
00048 (pcl::PointXYZRGB) \
00049 (pcl::PointXYZRGBL) \
00050 (pcl::PointXYZHSV) \
00051 (pcl::PointXY) \
00052 (pcl::InterestPoint) \
00053 (pcl::Axis) \
00054 (pcl::Normal) \
00055 (pcl::PointNormal) \
00056 (pcl::PointXYZRGBNormal) \
00057 (pcl::PointXYZINormal) \
00058 (pcl::PointWithRange) \
00059 (pcl::PointWithViewpoint) \
00060 (pcl::MomentInvariants) \
00061 (pcl::PrincipalRadiiRSD) \
00062 (pcl::Boundary) \
00063 (pcl::PrincipalCurvatures) \
00064 (pcl::PFHSignature125) \
00065 (pcl::PFHRGBSignature250) \
00066 (pcl::PPFSignature) \
00067 (pcl::PPFRGBSignature) \
00068 (pcl::NormalBasedSignature12) \
00069 (pcl::FPFHSignature33) \
00070 (pcl::VFHSignature308) \
00071 (pcl::ESFSignature640) \
00072 (pcl::Narf36) \
00073 (pcl::IntensityGradient) \
00074 (pcl::PointWithScale) \
00075 (pcl::ReferenceFrame)
00076
00077
00078 #define PCL_XYZ_POINT_TYPES \
00079 (pcl::PointXYZ) \
00080 (pcl::PointXYZI) \
00081 (pcl::PointXYZL) \
00082 (pcl::PointXYZRGBA) \
00083 (pcl::PointXYZRGB) \
00084 (pcl::PointXYZRGBL) \
00085 (pcl::PointXYZHSV) \
00086 (pcl::InterestPoint) \
00087 (pcl::PointNormal) \
00088 (pcl::PointXYZRGBNormal) \
00089 (pcl::PointXYZINormal) \
00090 (pcl::PointWithRange) \
00091 (pcl::PointWithViewpoint) \
00092 (pcl::PointWithScale)
00093
00094
00095 #define PCL_XYZL_POINT_TYPES \
00096 (pcl::PointXYZL) \
00097 (pcl::PointXYZRGBL)
00098
00099
00100
00101 #define PCL_NORMAL_POINT_TYPES \
00102 (pcl::Normal) \
00103 (pcl::PointNormal) \
00104 (pcl::PointXYZRGBNormal) \
00105 (pcl::PointXYZINormal)
00106
00107
00108 #define PCL_FEATURE_POINT_TYPES \
00109 (pcl::PFHSignature125) \
00110 (pcl::PFHRGBSignature250) \
00111 (pcl::PPFSignature) \
00112 (pcl::PPFRGBSignature) \
00113 (pcl::NormalBasedSignature12) \
00114 (pcl::FPFHSignature33) \
00115 (pcl::VFHSignature308) \
00116 (pcl::ESFSignature640) \
00117 (pcl::Narf36)
00118
00119 namespace pcl
00120 {
00121
00122 #define PCL_ADD_POINT4D \
00123 EIGEN_ALIGN16 \
00124 union { \
00125 float data[4]; \
00126 struct { \
00127 float x; \
00128 float y; \
00129 float z; \
00130 }; \
00131 }; \
00132 inline Eigen::Map<Eigen::Vector3f> getVector3fMap () { return (Eigen::Vector3f::Map (data)); } \
00133 inline const Eigen::Map<const Eigen::Vector3f> getVector3fMap () const { return (Eigen::Vector3f::Map (data)); } \
00134 inline Eigen::Map<Eigen::Vector4f, Eigen::Aligned> getVector4fMap () { return (Eigen::Vector4f::MapAligned (data)); } \
00135 inline const Eigen::Map<const Eigen::Vector4f, Eigen::Aligned> getVector4fMap () const { return (Eigen::Vector4f::MapAligned (data)); } \
00136 inline Eigen::Map<Eigen::Array3f> getArray3fMap () { return (Eigen::Array3f::Map (data)); } \
00137 inline const Eigen::Map<const Eigen::Array3f> getArray3fMap () const { return (Eigen::Array3f::Map (data)); } \
00138 inline Eigen::Map<Eigen::Array4f, Eigen::Aligned> getArray4fMap () { return (Eigen::Array4f::MapAligned (data)); } \
00139 inline const Eigen::Map<const Eigen::Array4f, Eigen::Aligned> getArray4fMap () const { return (Eigen::Array4f::MapAligned (data)); }
00140
00141 #define PCL_ADD_NORMAL4D \
00142 EIGEN_ALIGN16 \
00143 union { \
00144 float data_n[4]; \
00145 float normal[3]; \
00146 struct { \
00147 float normal_x; \
00148 float normal_y; \
00149 float normal_z; \
00150 }; \
00151 }; \
00152 inline Eigen::Map<Eigen::Vector3f> getNormalVector3fMap () { return (Eigen::Vector3f::Map (data_n)); } \
00153 inline const Eigen::Map<const Eigen::Vector3f> getNormalVector3fMap () const { return (Eigen::Vector3f::Map (data_n)); } \
00154 inline Eigen::Map<Eigen::Vector4f, Eigen::Aligned> getNormalVector4fMap () { return (Eigen::Vector4f::MapAligned (data_n)); } \
00155 inline const Eigen::Map<const Eigen::Vector4f, Eigen::Aligned> getNormalVector4fMap () const { return (Eigen::Vector4f::MapAligned (data_n)); }
00156
00157 #define PCL_ADD_RGB \
00158 union \
00159 { \
00160 union \
00161 { \
00162 struct \
00163 { \
00164 uint8_t b; \
00165 uint8_t g; \
00166 uint8_t r; \
00167 uint8_t a; \
00168 }; \
00169 float rgb; \
00170 }; \
00171 uint32_t rgba; \
00172 };
00173
00174 typedef Eigen::Map<Eigen::Array3f> Array3fMap;
00175 typedef const Eigen::Map<const Eigen::Array3f> Array3fMapConst;
00176 typedef Eigen::Map<Eigen::Array4f, Eigen::Aligned> Array4fMap;
00177 typedef const Eigen::Map<const Eigen::Array4f, Eigen::Aligned> Array4fMapConst;
00178 typedef Eigen::Map<Eigen::Vector3f> Vector3fMap;
00179 typedef const Eigen::Map<const Eigen::Vector3f> Vector3fMapConst;
00180 typedef Eigen::Map<Eigen::Vector4f, Eigen::Aligned> Vector4fMap;
00181 typedef const Eigen::Map<const Eigen::Vector4f, Eigen::Aligned> Vector4fMapConst;
00182
00183
00184
00185 struct _PointXYZ
00186 {
00187 PCL_ADD_POINT4D;
00188
00189 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00190 };
00191
00195 struct EIGEN_ALIGN16 PointXYZ : public _PointXYZ
00196 {
00197 inline PointXYZ ()
00198 {
00199 x = y = z = 0.0f;
00200 data[3] = 1.0f;
00201 }
00202
00203 inline PointXYZ (float _x, float _y, float _z)
00204 {
00205 x = _x; y = _y; z = _z;
00206 data[3] = 1.0f;
00207 }
00208
00209 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00210 };
00211
00212 inline std::ostream& operator << (std::ostream& os, const PointXYZ& p)
00213 {
00214 os << "(" << p.x << "," << p.y << "," << p.z << ")";
00215 return (os);
00216 }
00217
00218
00238 struct RGB
00239 {
00240 PCL_ADD_RGB;
00241 };
00242
00243
00247 struct EIGEN_ALIGN16 _PointXYZI
00248 {
00249 PCL_ADD_POINT4D;
00250 union
00251 {
00252 struct
00253 {
00254 float intensity;
00255 };
00256 float data_c[4];
00257 };
00258 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00259 };
00260
00261 struct PointXYZI : public _PointXYZI
00262 {
00263 inline PointXYZI ()
00264 {
00265 x = y = z = 0.0f;
00266 data[3] = 1.0f;
00267 intensity = 0.0f;
00268 }
00269 inline PointXYZI (float _intensity)
00270 {
00271 x = y = z = 0.0f;
00272 data[3] = 1.0f;
00273 intensity = _intensity;
00274 }
00275 };
00276
00277 inline std::ostream& operator << (std::ostream& os, const PointXYZI& p)
00278 {
00279 os << "(" << p.x << "," << p.y << "," << p.z << " - " << p.intensity << ")";
00280 return (os);
00281 }
00282
00283
00284 struct EIGEN_ALIGN16 _PointXYZL
00285 {
00286 PCL_ADD_POINT4D;
00287 uint32_t label;
00288 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00289 };
00290
00291 struct PointXYZL : public _PointXYZL
00292 {
00293 inline PointXYZL ()
00294 {
00295 x = y = z = 0.0f;
00296 data[3] = 1.0f;
00297 label = 0;
00298 }
00299 };
00300
00301 inline std::ostream& operator << (std::ostream& os, const PointXYZL& p)
00302 {
00303 os << "(" << p.x << "," << p.y << "," << p.z << " - " << p.label << ")";
00304 return (os);
00305 }
00306
00307 struct Label
00308 {
00309 uint32_t label;
00310 };
00311
00312 inline std::ostream& operator << (std::ostream& os, const Label& p)
00313 {
00314 os << "(" << p.label << ")";
00315 return (os);
00316 }
00317
00318
00339 struct EIGEN_ALIGN16 _PointXYZRGBA
00340 {
00341 PCL_ADD_POINT4D;
00342 PCL_ADD_RGB;
00343 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00344 };
00345
00346 struct EIGEN_ALIGN16 PointXYZRGBA : public _PointXYZRGBA
00347 {
00348 inline PointXYZRGBA ()
00349 {
00350 x = y = z = 0.0f;
00351 data[3] = 1.0f;
00352 r = g = b = a = 0;
00353 }
00354 inline Eigen::Vector3i getRGBVector3i () { return (Eigen::Vector3i (r, g, b)); }
00355 inline const Eigen::Vector3i getRGBVector3i () const { return (Eigen::Vector3i (r, g, b)); }
00356 inline Eigen::Vector4i getRGBVector4i () { return (Eigen::Vector4i (r, g, b, 0)); }
00357 inline const Eigen::Vector4i getRGBVector4i () const { return (Eigen::Vector4i (r, g, b, 0)); }
00358 };
00359
00360 inline std::ostream&
00361 operator << (std::ostream& os, const PointXYZRGBA& p)
00362 {
00363 const unsigned char* rgba_ptr = reinterpret_cast<const unsigned char*>(&p.rgba);
00364 os << "(" << p.x << "," << p.y << "," << p.z << " - "
00365 << static_cast<int>(*rgba_ptr) << ","
00366 << static_cast<int>(*(rgba_ptr+1)) << ","
00367 << static_cast<int>(*(rgba_ptr+2)) << ","
00368 << static_cast<int>(*(rgba_ptr+3)) << ")";
00369 return (os);
00370 }
00371
00372
00373 struct EIGEN_ALIGN16 _PointXYZRGB
00374 {
00375 PCL_ADD_POINT4D;
00376 PCL_ADD_RGB;
00377 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00378 };
00379
00380 struct EIGEN_ALIGN16 _PointXYZRGBL
00381 {
00382 PCL_ADD_POINT4D;
00383 PCL_ADD_RGB;
00384 uint32_t label;
00385 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00386 };
00387
00419 struct EIGEN_ALIGN16 PointXYZRGB : public _PointXYZRGB
00420 {
00421 inline PointXYZRGB ()
00422 {
00423 x = y = z = 0.0f;
00424 data[3] = 1.0f;
00425 r = g = b = a = 0;
00426 }
00427 inline PointXYZRGB (uint8_t _r, uint8_t _g, uint8_t _b)
00428 {
00429 x = y = z = 0.0f;
00430 data[3] = 1.0f;
00431 r = _r;
00432 g = _g;
00433 b = _b;
00434 a = 0;
00435 }
00436
00437 inline Eigen::Vector3i getRGBVector3i () { return (Eigen::Vector3i (r, g, b)); }
00438 inline const Eigen::Vector3i getRGBVector3i () const { return (Eigen::Vector3i (r, g, b)); }
00439 inline Eigen::Vector4i getRGBVector4i () { return (Eigen::Vector4i (r, g, b, 0)); }
00440 inline const Eigen::Vector4i getRGBVector4i () const { return (Eigen::Vector4i (r, g, b, 0)); }
00441
00442 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00443 };
00444 inline std::ostream& operator << (std::ostream& os, const PointXYZRGB& p)
00445 {
00446 os << "(" << p.x << "," << p.y << "," << p.z << " - "
00447 << static_cast<int>(p.r) << ","
00448 << static_cast<int>(p.g) << ","
00449 << static_cast<int>(p.b) << ")";
00450 return (os);
00451 }
00452
00453 struct EIGEN_ALIGN16 PointXYZRGBL : public _PointXYZRGBL
00454 {
00455 inline PointXYZRGBL ()
00456 {
00457 x = y = z = 0.0f;
00458 data[3] = 1.0f;
00459 r = g = b = 0;
00460 label = 255;
00461 }
00462 inline PointXYZRGBL (uint8_t _r, uint8_t _g, uint8_t _b, uint32_t _label)
00463 {
00464 x = y = z = 0.0f;
00465 data[3] = 1.0f;
00466 r = _r;
00467 g = _g;
00468 b = _b;
00469 label = _label;
00470 }
00471 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00472 };
00473 inline std::ostream& operator << (std::ostream& os, const PointXYZRGBL& p)
00474 {
00475 os << "(" << p.x << "," << p.y << "," << p.z << " - " << p.r << "," << p.g << "," << p.b << " - " << p.label << ")";
00476 return (os);
00477 }
00478
00479 struct _PointXYZHSV
00480 {
00481 PCL_ADD_POINT4D;
00482 union
00483 {
00484 struct
00485 {
00486 float h;
00487 float s;
00488 float v;
00489 };
00490 float data_c[4];
00491 };
00492 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00493 } EIGEN_ALIGN16;
00494
00495 struct EIGEN_ALIGN16 PointXYZHSV : public _PointXYZHSV
00496 {
00497 inline PointXYZHSV ()
00498 {
00499 x = y = z = 0.0f;
00500 data[3] = 1.0f;
00501 h = s = v = data_c[3] = 0;
00502 }
00503 inline PointXYZHSV (float _h, float _v, float _s)
00504 {
00505 x = y = z = 0.0f;
00506 data[3] = 1.0f;
00507 h = _h; v = _v; s = _s;
00508 data_c[3] = 0;
00509 }
00510 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00511 };
00512 inline std::ostream& operator << (std::ostream& os, const PointXYZHSV& p)
00513 {
00514 os << "(" << p.x << "," << p.y << "," << p.z << " - " << p.h << " , " << p.s << " , " << p.v << ")";
00515 return (os);
00516 }
00517
00518
00522 struct PointXY
00523 {
00524 float x;
00525 float y;
00526 };
00527 inline std::ostream& operator << (std::ostream& os, const PointXY& p)
00528 {
00529 os << "(" << p.x << "," << p.y << ")";
00530 return (os);
00531 }
00532
00536 struct EIGEN_ALIGN16 InterestPoint
00537 {
00538 PCL_ADD_POINT4D;
00539 union
00540 {
00541 struct
00542 {
00543 float strength;
00544 };
00545 float data_c[4];
00546 };
00547 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00548 };
00549 inline std::ostream& operator << (std::ostream& os, const InterestPoint& p)
00550 {
00551 os << "(" << p.x << "," << p.y << "," << p.z << " - " << p.strength << ")";
00552 return (os);
00553 }
00554
00558 struct EIGEN_ALIGN16 _Normal
00559 {
00560 PCL_ADD_NORMAL4D;
00561 union
00562 {
00563 struct
00564 {
00565 float curvature;
00566 };
00567 float data_c[4];
00568 };
00569 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00570 };
00571
00572 struct Normal : public _Normal
00573 {
00574 inline Normal ()
00575 {
00576 normal_x = normal_y = normal_z = data_n[3] = 0.0f;
00577 }
00578
00579 inline Normal (float n_x, float n_y, float n_z)
00580 {
00581 normal_x = n_x; normal_y = n_y; normal_z = n_z;
00582 data_n[3] = 0.0f;
00583 }
00584
00585 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00586 };
00587
00588 inline std::ostream& operator << (std::ostream& os, const Normal& p)
00589 {
00590 os << "(" << p.normal[0] << "," << p.normal[1] << "," << p.normal[2] << " - " << p.curvature << ")";
00591 return (os);
00592 }
00593
00597 struct EIGEN_ALIGN16 _Axis
00598 {
00599 PCL_ADD_NORMAL4D;
00600 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00601 };
00602
00603 struct EIGEN_ALIGN16 Axis : public _Axis
00604 {
00605 inline Axis ()
00606 {
00607 normal_x = normal_y = normal_z = data_n[3] = 0.0f;
00608 }
00609
00610 inline Axis (float n_x, float n_y, float n_z)
00611 {
00612 normal_x = n_x; normal_y = n_y; normal_z = n_z;
00613 data_n[3] = 0.0f;
00614 }
00615
00616 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00617 };
00618
00619 inline std::ostream& operator << (std::ostream& os, const Axis& p)
00620 {
00621 os << "(" << p.normal[0] << "," << p.normal[1] << "," << p.normal[2] << ")";
00622 return os;
00623 }
00624
00625 inline std::ostream& operator << (std::ostream& os, const _Axis& p)
00626 {
00627 os << "(" << p.normal[0] << "," << p.normal[1] << "," << p.normal[2] << ")";
00628 return os;
00629 }
00630
00634 struct EIGEN_ALIGN16 _PointNormal
00635 {
00636 PCL_ADD_POINT4D;
00637 PCL_ADD_NORMAL4D;
00638 union
00639 {
00640 struct
00641 {
00642 float curvature;
00643 };
00644 float data_c[4];
00645 };
00646 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00647 };
00648
00649 struct PointNormal : public _PointNormal
00650 {
00651 inline PointNormal ()
00652 {
00653 x = y = z = 0.0f;
00654 data[3] = 1.0f;
00655 normal_x = normal_y = normal_z = data_n[3] = 0.0f;
00656 }
00657 };
00658
00659 inline std::ostream& operator << (std::ostream& os, const PointNormal& p)
00660 {
00661 os << "(" << p.x << "," << p.y << "," << p.z << " - " << p.normal[0] << "," << p.normal[1] << "," << p.normal[2] << " - " << p.curvature << ")";
00662 return (os);
00663 }
00664
00694 struct EIGEN_ALIGN16 _PointXYZRGBNormal
00695 {
00696 PCL_ADD_POINT4D;
00697 PCL_ADD_NORMAL4D;
00698 union
00699 {
00700 struct
00701 {
00702
00703 union
00704 {
00705 struct
00706 {
00707 uint8_t b;
00708 uint8_t g;
00709 uint8_t r;
00710 uint8_t a;
00711 };
00712 float rgb;
00713 uint32_t rgba;
00714 };
00715 float curvature;
00716 };
00717 float data_c[4];
00718 };
00719 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00720 };
00721 struct PointXYZRGBNormal : public _PointXYZRGBNormal
00722 {
00723 inline PointXYZRGBNormal ()
00724 {
00725 x = y = z = 0.0f;
00726 data[3] = 1.0f;
00727 r = g = b = a = 0;
00728 normal_x = normal_y = normal_z = data_n[3] = 0.0f;
00729 }
00730
00731 inline Eigen::Vector3i getRGBVector3i () { return (Eigen::Vector3i (r, g, b)); }
00732 inline const Eigen::Vector3i getRGBVector3i () const { return (Eigen::Vector3i (r, g, b)); }
00733 inline Eigen::Vector4i getRGBVector4i () { return (Eigen::Vector4i (r, g, b, 0)); }
00734 inline const Eigen::Vector4i getRGBVector4i () const { return (Eigen::Vector4i (r, g, b, 0)); }
00735 };
00736 inline std::ostream& operator << (std::ostream& os, const PointXYZRGBNormal& p)
00737 {
00738 os << "(" << p.x << "," << p.y << "," << p.z << " - " << p.rgb << " - " << p.normal[0] << "," << p.normal[1] << "," << p.normal[2] << " - " << p.r << ", " << p.g << ", " << p.b << " - " << p.curvature << ")";
00739 return (os);
00740 }
00741
00745 struct EIGEN_ALIGN16 _PointXYZINormal
00746 {
00747 PCL_ADD_POINT4D;
00748 PCL_ADD_NORMAL4D;
00749 union
00750 {
00751 struct
00752 {
00753 float intensity;
00754 float curvature;
00755 };
00756 float data_c[4];
00757 };
00758 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00759 };
00760
00761 struct PointXYZINormal : public _PointXYZINormal
00762 {
00763 inline PointXYZINormal ()
00764 {
00765 x = y = z = 0.0f;
00766 data[3] = 1.0f;
00767 normal_x = normal_y = normal_z = data_n[3] = 0.0f;
00768 intensity = 0.0f;
00769 }
00770 };
00771
00772 inline std::ostream& operator << (std::ostream& os, const PointXYZINormal& p)
00773 {
00774 os << "(" << p.x << "," << p.y << "," << p.z << " - " << p.intensity << " - " << p.normal[0] << "," << p.normal[1] << "," << p.normal[2] << " - " << p.curvature << ")";
00775 return (os);
00776 }
00777
00781 struct EIGEN_ALIGN16 _PointWithRange
00782 {
00783 PCL_ADD_POINT4D;
00784 union
00785 {
00786 struct
00787 {
00788 float range;
00789 };
00790 float data_c[4];
00791 };
00792 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00793 };
00794
00795 struct PointWithRange : public _PointWithRange
00796 {
00797 inline PointWithRange ()
00798 {
00799 x = y = z = 0.0f;
00800 data[3] = 1.0f;
00801 range = 0.0f;
00802 }
00803 };
00804
00805 inline std::ostream& operator << (std::ostream& os, const PointWithRange& p)
00806 {
00807 os << "(" << p.x << "," << p.y << "," << p.z << " - " << p.range << ")";
00808 return (os);
00809 }
00810
00811 struct EIGEN_ALIGN16 _PointWithViewpoint
00812 {
00813 PCL_ADD_POINT4D;
00814 union
00815 {
00816 struct
00817 {
00818 float vp_x;
00819 float vp_y;
00820 float vp_z;
00821 };
00822 float data_c[4];
00823 };
00824 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00825 };
00826
00830 struct EIGEN_ALIGN16 PointWithViewpoint : public _PointWithViewpoint
00831 {
00832 PointWithViewpoint(float _x=0.0f, float _y=0.0f, float _z=0.0f, float _vp_x=0.0f, float _vp_y=0.0f, float _vp_z=0.0f)
00833 {
00834 x=_x; y=_y; z=_z;
00835 data[3] = 1.0f;
00836 vp_x=_vp_x; vp_y=_vp_y; vp_z=_vp_z;
00837 }
00838 };
00839 inline std::ostream& operator << (std::ostream& os, const PointWithViewpoint& p)
00840 {
00841 os << "(" << p.x << "," << p.y << "," << p.z << " - " << p.vp_x << "," << p.vp_y << "," << p.vp_z << ")";
00842 return (os);
00843 }
00844
00848 struct MomentInvariants
00849 {
00850 float j1, j2, j3;
00851 };
00852 inline std::ostream& operator << (std::ostream& os, const MomentInvariants& p)
00853 {
00854 os << "(" << p.j1 << "," << p.j2 << "," << p.j3 << ")";
00855 return (os);
00856 }
00857
00861 struct PrincipalRadiiRSD
00862 {
00863 float r_min, r_max;
00864 };
00865 inline std::ostream& operator << (std::ostream& os, const PrincipalRadiiRSD& p)
00866 {
00867 os << "(" << p.r_min << "," << p.r_max << ")";
00868 return (os);
00869 }
00870
00874 struct Boundary
00875 {
00876 uint8_t boundary_point;
00877 };
00878 inline std::ostream& operator << (std::ostream& os, const Boundary& p)
00879 {
00880 os << p.boundary_point;
00881 return (os);
00882 }
00883
00887 struct PrincipalCurvatures
00888 {
00889 union
00890 {
00891 float principal_curvature[3];
00892 struct
00893 {
00894 float principal_curvature_x;
00895 float principal_curvature_y;
00896 float principal_curvature_z;
00897 };
00898 };
00899 float pc1;
00900 float pc2;
00901 };
00902 inline std::ostream& operator << (std::ostream& os, const PrincipalCurvatures& p)
00903 {
00904 os << "(" << p.principal_curvature[0] << "," << p.principal_curvature[1] << "," << p.principal_curvature[2] << " - " << p.pc1 << "," << p.pc2 << ")";
00905 return (os);
00906 }
00907
00911 struct PFHSignature125
00912 {
00913 float histogram[125];
00914 };
00915 inline std::ostream& operator << (std::ostream& os, const PFHSignature125& p)
00916 {
00917 for (int i = 0; i < 125; ++i)
00918 os << (i == 0 ? "(" : "") << p.histogram[i] << (i < 124 ? ", " : ")");
00919 return (os);
00920 }
00921
00925 struct PFHRGBSignature250
00926 {
00927 float histogram[250];
00928 };
00929 inline std::ostream& operator << (std::ostream& os, const PFHRGBSignature250& p)
00930 {
00931 for (int i = 0; i < 250; ++i)
00932 os << (i == 0 ? "(" : "") << p.histogram[i] << (i < 249 ? ", " : ")");
00933 return (os);
00934 }
00935
00939 struct PPFSignature
00940 {
00941 float f1, f2, f3, f4;
00942 float alpha_m;
00943 };
00944 inline std::ostream& operator << (std::ostream& os, const PPFSignature& p)
00945 {
00946 os << "(" << p.f1 << ", " << p.f2 << ", " << p.f3 << ", " << p.f4 << ", " << p.alpha_m << ")";
00947 return (os);
00948 }
00949
00953 struct PPFRGBSignature
00954 {
00955 float f1, f2, f3, f4;
00956 float r_ratio, g_ratio, b_ratio;
00957 float alpha_m;
00958 };
00959 inline std::ostream& operator << (std::ostream& os, const PPFRGBSignature& p)
00960 {
00961 os << "(" << p.f1 << ", " << p.f2 << ", " << p.f3 << ", " << p.f4 << ", " <<
00962 p.r_ratio << ", " << p.g_ratio << ", " << p.b_ratio << ", " << p.alpha_m << ")";
00963 return (os);
00964 }
00965
00970 struct NormalBasedSignature12
00971 {
00972 float values[12];
00973 };
00974 inline std::ostream& operator << (std::ostream& os, const NormalBasedSignature12& p)
00975 {
00976 for (int i = 0; i < 12; ++i)
00977 os << (i == 0 ? "(" : "") << p.values[i] << (i < 11 ? ", " : ")");
00978 return (os);
00979 }
00980
00984 struct ShapeContext
00985 {
00986 std::vector<float> descriptor;
00987 float rf[9];
00988 };
00989
00990 inline std::ostream& operator << (std::ostream& os, const ShapeContext& p)
00991 {
00992 for (int i = 0; i < 9; ++i)
00993 os << (i == 0 ? "(" : "") << p.rf[i] << (i < 8 ? ", " : ")");
00994 for (size_t i = 0; i < p.descriptor.size (); ++i)
00995 os << (i == 0 ? "(" : "") << p.descriptor[i] << (i < p.descriptor.size()-1 ? ", " : ")");
00996 return (os);
00997 }
00998
01002 struct SHOT
01003 {
01004 std::vector<float> descriptor;
01005 float rf[9];
01006 };
01007
01008 PCL_DEPRECATED (inline std::ostream& operator << (std::ostream& os, const SHOT& p), "SHOT POINT IS DEPRECATED, USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD");
01009 inline std::ostream& operator << (std::ostream& os, const SHOT& p)
01010 {
01011 for (int i = 0; i < 9; ++i)
01012 os << (i == 0 ? "(" : "") << p.rf[i] << (i < 8 ? ", " : ")");
01013 for (size_t i = 0; i < p.descriptor.size (); ++i)
01014 os << (i == 0 ? "(" : "") << p.descriptor[i] << (i < p.descriptor.size()-1 ? ", " : ")");
01015 return (os);
01016 }
01017
01021 struct SHOT352
01022 {
01023 float descriptor[352];
01024 float rf[9];
01025 };
01026
01027 inline std::ostream& operator << (std::ostream& os, const SHOT352& p)
01028 {
01029 for (int i = 0; i < 9; ++i)
01030 os << (i == 0 ? "(" : "") << p.rf[i] << (i < 8 ? ", " : ")");
01031 for (size_t i = 0; i < 352; ++i)
01032 os << (i == 0 ? "(" : "") << p.descriptor[i] << (i < 351 ? ", " : ")");
01033 return (os);
01034 }
01035
01039 struct SHOT1344
01040 {
01041 float descriptor[1344];
01042 float rf[9];
01043 };
01044
01045 inline std::ostream& operator << (std::ostream& os, const SHOT1344& p)
01046 {
01047 for (int i = 0; i < 9; ++i)
01048 os << (i == 0 ? "(" : "") << p.rf[i] << (i < 8 ? ", " : ")");
01049 for (size_t i = 0; i < 1344; ++i)
01050 os << (i == 0 ? "(" : "") << p.descriptor[i] << (i < 1343 ? ", " : ")");
01051 return (os);
01052 }
01053
01057 struct EIGEN_ALIGN16 _ReferenceFrame
01058 {
01059 union
01060 {
01061 struct
01062 {
01063 _Axis x_axis;
01064 _Axis y_axis;
01065 _Axis z_axis;
01066 };
01067 float rf[12];
01068 };
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
01079 };
01080
01081 struct EIGEN_ALIGN16 ReferenceFrame : public _ReferenceFrame
01082 {
01083 ReferenceFrame ()
01084 {
01085 x_axis = y_axis = z_axis = Axis();
01086
01087 }
01088
01089 ReferenceFrame (Axis const &x, Axis const &y, Axis const &z)
01090 {
01091 x_axis = x;
01092 y_axis = y;
01093 z_axis = z;
01094
01095 }
01096
01097 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
01098 };
01099
01100 inline std::ostream& operator << (std::ostream& os, const ReferenceFrame& p)
01101 {
01102 os << "(" << p.x_axis << "," << p.y_axis << "," << p.z_axis << ")";
01103 return (os);
01104 }
01105
01109 struct FPFHSignature33
01110 {
01111 float histogram[33];
01112 };
01113 inline std::ostream& operator << (std::ostream& os, const FPFHSignature33& p)
01114 {
01115 for (int i = 0; i < 33; ++i)
01116 os << (i == 0 ? "(" : "") << p.histogram[i] << (i < 32 ? ", " : ")");
01117 return (os);
01118 }
01119
01123 struct VFHSignature308
01124 {
01125 float histogram[308];
01126 };
01127 inline std::ostream& operator << (std::ostream& os, const VFHSignature308& p)
01128 {
01129 for (int i = 0; i < 308; ++i)
01130 os << (i == 0 ? "(" : "") << p.histogram[i] << (i < 307 ? ", " : ")");
01131 return (os);
01132 }
01133
01137 struct ESFSignature640
01138 {
01139 float histogram[640];
01140 };
01141 inline std::ostream& operator << (std::ostream& os, const ESFSignature640& p)
01142 {
01143 for (int i = 0; i < 640; ++i)
01144 os << (i == 0 ? "(" : "") << p.histogram[i] << (i < 639 ? ", " : ")");
01145 return (os);
01146 }
01147
01151 struct GFPFHSignature16
01152 {
01153 float histogram[16];
01154 static int descriptorSize() { return 16; }
01155 };
01156 inline std::ostream& operator << (std::ostream& os, const GFPFHSignature16& p)
01157 {
01158 for (int i = 0; i < p.descriptorSize (); ++i)
01159 os << (i == 0 ? "(" : "") << p.histogram[i] << (i < (p.descriptorSize () - 1) ? ", " : ")");
01160 return (os);
01161 }
01162
01166 struct Narf36
01167 {
01168 float x, y, z, roll, pitch, yaw;
01169 float descriptor[36];
01170 };
01171 inline std::ostream& operator << (std::ostream& os, const Narf36& p)
01172 {
01173 os << p.x<<","<<p.y<<","<<p.z<<" - "<<p.roll*360.0/M_PI<<"deg,"<<p.pitch*360.0/M_PI<<"deg,"<<p.yaw*360.0/M_PI<<"deg - ";
01174 for (int i = 0; i < 36; ++i)
01175 os << (i == 0 ? "(" : "") << p.descriptor[i] << (i < 35 ? ", " : ")");
01176 return (os);
01177 }
01178
01182 struct BorderDescription
01183 {
01184 int x, y;
01185 BorderTraits traits;
01186
01187 };
01188
01189 inline std::ostream& operator << (std::ostream& os, const BorderDescription& p)
01190 {
01191 os << "(" << p.x << "," << p.y << ")";
01192 return (os);
01193 }
01194
01198 struct IntensityGradient
01199 {
01200 union
01201 {
01202 float gradient[3];
01203 struct
01204 {
01205 float gradient_x;
01206 float gradient_y;
01207 float gradient_z;
01208 };
01209 };
01210 };
01211 inline std::ostream& operator << (std::ostream& os, const IntensityGradient& p)
01212 {
01213 os << "(" << p.gradient[0] << "," << p.gradient[1] << "," << p.gradient[2] << ")";
01214 return (os);
01215 }
01216
01220 template <int N>
01221 struct Histogram
01222 {
01223 float histogram[N];
01224 };
01225 template <int N>
01226 inline std::ostream& operator << (std::ostream& os, const Histogram<N>& p)
01227 {
01228 for (int i = 0; i < N; ++i)
01229 os << (i == 0 ? "(" : "") << p.histogram[i] << (i < N-1 ? ", " : ")");
01230 return (os);
01231 }
01232
01236 struct EIGEN_ALIGN16 _PointWithScale
01237 {
01238 PCL_ADD_POINT4D;
01239 float scale;
01240 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
01241 };
01242
01243 struct PointWithScale : public _PointWithScale
01244 {
01245 inline PointWithScale ()
01246 {
01247 x = y = z = 0.0f;
01248 data[3] = 1.0f;
01249 scale = 1.0f;
01250 }
01251 };
01252 inline std::ostream& operator << (std::ostream& os, const PointWithScale& p)
01253 {
01254 os << "(" << p.x << "," << p.y << "," << p.z << " - " << p.scale << ")";
01255 return (os);
01256 }
01257
01261 struct EIGEN_ALIGN16 _PointSurfel
01262 {
01263 PCL_ADD_POINT4D;
01264 PCL_ADD_NORMAL4D;
01265 union
01266 {
01267 struct
01268 {
01269 uint32_t rgba;
01270 float radius;
01271 float confidence;
01272 float curvature;
01273 };
01274 float data_c[4];
01275 };
01276 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
01277 };
01278
01279 struct PointSurfel : public _PointSurfel
01280 {
01281 inline PointSurfel ()
01282 {
01283 x = y = z = 0.0f;
01284 data[3] = 1.0f;
01285 normal_x = normal_y = normal_z = data_n[3] = 0.0f;
01286 rgba = 0;
01287 radius = confidence = curvature = 0.0f;
01288 }
01289 };
01290
01291 inline std::ostream& operator << (std::ostream& os, const PointSurfel& p)
01292 {
01293 const unsigned char* rgba_ptr = reinterpret_cast<const unsigned char*>(&p.rgba);
01294 os <<
01295 "(" << p.x << "," << p.y << "," << p.z << " - " <<
01296 p.normal_x << "," << p.normal_y << "," << p.normal_z << " - "
01297 << static_cast<int>(*rgba_ptr) << ","
01298 << static_cast<int>(*(rgba_ptr+1)) << ","
01299 << static_cast<int>(*(rgba_ptr+2)) << ","
01300 << static_cast<int>(*(rgba_ptr+3)) << " - " <<
01301 p.radius << " - " << p.confidence << " - " << p.curvature << ")";
01302 return (os);
01303 }
01304
01308 template <typename PointT> inline bool
01309 isFinite (const PointT &pt)
01310 {
01311 return (pcl_isfinite (pt.x) && pcl_isfinite (pt.y) && pcl_isfinite (pt.z));
01312 }
01313
01314
01315 template <> inline bool
01316 isFinite<pcl::Normal> (const pcl::Normal &n)
01317 {
01318 return (pcl_isfinite (n.normal_x) && pcl_isfinite (n.normal_y) && pcl_isfinite (n.normal_z));
01319 }
01320 }
01321
01322
01323 #include <pcl/common/distances.h>
01324
01325 #endif