Predator's Vision

画像処理、3D点群処理、DeepLearning等の備忘録

PCLVisualizerでポイントクラウドの透明度を反映させて描画する方法

pcl::PointXYZRGBAというタイプのポイントクラウドを作り、アルファ値(a)を0にしてもPCLVisualizerで透明にならないなぁと思っていたのですが、カラーハンドラーを設定すればちゃんと透明度に合わせて描画されることに気づきました。

以下、サンプル

#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/visualization/pcl_visualizer.h>

int main(int argc, char** argv) {
	pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);

	// 適当なポイントクラウドを作成
	cloud->width  = 256;
	cloud->height = 128;
	cloud->points.resize (cloud->width * cloud->height);
	for(int i = 0, y = 0; y < cloud->height; y++) {
		for(int x = 0; x < cloud->width; x++, i++) {
			pcl::PointXYZRGBA &p = cloud->points[i];
			p.x = x;
			p.y = y;
			p.z = 0.0;
			p.r = 255;
			p.g = static_cast<float>(y) / cloud->height * 255;
			p.b = 0;
			p.a = static_cast<float>(x) / cloud->width * 255;
		}
	}

	// 表示
	int vp[2];
	pcl::visualization::PCLVisualizer viewer("Viewer");
	pcl::visualization::PointCloudColorHandlerRGBAField<pcl::PointXYZRGBA> rgba(cloud);
	viewer.createViewPort(0.0, 0.0, 0.5, 1.0, vp[0]);
	viewer.createViewPort(0.5, 0.0, 1.0, 1.0, vp[1]);
	viewer.addPointCloud(cloud, "cloud_without_color_handler", vp[0]);    // 透明度が反映されない
	viewer.addPointCloud(cloud, rgba, "cloud_with_color_handler", vp[1]);    // 透明度が反映される
	viewer.addText("Without color handler", 10, 10, "text_without_color_handler", vp[0]);
	viewer.addText("With color handler", 10, 10, "text_with_color_handler", vp[1]);
	viewer.spin();
	
	return 0;
}


実行したときの画像がこちら

f:id:presan:20141016201114p:plain