mirror of
https://github.com/opencv/opencv.git
synced 2025-01-19 15:04:01 +08:00
Merge pull request #2591 from Nerei:viz_cloud_shading_support
This commit is contained in:
commit
211d44cfc5
@ -897,6 +897,10 @@ This 3D Widget defines a point cloud. ::
|
||||
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
|
||||
@ -917,6 +921,22 @@ Constructs a 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
|
||||
|
@ -320,8 +320,15 @@ namespace cv
|
||||
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
|
||||
|
@ -49,11 +49,29 @@
|
||||
/// 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();
|
||||
@ -69,12 +87,7 @@ cv::viz::WCloud::WCloud(InputArray cloud, InputArray colors)
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -248,6 +248,22 @@ TEST(Viz, show_sampled_normals)
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user