WCloud(InputArray cloud, InputArray colors);
//! All points in cloud have the same color
WCloud(InputArray cloud, const Color &color = Color::white());
+ //! Each point in cloud is mapped to a color in colors, normals are used for shading
+ WCloud(InputArray cloud, InputArray colors, InputArray normals);
+ //! All points in cloud have the same color, normals are used for shading
+ WCloud(InputArray cloud, const Color &color, InputArray normals);
};
viz::WCloud::WCloud
Points in the cloud belong to mask when they are set to (NaN, NaN, NaN).
+.. ocv:function:: WCloud(InputArray cloud, InputArray colors, InputArray normals)
+
+ :param cloud: Set of points which can be of type: ``CV_32FC3``, ``CV_32FC4``, ``CV_64FC3``, ``CV_64FC4``.
+ :param colors: Set of colors. It has to be of the same size with cloud.
+ :param normals: Normals for each point in cloud. Size and type should match with the cloud parameter.
+
+ Points in the cloud belong to mask when they are set to (NaN, NaN, NaN).
+
+.. ocv:function:: WCloud(InputArray cloud, const Color &color, InputArray normals)
+
+ :param cloud: Set of points which can be of type: ``CV_32FC3``, ``CV_32FC4``, ``CV_64FC3``, ``CV_64FC4``.
+ :param color: A single :ocv:class:`Color` for the whole cloud.
+ :param normals: Normals for each point in cloud. Size and type should match with the cloud parameter.
+
+ Points in the cloud belong to mask when they are set to (NaN, NaN, NaN).
+
.. note:: In case there are four channels in the cloud, fourth channel is ignored.
viz::WCloudCollection
public:
//! Each point in cloud is mapped to a color in colors
WCloud(InputArray cloud, InputArray colors);
+
//! All points in cloud have the same color
WCloud(InputArray cloud, const Color &color = Color::white());
+
+ //! Each point in cloud is mapped to a color in colors, normals are used for shading
+ WCloud(InputArray cloud, InputArray colors, InputArray normals);
+
+ //! All points in cloud have the same color, normals are used for shading
+ WCloud(InputArray cloud, const Color &color, InputArray normals);
};
class CV_EXPORTS WPaintedCloud: public Widget3D
/// Point Cloud Widget implementation
cv::viz::WCloud::WCloud(InputArray cloud, InputArray colors)
+{
+ WCloud cloud_widget(cloud, colors, cv::noArray());
+ *this = cloud_widget;
+}
+
+cv::viz::WCloud::WCloud(InputArray cloud, const Color &color)
+{
+ WCloud cloud_widget(cloud, Mat(cloud.size(), CV_8UC3, color));
+ *this = cloud_widget;
+}
+
+cv::viz::WCloud::WCloud(InputArray cloud, const Color &color, InputArray normals)
+{
+ WCloud cloud_widget(cloud, Mat(cloud.size(), CV_8UC3, color), normals);
+ *this = cloud_widget;
+}
+
+cv::viz::WCloud::WCloud(cv::InputArray cloud, cv::InputArray colors, cv::InputArray normals)
{
CV_Assert(!cloud.empty() && !colors.empty());
vtkSmartPointer<vtkCloudMatSource> cloud_source = vtkSmartPointer<vtkCloudMatSource>::New();
- cloud_source->SetColorCloud(cloud, colors);
+ cloud_source->SetColorCloudNormals(cloud, colors, normals);
cloud_source->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
-}
-cv::viz::WCloud::WCloud(InputArray cloud, const Color &color)
-{
- WCloud cloud_widget(cloud, Mat(cloud.size(), CV_8UC3, color));
- *this = cloud_widget;
}
viz.spin();
}
+TEST(Viz, show_cloud_shaded_by_normals)
+{
+ Mesh mesh = Mesh::load(get_dragon_ply_file_path());
+ computeNormals(mesh, mesh.normals);
+
+ Affine3d pose = Affine3d().rotate(Vec3d(0, 0.8, 0));
+
+ WCloud cloud(mesh.cloud, Color::white(), mesh.normals);
+ cloud.setRenderingProperty(SHADING, SHADING_GOURAUD);
+
+ Viz3d viz("show_cloud_shaded_by_normals");
+ viz.showWidget("cloud", cloud, pose);
+ viz.showWidget("text2d", WText("Cloud shaded by normals", Point(20, 20), 20, Color::green()));
+ viz.spin();
+}
+
TEST(Viz, show_trajectories)
{
std::vector<Affine3d> path = generate_test_trajectory<double>(), sub0, sub1, sub2, sub3, sub4, sub5;