added test for textured mesh
This commit is contained in:
parent
8d327fa497
commit
ffad7b699c
@ -99,8 +99,7 @@ namespace cv
|
|||||||
CV_EXPORTS Mat readCloud (const String& file, OutputArray colors = noArray(), OutputArray normals = noArray());
|
CV_EXPORTS Mat readCloud (const String& file, OutputArray colors = noArray(), OutputArray normals = noArray());
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
/// Reads mesh. Only ply format is supported now. The function tries to read texture from png-file,
|
/// Reads mesh. Only ply format is supported now and no texture load support
|
||||||
/// and in case of faulure, just leaves the texture field empty.
|
|
||||||
|
|
||||||
CV_EXPORTS Mesh readMesh(const String& file);
|
CV_EXPORTS Mesh readMesh(const String& file);
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ namespace cv
|
|||||||
|
|
||||||
Mat texture, tcoords;
|
Mat texture, tcoords;
|
||||||
|
|
||||||
//! Loads mesh from a given ply file
|
//! Loads mesh from a given ply file (no texture load support for now)
|
||||||
static Mesh load(const String& file);
|
static Mesh load(const String& file);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -73,7 +73,6 @@ cv::viz::Mesh cv::viz::Mesh::load(const String& file)
|
|||||||
sink->Write();
|
sink->Write();
|
||||||
|
|
||||||
// Now handle the polygons
|
// Now handle the polygons
|
||||||
|
|
||||||
vtkSmartPointer<vtkCellArray> polygons = polydata->GetPolys();
|
vtkSmartPointer<vtkCellArray> polygons = polydata->GetPolys();
|
||||||
mesh.polygons.create(1, polygons->GetSize(), CV_32SC1);
|
mesh.polygons.create(1, polygons->GetSize(), CV_32SC1);
|
||||||
int* poly_ptr = mesh.polygons.ptr<int>();
|
int* poly_ptr = mesh.polygons.ptr<int>();
|
||||||
@ -87,25 +86,6 @@ cv::viz::Mesh cv::viz::Mesh::load(const String& file)
|
|||||||
*poly_ptr++ = (int)cell_points[i];
|
*poly_ptr++ = (int)cell_points[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
String::size_type pos = file.find_last_of('.');
|
|
||||||
String png = (pos == String::npos) ? file : file.substr(0, pos+1) + "png";
|
|
||||||
|
|
||||||
vtkSmartPointer<vtkPNGReader> png_reader = vtkSmartPointer<vtkPNGReader>::New();
|
|
||||||
|
|
||||||
if (png_reader->CanReadFile(png.c_str()))
|
|
||||||
{
|
|
||||||
png_reader->SetFileName(png.c_str());
|
|
||||||
png_reader->Update();
|
|
||||||
vtkSmartPointer<vtkImageData> imagedata = png_reader->GetOutput();
|
|
||||||
|
|
||||||
Size sz(imagedata->GetDimensions()[0], imagedata->GetDimensions()[1]);
|
|
||||||
int channels = imagedata->GetNumberOfScalarComponents();
|
|
||||||
CV_Assert(imagedata->GetScalarType() == VTK_UNSIGNED_CHAR);
|
|
||||||
|
|
||||||
void *ptr = imagedata->GetScalarPointer(0,0,0);
|
|
||||||
Mat(sz, CV_8UC(channels), ptr).copyTo(mesh.texture);
|
|
||||||
}
|
|
||||||
|
|
||||||
return mesh;
|
return mesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,19 +47,11 @@ TEST(Viz_viz3d, develop)
|
|||||||
{
|
{
|
||||||
cv::Mat cloud = cv::viz::readCloud(get_dragon_ply_file_path());
|
cv::Mat cloud = cv::viz::readCloud(get_dragon_ply_file_path());
|
||||||
|
|
||||||
//cv::viz::Mesh3d mesh = cv::viz::Mesh3d::load(get_dragon_ply_file_path());
|
|
||||||
//theRNG().fill(mesh.colors, RNG::UNIFORM, 0, 255);
|
|
||||||
|
|
||||||
cv::viz::Viz3d viz("abc");
|
cv::viz::Viz3d viz("abc");
|
||||||
viz.setBackgroundMeshLab();
|
viz.setBackgroundMeshLab();
|
||||||
viz.showWidget("coo", cv::viz::WCoordinateSystem(1));
|
viz.showWidget("coo", cv::viz::WCoordinateSystem(1));
|
||||||
//viz.showWidget("cloud", cv::viz::WPaintedCloud(cloud, Vec3d(0.0, 0.0, -1.0), Vec3d(0.0, 0.0, 1.0)));
|
|
||||||
//viz.showWidget("cloud", cv::viz::WPaintedCloud(cloud, Vec3d(0.0, 0.0, -1.0), Vec3d(0.0, 0.0, 1.0), cv::viz::Color::green(), cv::viz::Color::red()));
|
|
||||||
viz.showWidget("cloud", cv::viz::WPaintedCloud(cloud));
|
viz.showWidget("cloud", cv::viz::WPaintedCloud(cloud));
|
||||||
|
|
||||||
//viz.showWidget("h", cv::viz::Widget::fromPlyFile("d:/horse-red.ply"));
|
|
||||||
//viz.showWidget("a", cv::viz::WArrow(cv::Point3f(0,0,0), cv::Point3f(1,1,1)));
|
|
||||||
|
|
||||||
//---->>>>> <to_test_in_future>
|
//---->>>>> <to_test_in_future>
|
||||||
//std::vector<cv::Affine3d> gt, es;
|
//std::vector<cv::Affine3d> gt, es;
|
||||||
//cv::viz::readTrajectory(gt, "d:/Datasets/trajs/gt%05d.xml");
|
//cv::viz::readTrajectory(gt, "d:/Datasets/trajs/gt%05d.xml");
|
||||||
@ -67,12 +59,5 @@ TEST(Viz_viz3d, develop)
|
|||||||
//cv::Mat cloud = cv::viz::readCloud(get_dragon_ply_file_path());
|
//cv::Mat cloud = cv::viz::readCloud(get_dragon_ply_file_path());
|
||||||
//---->>>>> </to_test_in_future>
|
//---->>>>> </to_test_in_future>
|
||||||
|
|
||||||
//theRNG().fill(colors, cv::RNG::UNIFORM, 0, 255);
|
|
||||||
//viz.showWidget("c", cv::viz::WCloud(cloud, colors));
|
|
||||||
//viz.showWidget("c", cv::viz::WCloud(cloud, cv::viz::Color::bluberry()));
|
|
||||||
|
|
||||||
//viz.showWidget("l", cv::viz::WLine(Point3f(0,0,0), Point3f(1,1,1)));
|
|
||||||
//viz.showWidget("s", cv::viz::WSphere(Point3f(0,0,0), 1));
|
|
||||||
//viz.showWidget("d", cv::viz::WCircle(Point3f(0,0,0), 1));
|
|
||||||
viz.spin();
|
viz.spin();
|
||||||
}
|
}
|
||||||
|
@ -145,6 +145,42 @@ TEST(Viz, show_mesh_random_colors)
|
|||||||
viz.spin();
|
viz.spin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(Viz, show_textured_mesh)
|
||||||
|
{
|
||||||
|
Mat lena = imread(Path::combine(cvtest::TS::ptr()->get_data_path(), "lena.png"));
|
||||||
|
|
||||||
|
std::vector<Vec3d> points;
|
||||||
|
std::vector<Vec2d> tcoords;
|
||||||
|
std::vector<int> polygons;
|
||||||
|
for(size_t i = 0; i < 64; ++i)
|
||||||
|
{
|
||||||
|
double angle = CV_PI/2 * i/64.0;
|
||||||
|
points.push_back(Vec3d(0.00, cos(angle), sin(angle))*0.75);
|
||||||
|
points.push_back(Vec3d(1.57, cos(angle), sin(angle))*0.75);
|
||||||
|
tcoords.push_back(Vec2d(0.0, i/64.0));
|
||||||
|
tcoords.push_back(Vec2d(1.0, i/64.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(size_t i = 0; i < points.size()/2-1; ++i)
|
||||||
|
{
|
||||||
|
int polys[] = {3, 2*i, 2*i+1, 2*i+2, 3, 2*i+1, 2*i+2, 2*i+3};
|
||||||
|
polygons.insert(polygons.end(), polys, polys + sizeof(polys)/sizeof(polys[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
cv::viz::Mesh mesh;
|
||||||
|
mesh.cloud = Mat(points, true).reshape(3, 1);
|
||||||
|
mesh.tcoords = Mat(tcoords, true).reshape(2, 1);
|
||||||
|
mesh.polygons = Mat(polygons, true).reshape(1, 1);
|
||||||
|
mesh.texture = lena;
|
||||||
|
|
||||||
|
Viz3d viz("show_textured_mesh");
|
||||||
|
viz.setBackgroundMeshLab();
|
||||||
|
viz.showWidget("coosys", WCoordinateSystem());
|
||||||
|
viz.showWidget("mesh", WMesh(mesh));
|
||||||
|
viz.setRenderingProperty("mesh", SHADING, SHADING_PHONG);
|
||||||
|
viz.spin();
|
||||||
|
}
|
||||||
|
|
||||||
TEST(Viz, show_polyline)
|
TEST(Viz, show_polyline)
|
||||||
{
|
{
|
||||||
Mat polyline(1, 32, CV_64FC3);
|
Mat polyline(1, 32, CV_64FC3);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user