From d927b820207f98d5921a906e7f53b30b5d351759 Mon Sep 17 00:00:00 2001 From: matlabbe Date: Sat, 4 Mar 2017 19:34:40 -0500 Subject: [PATCH] Tango: added min texture cluster size option --- app/android/AndroidManifest.xml.in | 2 +- app/android/jni/RTABMapApp.cpp | 7 +- app/android/jni/RTABMapApp.h | 3 +- app/android/jni/jni_interface.cpp | 6 +- app/android/jni/scene.cpp | 8 +- app/android/res/layout/activity_settings.xml | 8 ++ app/android/res/values/strings.xml | 24 +++++- .../com/introlab/rtabmap/RTABMapActivity.java | 8 +- .../src/com/introlab/rtabmap/RTABMapLib.java | 3 +- .../introlab/rtabmap/SettingsActivity.java | 2 + .../pcl18/surface/impl/texture_mapping.hpp | 76 +++++++++---------- 11 files changed, 92 insertions(+), 55 deletions(-) diff --git a/app/android/AndroidManifest.xml.in b/app/android/AndroidManifest.xml.in index 3039c393..b27bce9a 100644 --- a/app/android/AndroidManifest.xml.in +++ b/app/android/AndroidManifest.xml.in @@ -2,7 +2,7 @@ diff --git a/app/android/jni/RTABMapApp.cpp b/app/android/jni/RTABMapApp.cpp index f2e8c851..a5ec206c 100644 --- a/app/android/jni/RTABMapApp.cpp +++ b/app/android/jni/RTABMapApp.cpp @@ -1558,7 +1558,6 @@ bool RTABMapApp::exportMesh( bool meshing, int textureSize, int normalK, - float maxTextureDistance, bool optimized, float optimizedVoxelSize, int optimizedDepth, @@ -1566,6 +1565,8 @@ bool RTABMapApp::exportMesh( float optimizedColorRadius, bool optimizedCleanWhitePolygons, bool optimizedColorWhitePolygons, // not yet used + float optimizedMaxTextureDistance, + int optimizedMinTextureClusterSize, bool blockRendering) { // make sure createdMeshes_ is not modified while exporting! We don't @@ -1991,8 +1992,8 @@ bool RTABMapApp::exportMesh( mesh, cameraPoses, cameraModels, - maxTextureDistance, - 50, + optimizedMaxTextureDistance, + optimizedMinTextureClusterSize, &progressionStatus_); LOGI("Texturing... done! %fs", timer.ticks()); diff --git a/app/android/jni/RTABMapApp.h b/app/android/jni/RTABMapApp.h index f0cbddab..39ce36c5 100644 --- a/app/android/jni/RTABMapApp.h +++ b/app/android/jni/RTABMapApp.h @@ -151,7 +151,6 @@ class RTABMapApp : public UEventsHandler { bool meshing, int textureSize, int normalK, - float maxTextureDistance, bool optimized, float optimizedVoxelSize, int optimizedDepth, @@ -159,6 +158,8 @@ class RTABMapApp : public UEventsHandler { float optimizedColorRadius, bool optimizedCleanWhitePolygons, bool optimizedColorWhitePolygons, + float optimizedMaxTextureDistance, + int optimizedMinTextureClusterSize, bool blockRendering); bool postExportation(bool visualize); int postProcessing(int approach); diff --git a/app/android/jni/jni_interface.cpp b/app/android/jni/jni_interface.cpp index d4f82d36..58aee86f 100644 --- a/app/android/jni/jni_interface.cpp +++ b/app/android/jni/jni_interface.cpp @@ -312,7 +312,6 @@ Java_com_introlab_rtabmap_RTABMapLib_exportMesh( bool meshing, int textureSize, int normalK, - float maxTextureDistance, bool optimized, float optimizedVoxelSize, int optimizedDepth, @@ -320,6 +319,8 @@ Java_com_introlab_rtabmap_RTABMapLib_exportMesh( float optimizedColorRadius, bool optimizedCleanWhitePolygons, bool optimizedColorWhitePolygons, + float optimizedMaxTextureDistance, + int optimizedMinTextureClusterSize, bool blockRendering) { std::string filePathC; @@ -331,7 +332,6 @@ Java_com_introlab_rtabmap_RTABMapLib_exportMesh( meshing, textureSize, normalK, - maxTextureDistance, optimized, optimizedVoxelSize, optimizedDepth, @@ -339,6 +339,8 @@ Java_com_introlab_rtabmap_RTABMapLib_exportMesh( optimizedColorRadius, optimizedCleanWhitePolygons, optimizedColorWhitePolygons, + optimizedMaxTextureDistance, + optimizedMinTextureClusterSize, blockRendering); } diff --git a/app/android/jni/scene.cpp b/app/android/jni/scene.cpp index bc0aaada..084d69b7 100644 --- a/app/android/jni/scene.cpp +++ b/app/android/jni/scene.cpp @@ -65,8 +65,8 @@ const std::string kPointCloudVertexShader = " vLightWeighting = 1.0;\n" " } else {\n" " vec3 transformedNormal = uN * aNormal;\n" - " vLightWeighting = max(dot(transformedNormal, uLightingDirection), 0.0);\n" - " if(vLightWeighting<0.1) vLightWeighting=0.1;\n" + " vLightWeighting = max(dot(transformedNormal, uLightingDirection)*0.5+0.5, 0.0);\n" + " if(vLightWeighting<0.5) vLightWeighting=0.5;\n" " }\n" " vColor = aColor;\n" "}\n"; @@ -111,8 +111,8 @@ const std::string kTextureMeshVertexShader = " vLightWeighting = 1.0;\n" " } else {\n" " vec3 transformedNormal = uN * aNormal;\n" - " vLightWeighting = max(dot(transformedNormal, uLightingDirection), 0.0);\n" - " if(vLightWeighting<0.1) vLightWeighting=0.1;\n" + " vLightWeighting = max(dot(transformedNormal, uLightingDirection)*0.5+0.5, 0.0);\n" + " if(vLightWeighting<0.5) vLightWeighting=0.5;\n" " }\n" "}\n"; const std::string kTextureMeshFragmentShader = diff --git a/app/android/res/layout/activity_settings.xml b/app/android/res/layout/activity_settings.xml index fcef779b..a6913e74 100644 --- a/app/android/res/layout/activity_settings.xml +++ b/app/android/res/layout/activity_settings.xml @@ -217,6 +217,14 @@ android:entryValues="@array/pref_max_texture_distance_values" android:defaultValue="@string/pref_default_max_texture_distance"/> + + 6 pref_key_max_texture_distance 3 + pref_key_min_texture_cluster_size + 50 pref_key_block_render false pref_key_opt_depth @@ -481,6 +483,8 @@ K-nearest neighbors used for normal computation when a mesh is created. Max Texture Distance Maximum distance from a camera for polygons to be textured by this camera. + Min Texture Cluster Size + Minimum polygon cluster size to be textured by a camera. This helps to filter sparse textured polygons. Block Rendering Thread While Exporting This decreases exporting time, but freezes rendering while exporting. This also clears temporary the rendered clouds/meshes from memory during exporting, this can be useful to avoid out of memory errors. @@ -543,7 +547,25 @@ "2.5" "2" - + + "Disabled" + "1000" + "500" + "200" + "100" + "50" + "10" + + + "0" + "1000" + "500" + "200" + "100" + "50" + "10" + + Optimized Voxel Size Increasing this can reduce reconstruction time at the cost of less geometry precision. diff --git a/app/android/src/com/introlab/rtabmap/RTABMapActivity.java b/app/android/src/com/introlab/rtabmap/RTABMapActivity.java index 68eb7f16..b0fa4a09 100644 --- a/app/android/src/com/introlab/rtabmap/RTABMapActivity.java +++ b/app/android/src/com/introlab/rtabmap/RTABMapActivity.java @@ -1165,8 +1165,8 @@ public class RTABMapActivity extends Activity implements OnClickListener { mButtonShareOnSketchfab.setVisibility(View.VISIBLE); mItemSave.setEnabled(mButtonPause.isChecked()); mItemExport.setEnabled(mButtonPause.isChecked() && !mItemDataRecorderMode.isChecked()); - mItemOpen.setEnabled(mButtonPause.isChecked() && !mItemDataRecorderMode.isChecked()); - mItemPostProcessing.setEnabled(mButtonPause.isChecked() && !mItemDataRecorderMode.isChecked()); + mItemOpen.setEnabled(false); + mItemPostProcessing.setEnabled(false); mItemSettings.setEnabled(true); mItemReset.setEnabled(true); mItemModes.setEnabled(true); @@ -1721,6 +1721,7 @@ public class RTABMapActivity extends Activity implements OnClickListener { final int textureSize = isOBJ?Integer.parseInt(sharedPref.getString(getString(R.string.pref_key_texture_size), getString(R.string.pref_default_texture_size))):0; final int normalK = Integer.parseInt(sharedPref.getString(getString(R.string.pref_key_normal_k), getString(R.string.pref_default_normal_k))); final float maxTextureDistance = Float.parseFloat(sharedPref.getString(getString(R.string.pref_key_max_texture_distance), getString(R.string.pref_default_max_texture_distance))); + final int minTextureClusterSize = Integer.parseInt(sharedPref.getString(getString(R.string.pref_key_min_texture_cluster_size), getString(R.string.pref_default_min_texture_cluster_size))); final float optimizedVoxelSize = cloudVoxelSize; final int optimizedDepth = Integer.parseInt(sharedPref.getString(getString(R.string.pref_key_opt_depth), getString(R.string.pref_default_opt_depth))); final float optimizedColorRadius = Float.parseFloat(sharedPref.getString(getString(R.string.pref_key_opt_color_radius), getString(R.string.pref_default_opt_color_radius))); @@ -1752,7 +1753,6 @@ public class RTABMapActivity extends Activity implements OnClickListener { meshing, textureSize, normalK, - maxTextureDistance, optimized, optimizedVoxelSize, optimizedDepth, @@ -1760,6 +1760,8 @@ public class RTABMapActivity extends Activity implements OnClickListener { optimizedColorRadius, optimizedCleanWhitePolygons, optimizedColorWhitePolygons, + maxTextureDistance, + minTextureClusterSize, blockRendering); runOnUiThread(new Runnable() { public void run() { diff --git a/app/android/src/com/introlab/rtabmap/RTABMapLib.java b/app/android/src/com/introlab/rtabmap/RTABMapLib.java index d5b1aef0..1d3f2c7c 100644 --- a/app/android/src/com/introlab/rtabmap/RTABMapLib.java +++ b/app/android/src/com/introlab/rtabmap/RTABMapLib.java @@ -94,7 +94,6 @@ public class RTABMapLib boolean meshing, int textureSize, int normalK, - float maxTextureDistance, boolean optimized, float optimizedVoxelSize, int optimizedDepth, @@ -102,6 +101,8 @@ public class RTABMapLib float optimizedColorRadius, boolean optimizedCleanWhitePolygons, boolean optimizedColorWhitePolygons, + float optimizedMaxTextureDistance, + int optimizedMinTextureClusterSize, boolean blockRendering); public static native boolean postExportation(boolean visualize); public static native int postProcessing(int approach); diff --git a/app/android/src/com/introlab/rtabmap/SettingsActivity.java b/app/android/src/com/introlab/rtabmap/SettingsActivity.java index c69d3d74..ede57762 100644 --- a/app/android/src/com/introlab/rtabmap/SettingsActivity.java +++ b/app/android/src/com/introlab/rtabmap/SettingsActivity.java @@ -50,6 +50,7 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref ((Preference)findPreference(getString(R.string.pref_key_texture_size))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_texture_size))).getEntry() + ") "+getString(R.string.pref_summary_texture_size)); ((Preference)findPreference(getString(R.string.pref_key_normal_k))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_normal_k))).getEntry() + ") "+getString(R.string.pref_summary_normal_k)); ((Preference)findPreference(getString(R.string.pref_key_max_texture_distance))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_max_texture_distance))).getEntry() + ") "+getString(R.string.pref_summary_max_texture_distance)); + ((Preference)findPreference(getString(R.string.pref_key_min_texture_cluster_size))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_min_texture_cluster_size))).getEntry() + ") "+getString(R.string.pref_summary_min_texture_cluster_size)); ((Preference)findPreference(getString(R.string.pref_key_opt_depth))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_opt_depth))).getEntry() + ") "+getString(R.string.pref_summary_opt_depth)); ((Preference)findPreference(getString(R.string.pref_key_opt_color_radius))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_opt_color_radius))).getEntry() + ") "+getString(R.string.pref_summary_opt_color_radius)); @@ -84,6 +85,7 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref if(key.compareTo(getString(R.string.pref_key_texture_size))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_texture_size)); if(key.compareTo(getString(R.string.pref_key_normal_k))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_normal_k)); if(key.compareTo(getString(R.string.pref_key_max_texture_distance))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_max_texture_distance)); + if(key.compareTo(getString(R.string.pref_key_min_texture_cluster_size))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_min_texture_cluster_size)); if(key.compareTo(getString(R.string.pref_key_opt_depth))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_opt_depth)); if(key.compareTo(getString(R.string.pref_key_opt_color_radius))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_opt_color_radius)); diff --git a/corelib/src/pcl18/surface/impl/texture_mapping.hpp b/corelib/src/pcl18/surface/impl/texture_mapping.hpp index 0ca57f4e..0833808d 100644 --- a/corelib/src/pcl18/surface/impl/texture_mapping.hpp +++ b/corelib/src/pcl18/surface/impl/texture_mapping.hpp @@ -1193,51 +1193,49 @@ pcl::TextureMapping::textureMeshwithMultipleCameras2 ( // filter clusters int clusterFaces = 0; - if(min_cluster_size_>0) + + std::vector polygons(visibleFaces[current_cam].size()); + std::vector polygon_to_face_index(visibleFaces[current_cam].size()); + oi =0; + for(std::map::iterator iter=visibleFaces[current_cam].begin(); iter!=visibleFaces[current_cam].end(); ++iter) { - std::vector polygons(visibleFaces[current_cam].size()); - std::vector polygon_to_face_index(visibleFaces[current_cam].size()); - oi =0; - for(std::map::iterator iter=visibleFaces[current_cam].begin(); iter!=visibleFaces[current_cam].end(); ++iter) - { - polygons[oi].vertices.resize(3); - polygons[oi].vertices[0] = faces[iter->first].vertices[0]; - polygons[oi].vertices[1] = faces[iter->first].vertices[1]; - polygons[oi].vertices[2] = faces[iter->first].vertices[2]; - polygon_to_face_index[oi] = iter->first; - ++oi; - } + polygons[oi].vertices.resize(3); + polygons[oi].vertices[0] = faces[iter->first].vertices[0]; + polygons[oi].vertices[1] = faces[iter->first].vertices[1]; + polygons[oi].vertices[2] = faces[iter->first].vertices[2]; + polygon_to_face_index[oi] = iter->first; + ++oi; + } - std::vector > neighbors; - std::vector > vertexToPolygons; - rtabmap::util3d::createPolygonIndexes(polygons, - (int)camera_cloud->size(), - neighbors, - vertexToPolygons); - std::list > clusters = rtabmap::util3d::clusterPolygons( - neighbors, - min_cluster_size_); - std::set polygonsKept; - for(std::list >::iterator iter=clusters.begin(); iter!=clusters.end(); ++iter) + std::vector > neighbors; + std::vector > vertexToPolygons; + rtabmap::util3d::createPolygonIndexes(polygons, + (int)camera_cloud->size(), + neighbors, + vertexToPolygons); + std::list > clusters = rtabmap::util3d::clusterPolygons( + neighbors, + min_cluster_size_); + std::set polygonsKept; + for(std::list >::iterator iter=clusters.begin(); iter!=clusters.end(); ++iter) + { + for(std::list::iterator jter=iter->begin(); jter!=iter->end(); ++jter) { - for(std::list::iterator jter=iter->begin(); jter!=iter->end(); ++jter) - { - polygonsKept.insert(polygon_to_face_index[*jter]); - faceCameras[polygon_to_face_index[*jter]].push_back(current_cam); - } + polygonsKept.insert(polygon_to_face_index[*jter]); + faceCameras[polygon_to_face_index[*jter]].push_back(current_cam); } + } - for(std::map::iterator iter=visibleFaces[current_cam].begin(); iter!=visibleFaces[current_cam].end();) + for(std::map::iterator iter=visibleFaces[current_cam].begin(); iter!=visibleFaces[current_cam].end();) + { + if(polygonsKept.find(iter->first) == polygonsKept.end()) { - if(polygonsKept.find(iter->first) == polygonsKept.end()) - { - visibleFaces[current_cam].erase(iter++); - ++clusterFaces; - } - else - { - ++iter; - } + visibleFaces[current_cam].erase(iter++); + ++clusterFaces; + } + else + { + ++iter; } }