2017-04-03 3 views
0

Ich möchte einen einzigen RGB-Wert auf alle Punkte in einer Punktwolke-Datensatz vom Typ zuzuordnen:Point Cloud-Bibliothek - Wie wird einer ganzen Punktewolke ein einzelner RGB-Wert zugewiesen?

pcl::PointCloud<pcl::PointXYZRGB> 

Ich vermute, Sie durch die Punkte wiederholen könnte und jeden Wert ändern? Mit so etwas wie folgt aus:

uint32_t rgb = (static_cast<uint32_t>(r) << 16 | 
    static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b)); 
point.rgb = *reinterpret_cast<float*>(&rgb); 

Allerdings würde man bedenkt Ich mag alle Punkte den gleichen Wert geben, gibt es einen besseren Ansatz?

Der RGB-Wert muss jedem Punkt oder mindestens der Punktsammlung zugeordnet werden, damit mehr als eine Punktwolke in einem Ausgang kombiniert werden kann; jedes mit ihrer eigenen eindeutigen Farbe.

Da es mehrere Punktwolken Ich bin nicht in der Lage, die Farbe durch PCLVisualizer setzen mit:

pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> 

Eine Idee, die ich hatte, war nur eine hohe Assoziation mit der Punktwolke zu machen:

std::tie(rgb, pointcloud) = std::make_tuple(
           uint32_t, pcl::PointCloud<pcl::PointXYZ>); 

Dann könnte ich vielleicht PointCloudColorHandlerCustom mehrmals verwenden, um die verschiedenen farbigen Punktwolken auf der gleichen PCLVisualizer-Instanz anzuzeigen? Ich bin mir nicht sicher, ob das möglich ist.

Jede Hilfe wird sehr geschätzt!

Antwort

1

Es scheint, dass PCL selbst eine for-Schleife macht. Schauen Sie hier: https://github.com/PointCloudLibrary/pcl/blob/46cb8fe5589e88e36d79f9b8b8e5f4ff4fceb5de/visualization/src/point_cloud_handlers.cpp#L63

Also ich denke, es ist nicht wirklich die Mühe wert. Wenn Sie jedoch C++ 11 verwenden, können Sie es in 1 Zeile (mit for_each, transform, range-loop) tun. Etwas Ähnliches (nicht getestet):

int32_t rgb = (static_cast<uint32_t>(r) << 16 | 
    static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b)); 
std::transform(cloud->points.begin(), cloud->points.end(), cloud->points.begin(), [rgb](pcl::PointXYZRGB p) { p.rgb = rgb; return p;}); 

oder noch besser eine einfache Bereich Schleife

int32_t rgb = (static_cast<uint32_t>(r) << 16 | 
     static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b)); 
for(auto &p: cloud->points) p.rgb=rgb; 
+0

Also, ich bin wahrscheinlich besser mit Speichern eines RGB-Wert neben der Punktwolke kleben statt Iterieren? Später kann ich dann die Funktionalität in PCLVisualizer verwenden. Wie du gesagt hast, es scheint die Mühe nicht wert zu sein. – macourtney7

+0

Ihr Ansatz ist eine Möglichkeit. Alternativ können Sie eine riesige Punktwolke verwenden und etwas wie pcl :: PointXYZL verwenden, wobei L für Label oder pcl :: PointXYZI with Intensity steht. Dann können Sie PointCloudColorHandlerLabelField oder PointCloudColorHandlerGenericField verwenden. Aber dann wählen Sie die Farbwerte in der Visualisierung nicht wirklich aus. –

+0

Aber selbst in diesem Fall, wenn Sie den Code der PCL schauen, verwenden sie Loops sehr. Also kommst du nicht wirklich davon weg. –

Verwandte Themen