{"id":872,"date":"2019-04-23T22:45:28","date_gmt":"2019-04-24T03:45:28","guid":{"rendered":"http:\/\/sunapi386.ca\/wordpress\/?p=872"},"modified":"2019-04-26T19:59:56","modified_gmt":"2019-04-27T00:59:56","slug":"converting-point-cloud-to-3d-surface-map","status":"publish","type":"post","link":"https:\/\/sunapi386.ca\/wordpress\/converting-point-cloud-to-3d-surface-map\/","title":{"rendered":"Converting Point Cloud to 3D Surface Map"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Source Data<\/h2>\n\n\n\n<p>Looking at Red Rocks.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1409\" height=\"1092\" src=\"https:\/\/i0.wp.com\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-8.png?fit=625%2C485\" alt=\"\" class=\"wp-image-880\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-8.png 1409w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-8-300x233.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-8-768x595.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-8-1024x794.png 1024w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-8-624x484.png 624w\" sizes=\"auto, (max-width: 1409px) 100vw, 1409px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">PDAL pipeline<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># This is a hjson file, https:\/\/hjson.org\/\n# Linux bash\n#GET=https:\/\/github.com\/hjson\/hjson-go\/releases\/download\/v3.0.0\/linux_amd64.tar.gz\n# macOS bash\n#GET=https:\/\/github.com\/hjson\/hjson-go\/releases\/download\/v3.0.0\/darwin_amd64.tar.gz\n# Install\n#curl -sSL $GET | sudo tar -xz -C \/usr\/local\/bin\n# Translate to Json\n#hjson -j pipeline.hjson > pipeline.json\n#pdal pipeline pipeline.json --verbose 8\n\n{\n  pipeline:\n  [\n# Input\n    {\n      # read from our ept server\n      # up to 0.5m resolutions\n      # type: readers.ept\n      # bounds: ([802000, 802500], [2493000, 2493500])\n      # filename: http:\/\/localhost:8080\/ept.json\n      filename: red-rocks.laz\n      # filename: http:\/\/na.entwine.io\/red-rocks\/ept.json\n      # resolution: 0.5\n    }\n#     {\n#       # read from our las file\n#       type: readers.las\n#       filename: small500-no-outliers.laz\n#     }\n\n\n# Filters\n    {\n      # adds a classification value of 7 to the noise points\n      type: filters.outlier\n      # method: radius\n      # radius: 1.0\n      # min_k: 8 # min number of neighbors in radius\n\n      method: statistical\n      mean_k: 8\n      multiplier: 3\n\n    }\n\n    {\n      # voxel-based sampling filter\n      # reduce the size of the pc\n      # cell size of 0.2 meters in xyz\n      type: filters.voxelcenternearestneighbor\n      cell: 0.1\n    }\n\n    {\n      # Need to assign point cloud dimension NumberOfReturns 1\n      # Otherwise: \"No returns to process.\"\n        type:filters.assign\n        assignment : NumberOfReturns[0:0]=1\n    }\n\n    {\n      # Ground classification, ignore the noise points\n      type: filters.smrf\n      ignore:Classification[7:7]\n    }\n\n    {\n      # only allow ground classified points\n      type: filters.range\n      limits: Classification[2:2]\n    }\n\n    {\n      # OPTIONAL\n      # turn this into a DEM 3D model\n      # do not use multiple types\n      # type: filters.delaunay\n      type: filters.poisson\n    }\n\n\n# Output\n\n# # OPTIONAL PLY IF DEM\n    {\n      # write to ply\n      type:writers.ply\n      filename: red-rocks-smrf-only-poisson.ply\n      faces:true\n      storage_mode: default\n    }\n# Output\n    # {\n    #   # write to laz\n    #   type:writers.las\n    #   filename: red-rocks-ground.laz\n    # }\n  ]\n}<\/code><\/pre>\n\n\n\n<p><a href=\"https:\/\/gist.github.com\/sunapi386\/9a9ece302d646ee80a72fc494423a633\">https:\/\/gist.github.com\/sunapi386\/9a9ece302d646ee80a72fc494423a633<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mesh Results<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"595\" src=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-1.png\" alt=\"\" class=\"wp-image-873\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-1.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-1-300x232.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-1-624x483.png 624w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption>filters.delaunay<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"998\" height=\"761\" src=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-6.png\" alt=\"\" class=\"wp-image-878\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-6.png 998w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-6-300x229.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-6-768x586.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-6-624x476.png 624w\" sizes=\"auto, (max-width: 998px) 100vw, 998px\" \/><figcaption>The mesh doesn&#8217;t look right.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Greedy Projection<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"795\" height=\"686\" src=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-2.png\" alt=\"\" class=\"wp-image-874\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-2.png 795w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-2-300x259.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-2-768x663.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-2-624x538.png 624w\" sizes=\"auto, (max-width: 795px) 100vw, 795px\" \/><figcaption>filters.greedyprojection<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"880\" height=\"701\" src=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-5.png\" alt=\"\" class=\"wp-image-877\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-5.png 880w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-5-300x239.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-5-768x612.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-5-624x497.png 624w\" sizes=\"auto, (max-width: 880px) 100vw, 880px\" \/><figcaption>Issue seems to be the points are arranged in a sequential fashion<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"998\" height=\"761\" src=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-7.png\" alt=\"\" class=\"wp-image-879\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-7.png 998w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-7-300x229.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-7-768x586.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-7-624x476.png 624w\" sizes=\"auto, (max-width: 998px) 100vw, 998px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Poisson<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"796\" height=\"668\" src=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-3.png\" alt=\"\" class=\"wp-image-875\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-3.png 796w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-3-300x252.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-3-768x645.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-3-624x524.png 624w\" sizes=\"auto, (max-width: 796px) 100vw, 796px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"796\" height=\"668\" src=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-4.png\" alt=\"\" class=\"wp-image-876\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-4.png 796w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-4-300x252.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-4-768x645.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-4-624x524.png 624w\" sizes=\"auto, (max-width: 796px) 100vw, 796px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"862\" height=\"734\" src=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-11.png\" alt=\"\" class=\"wp-image-884\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-11.png 862w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-11-300x255.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-11-768x654.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-11-624x531.png 624w\" sizes=\"auto, (max-width: 862px) 100vw, 862px\" \/><figcaption>Looks nicer with depth: 10 (default 8). The ply file is 84M. <\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"862\" height=\"734\" src=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-12.png\" alt=\"\" class=\"wp-image-886\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-12.png 862w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-12-300x255.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-12-768x654.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-12-624x531.png 624w\" sizes=\"auto, (max-width: 862px) 100vw, 862px\" \/><\/figure>\n\n\n\n<p>To go a little more &#8220;detailed&#8221;, I put depth to 12. The file went from 84M to 789M. And it is definitely overkill for 3D printing. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1012\" height=\"759\" src=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-13.png\" alt=\"\" class=\"wp-image-887\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-13.png 1012w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-13-300x225.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-13-768x576.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-13-624x468.png 624w\" sizes=\"auto, (max-width: 1012px) 100vw, 1012px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"752\" height=\"638\" src=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-14.png\" alt=\"\" class=\"wp-image-888\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-14.png 752w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-14-300x255.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-14-624x529.png 624w\" sizes=\"auto, (max-width: 752px) 100vw, 752px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Grid Projection<\/h2>\n\n\n\n<p>Program failed to compute the grid projection. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> pdal pipeline dtm-gdal.json --verbose 8 \n(PDAL Debug) Debugging...\n(pdal pipeline Debug) Attempting to load plugin '\/usr\/local\/lib\/libpdal_plugin_filter_gridprojection.so'.\n(pdal pipeline Debug) Loaded plugin '\/usr\/local\/lib\/libpdal_plugin_filter_gridprojection.so'.\n(pdal pipeline Debug) Initialized plugin '\/usr\/local\/lib\/libpdal_plugin_filter_gridprojection.so'.\n(pdal pipeline readers.las Debug) GDAL debug: OGRSpatialReference::Validate: No root pointer.\n(pdal pipeline readers.las Debug) GDAL debug: OGRSpatialReference::Validate: No root pointer.\n(pdal pipeline readers.las Debug) GDAL debug: OGRSpatialReference::Validate: No root pointer.\n(pdal pipeline Debug) Executing pipeline in standard mode.\n(pdal pipeline filters.gridprojection Debug) \t\tProcess GridProjectionFilter...\n[pcl::GridProjection::getBoundingBox] Size of Bounding Box is [5.500000, 6.000000, 5.000000]\n[pcl::GridProjection::getBoundingBox] Lower left point is [-2.500000, -2.500000, -2.500000]\n[pcl::GridProjection::getBoundingBox] Upper left point is [3.000000, 3.500000, 2.500000]\n[pcl::GridProjection::getBoundingBox] Padding size: 3\n[pcl::GridProjection::getBoundingBox] Leaf size: 0.500000\n(pdal pipeline filters.gridprojection Debug) \t\t3141373 before, 180 after\n(pdal pipeline filters.gridprojection Debug) \t\t180\ndouble free or corruption (!prev)\nfish: \u201cpdal pipeline dtm-gdal.json --v\u2026\u201d terminated by signal SIGABRT (Abort)\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Cura 3D Print Slice<\/h2>\n\n\n\n<p>Cura can take STL inputs. Converting the PLY into STL is simple.<\/p>\n\n\n\n<p><code>sudo apt install openctm-tools<\/code><\/p>\n\n\n\n<p>Then <code>ctmconv red-rocks-smrf-only-delaunay.ply red-rocks-smrf-only-delaunay.stl<\/code>&nbsp;can convert ply to stl<\/p>\n\n\n\n<p><br><code>ctmviewer red-rocks-smrf-only-delaunay.ply<\/code> visualizes the ply. Which is what I used above.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1720\" height=\"1440\" src=\"https:\/\/i0.wp.com\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-10.png?fit=625%2C523\" alt=\"\" class=\"wp-image-882\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-10.png 1720w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-10-300x251.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-10-768x643.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-10-1024x857.png 1024w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/04\/image-10-624x522.png 624w\" sizes=\"auto, (max-width: 1720px) 100vw, 1720px\" \/><figcaption>Poisson and Delauny surface models, side-by-side.<br><br><\/figcaption><\/figure>\n\n\n\n<p>Looks like the Poisson is prettier. <\/p>\n\n\n\n<p>I&#8217;ll continue writing this latter, until I have something printed. \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Source Data Looking at Red Rocks. PDAL pipeline https:\/\/gist.github.com\/sunapi386\/9a9ece302d646ee80a72fc494423a633 Mesh Results Greedy Projection Poisson To go a little more &#8220;detailed&#8221;, I put depth to 12. The file went from 84M to 789M. And it is definitely overkill for 3D printing. Grid Projection Program failed to compute the grid projection. Cura 3D Print Slice Cura can &hellip; <a href=\"https:\/\/sunapi386.ca\/wordpress\/converting-point-cloud-to-3d-surface-map\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Converting Point Cloud to 3D Surface Map<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34],"tags":[],"class_list":["post-872","post","type-post","status-publish","format-standard","hentry","category-thoughts"],"_links":{"self":[{"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/posts\/872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/comments?post=872"}],"version-history":[{"count":2,"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/posts\/872\/revisions"}],"predecessor-version":[{"id":889,"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/posts\/872\/revisions\/889"}],"wp:attachment":[{"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/media?parent=872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/categories?post=872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/tags?post=872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}