data_generation.markdown 2.05 KB

Training data generation using Icosphere {#tutorial_data_generation}

Goal

In this tutorial you will learn how to

  • Conduct a point cloud of camera view on sphere.
  • Generate training images using 3D model.

Code

@include cnn_3dobj/samples/sphereview_data.cpp

Explanation

Here is the general structure of the program:

  • Create a window. @code{.cpp} viz::Viz3d myWindow("Coordinate Frame"); @endcode

  • Set window size as 64*64, we use this scale as default. @code{.cpp} myWindow.setWindowSize(Size(64,64)); @endcode

  • Add coordinate axes. @code{.cpp} myWindow.showWidget("Coordinate Widget", viz::WCoordinateSystem()); myWindow.setBackgroundColor(viz::Color::gray()); myWindow.spin(); @endcode

  • Create a Mesh widget, loading .ply models. @code{.cpp} viz::Mesh objmesh = viz::Mesh::load(plymodel); @endcode

  • Get the center of the generated mesh widget, cause some .ply files. @code{.cpp} Point3d cam_focal_point = ViewSphere.getCenter(objmesh.cloud); @endcode

  • Get the pose of the camera using makeCameraPoses. @code{.cpp} Affine3f cam_pose = viz::makeCameraPose(campos.at(pose)radius+cam_focal_point, cam_focal_point, cam_y_dirradius+cam_focal_point); @endcode

  • Get the transformation matrix from camera coordinate system to global. @code{.cpp} Affine3f transform = viz::makeTransformToGlobal(Vec3f(1.0f,0.0f,0.0f), Vec3f(0.0f,1.0f,0.0f), Vec3f(0.0f,0.0f,1.0f), campos.at(pose)); viz::WMesh mesh_widget(objmesh); @endcode

  • Save screen shot as images. @code{.cpp} myWindow.saveScreenshot(filename); @endcode

  • Write images into binary files for further using in CNN training. @code{.cpp} ViewSphere.writeBinaryfile(filename, binaryPath, headerPath,(int)campos.size()num_class, label_class, (int)(campos.at(pose).x100), (int)(campos.at(pose).y100), (int)(campos.at(pose).z100), rgb_use); @endcode

Results

Here is collection images created by this demo using 4 model.