Skip to content

Commit 9f1d233

Browse files
authored
Add test for filters.supervoxel (PDAL#4737)
* Add test for filters.supervoxel * Change type
1 parent 86f53a6 commit 9f1d233

File tree

2 files changed

+137
-0
lines changed

2 files changed

+137
-0
lines changed

test/unit/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ PDAL_ADD_TEST(pdal_filters_locate_test FILES filters/LocateFilterTest.cpp)
417417
PDAL_ADD_TEST(pdal_filters_merge_test FILES filters/MergeTest.cpp)
418418
PDAL_ADD_TEST(pdal_filters_miniball_test FILES filters/MiniballFilterTest.cpp)
419419
PDAL_ADD_TEST(pdal_morton_order_test FILES filters/MortonOrderTest.cpp)
420+
PDAL_ADD_TEST(pdal_filters_supervoxel_test FILES filters/SupervoxelFilterTest.cpp)
420421
PDAL_ADD_TEST(pdal_filters_additional_merge_test
421422
FILES
422423
filters/AdditionalMergeTest.cpp
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/******************************************************************************
2+
* Copyright (c) 2025, Bram Ton ([email protected])
3+
*
4+
* All rights reserved.
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following
8+
* conditions are met:
9+
*
10+
* * Redistributions of source code must retain the above copyright
11+
* notice, this list of conditions and the following disclaimer.
12+
* * Redistributions in binary form must reproduce the above copyright
13+
* notice, this list of conditions and the following disclaimer in
14+
* the documentation and/or other materials provided
15+
* with the distribution.
16+
* * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
17+
* names of its contributors may be used to endorse or promote
18+
* products derived from this software without specific prior
19+
* written permission.
20+
*
21+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24+
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25+
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26+
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27+
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
28+
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29+
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31+
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
32+
* OF SUCH DAMAGE.
33+
****************************************************************************/
34+
35+
#include <filters/SupervoxelFilter.hpp>
36+
#include <io/BufferReader.hpp>
37+
#include <pdal/Dimension.hpp>
38+
#include <pdal/PointTable.hpp>
39+
#include <pdal/PointView.hpp>
40+
#include <pdal/pdal_test_main.hpp>
41+
42+
using namespace pdal;
43+
44+
TEST(SuperVoxelFilterTest, BasicTest)
45+
{
46+
using namespace Dimension;
47+
48+
PointTable table;
49+
table.layout()->registerDims({Id::X, Id::Y, Id::Z, Id::NormalX, Id::NormalY, Id::NormalZ});
50+
51+
BufferReader br;
52+
SupervoxelFilter filt;
53+
Options opts;
54+
opts.add("knn", 3);
55+
opts.add("resolution", 3);
56+
filt.setInput(br);
57+
filt.setOptions(opts);
58+
filt.prepare(table);
59+
60+
PointViewPtr src(new PointView(table));
61+
src->setField(Id::X, 0, 1.0);
62+
src->setField(Id::Y, 0, 1.0);
63+
src->setField(Id::Z, 0, 0.0);
64+
src->setField(Id::NormalX, 0, 0.0);
65+
src->setField(Id::NormalY, 0, 1.0);
66+
src->setField(Id::NormalZ, 0, 0.0);
67+
68+
src->setField(Id::X, 1, 2.0);
69+
src->setField(Id::Y, 1, 2.0);
70+
src->setField(Id::Z, 1, 0.0);
71+
src->setField(Id::NormalX, 1, 0.0);
72+
src->setField(Id::NormalY, 1, 1.0);
73+
src->setField(Id::NormalZ, 1, 0.0);
74+
75+
src->setField(Id::X, 2, 4.0);
76+
src->setField(Id::Y, 2, 2.0);
77+
src->setField(Id::Z, 2, 0.0);
78+
src->setField(Id::NormalX, 2, 1.0);
79+
src->setField(Id::NormalY, 2, 1.0);
80+
src->setField(Id::NormalZ, 2, 0.0);
81+
82+
src->setField(Id::X, 3, 5.0);
83+
src->setField(Id::Y, 3, 1.0);
84+
src->setField(Id::Z, 3, 0.0);
85+
src->setField(Id::NormalX, 3, 1.0);
86+
src->setField(Id::NormalY, 3, 1.0);
87+
src->setField(Id::NormalZ, 3, 0.0);
88+
89+
src->setField(Id::X, 4, 1.0);
90+
src->setField(Id::Y, 4, 5.0);
91+
src->setField(Id::Z, 4, 0.0);
92+
src->setField(Id::NormalX, 4, 0.0);
93+
src->setField(Id::NormalY, 4, -1.0);
94+
src->setField(Id::NormalZ, 4, 0.0);
95+
96+
src->setField(Id::X, 5, 2.0);
97+
src->setField(Id::Y, 5, 4.0);
98+
src->setField(Id::Z, 5, 0.0);
99+
src->setField(Id::NormalX, 5, 0.0);
100+
src->setField(Id::NormalY, 5, -1.0);
101+
src->setField(Id::NormalZ, 5, 0.0);
102+
103+
src->setField(Id::X, 6, 4.0);
104+
src->setField(Id::Y, 6, 4.0);
105+
src->setField(Id::Z, 6, 0.0);
106+
src->setField(Id::NormalX, 6, 0.0);
107+
src->setField(Id::NormalY, 6, 1.0);
108+
src->setField(Id::NormalZ, 6, 0.0);
109+
110+
src->setField(Id::X, 7, 5.0);
111+
src->setField(Id::Y, 7, 4.0);
112+
src->setField(Id::Z, 7, 0.0);
113+
src->setField(Id::NormalX, 7, 0.0);
114+
src->setField(Id::NormalY, 7, 1.0);
115+
src->setField(Id::NormalZ, 7, 0.0);
116+
117+
br.addView(src);
118+
119+
PointViewSet viewSet = filt.execute(table);
120+
PointViewPtr outView = *viewSet.begin();
121+
122+
std::set<uint64_t> clusters;
123+
for (PointRef p: *outView)
124+
{
125+
double cid = p.getFieldAs<uint64_t>(Id::ClusterID);
126+
clusters.insert(cid);
127+
}
128+
EXPECT_EQ(clusters.size(), 4);
129+
130+
for (PointId idx = 0; idx < outView->size(); idx += 2)
131+
{
132+
uint64_t cid1 = outView->getFieldAs<uint64_t>(Id::ClusterID, idx);
133+
uint64_t cid2 = outView->getFieldAs<uint64_t>(Id::ClusterID, idx+1);
134+
EXPECT_EQ(cid1, cid2);
135+
}
136+
}

0 commit comments

Comments
 (0)