diff --git a/app/android/custom_rules.xml b/app/android/custom_rules.xml index 52c63d99..6ce83384 100644 --- a/app/android/custom_rules.xml +++ b/app/android/custom_rules.xml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/app/android/jni/RTABMapApp.cpp b/app/android/jni/RTABMapApp.cpp index 8dc4db2c..78d4d834 100644 --- a/app/android/jni/RTABMapApp.cpp +++ b/app/android/jni/RTABMapApp.cpp @@ -57,7 +57,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -const int g_minPolygonClusterSize = 200; const int g_exportedMeshId = -100; static JavaVM *jvm; @@ -140,6 +139,8 @@ RTABMapApp::RTABMapApp() : meshDecimation_(1), meshTrianglePix_(1), meshAngleToleranceDeg_(15.0), + minClusterSize_(200), + maxGainRadius_(0.02f), paused_(false), dataRecorderMode_(false), clearSceneOnNextRender_(false), @@ -823,7 +824,8 @@ int RTABMapApp::Render() } } - rtabmap::GainCompensator compensator; + UASSERT(maxGainRadius_>0.0f); + rtabmap::GainCompensator compensator(maxGainRadius_); if(clouds.size() > 1 && links.size()) { compensator.feed(clouds, indices, links); @@ -866,7 +868,7 @@ int RTABMapApp::Render() notifyDataLoaded = true; } - if(filterPolygonsOnNextRender_) + if(filterPolygonsOnNextRender_ && minClusterSize_>0) { LOGI("Polygon filtering..."); filterPolygonsOnNextRender_ = false; @@ -885,7 +887,7 @@ int RTABMapApp::Render() vertexToPolygons); std::list > clusters = rtabmap::util3d::clusterPolygons( neighbors, - g_minPolygonClusterSize); + minClusterSize_); std::vector filteredPolygons(iter->second.polygons.size()); int oi=0; for(std::list >::iterator jter=clusters.begin(); jter!=clusters.end(); ++jter) @@ -1132,7 +1134,17 @@ void RTABMapApp::setMeshAngleTolerance(float value) void RTABMapApp::setMeshTriangleSize(int value) { - meshTrianglePix_ = value; + meshTrianglePix_ = value; +} + +void RTABMapApp::setMinClusterSize(int value) +{ + minClusterSize_ = value; +} + +void RTABMapApp::setMaxGainRadius(float value) +{ + maxGainRadius_ = value; } int RTABMapApp::setMappingParameter(const std::string & key, const std::string & value) @@ -1588,7 +1600,7 @@ bool RTABMapApp::exportMesh( textureMesh->tex_polygons.pop_back(); textureMesh->tex_materials.pop_back(); - if(g_minPolygonClusterSize>0) + if(minClusterSize_>0) { LOGI("Filter small polygon clusters..."); @@ -1617,7 +1629,7 @@ bool RTABMapApp::exportMesh( vertexToPolygons); std::list > clusters = rtabmap::util3d::clusterPolygons( neighbors, - g_minPolygonClusterSize); + minClusterSize_); std::set validPolygons; for(std::list >::iterator kter=clusters.begin(); kter!=clusters.end(); ++kter) diff --git a/app/android/jni/RTABMapApp.h b/app/android/jni/RTABMapApp.h index daf5e3d5..6a3ca5e3 100644 --- a/app/android/jni/RTABMapApp.h +++ b/app/android/jni/RTABMapApp.h @@ -131,6 +131,8 @@ class RTABMapApp : public UEventsHandler { void setMeshDecimation(int value); void setMeshAngleTolerance(float value); void setMeshTriangleSize(int value); + void setMinClusterSize(int value); + void setMaxGainRadius(float value); int setMappingParameter(const std::string & key, const std::string & value); void resetMapping(); @@ -179,6 +181,8 @@ class RTABMapApp : public UEventsHandler { int meshDecimation_; int meshTrianglePix_; float meshAngleToleranceDeg_; + int minClusterSize_; + float maxGainRadius_; rtabmap::ParametersMap mappingParameters_; diff --git a/app/android/jni/jni_interface.cpp b/app/android/jni/jni_interface.cpp index 0fc11dfd..5ebe87fd 100644 --- a/app/android/jni/jni_interface.cpp +++ b/app/android/jni/jni_interface.cpp @@ -246,6 +246,18 @@ Java_com_introlab_rtabmap_RTABMapLib_setMeshTriangleSize( { return app.setMeshTriangleSize(value); } +JNIEXPORT void JNICALL +Java_com_introlab_rtabmap_RTABMapLib_setMinClusterSize( + JNIEnv*, jobject, int value) +{ + return app.setMinClusterSize(value); +} +JNIEXPORT void JNICALL +Java_com_introlab_rtabmap_RTABMapLib_setMaxGainRadius( + JNIEnv*, jobject, float value) +{ + return app.setMaxGainRadius(value); +} JNIEXPORT jint JNICALL Java_com_introlab_rtabmap_RTABMapLib_setMappingParameter( JNIEnv* env, jobject, jstring key, jstring value) diff --git a/app/android/res/layout/activity_settings.xml b/app/android/res/layout/activity_settings.xml index 6ce192df..b53abea5 100644 --- a/app/android/res/layout/activity_settings.xml +++ b/app/android/res/layout/activity_settings.xml @@ -186,9 +186,25 @@ - + + + + + diff --git a/app/android/res/values/strings.xml b/app/android/res/values/strings.xml index cd4ad28e..2bc7b61a 100644 --- a/app/android/res/values/strings.xml +++ b/app/android/res/values/strings.xml @@ -57,6 +57,9 @@ pref_key_opt_decimation_factor80 pref_key_opt_color_radius 0.0 pref_key_opt_clean_white true + + pref_key_gain_max_radius 0.02 + pref_key_min_cluster_size 200 Rendering @@ -413,6 +416,37 @@ General + + Color Correction Radius + Radius used to find pixel correspondences for color correction. + Min Cluster Size + Minimum number of polygons for a cluster to be kept after Noise Filtering optimization. + + + "0.3 m" + "0.2 m" + "0.1 m" + "0.05 m" + "0.02 m" + "0.01 m" + + + "0.3" + "0.2" + "0.1" + "0.05" + "0.02" + "0.01" + + + + "500" + "200" + "100" + "50" + "10" + + Restore All Default Settings diff --git a/app/android/src/com/introlab/rtabmap/RTABMapActivity.java b/app/android/src/com/introlab/rtabmap/RTABMapActivity.java index 181cb97d..efb6d761 100644 --- a/app/android/src/com/introlab/rtabmap/RTABMapActivity.java +++ b/app/android/src/com/introlab/rtabmap/RTABMapActivity.java @@ -283,6 +283,9 @@ public class RTABMapActivity extends Activity implements OnClickListener { RTABMapLib.setPointSize(Float.parseFloat(sharedPref.getString(getString(R.string.pref_key_point_size), getString(R.string.pref_default_point_size)))); RTABMapLib.setMeshAngleTolerance(Float.parseFloat(sharedPref.getString(getString(R.string.pref_key_angle), getString(R.string.pref_default_angle)))); RTABMapLib.setMeshTriangleSize(Integer.parseInt(sharedPref.getString(getString(R.string.pref_key_triangle), getString(R.string.pref_default_triangle)))); + + RTABMapLib.setMinClusterSize(Integer.parseInt(sharedPref.getString(getString(R.string.pref_key_min_cluster_size), getString(R.string.pref_default_min_cluster_size)))); + RTABMapLib.setMaxGainRadius(Float.parseFloat(sharedPref.getString(getString(R.string.pref_key_gain_max_radius), getString(R.string.pref_default_gain_max_radius)))); if(mItemRenderingPointCloud != null) { diff --git a/app/android/src/com/introlab/rtabmap/RTABMapLib.java b/app/android/src/com/introlab/rtabmap/RTABMapLib.java index 713c0c3e..57b15ff6 100644 --- a/app/android/src/com/introlab/rtabmap/RTABMapLib.java +++ b/app/android/src/com/introlab/rtabmap/RTABMapLib.java @@ -77,6 +77,8 @@ public class RTABMapLib public static native void setMeshDecimation(int value); public static native void setMeshAngleTolerance(float value); public static native void setMeshTriangleSize(int value); + public static native void setMinClusterSize(int value); + public static native void setMaxGainRadius(float value); public static native int setMappingParameter(String key, String value); public static native void resetMapping(); diff --git a/app/android/src/com/introlab/rtabmap/SettingsActivity.java b/app/android/src/com/introlab/rtabmap/SettingsActivity.java index 7fed6f6e..b12686d5 100644 --- a/app/android/src/com/introlab/rtabmap/SettingsActivity.java +++ b/app/android/src/com/introlab/rtabmap/SettingsActivity.java @@ -48,6 +48,8 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref ((Preference)findPreference(getString(R.string.pref_key_opt_decimation_factor))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_opt_decimation_factor))).getValue() + "%%) "+getString(R.string.pref_summary_opt_decimation_factor)); ((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)); + ((Preference)findPreference(getString(R.string.pref_key_min_cluster_size))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_min_cluster_size))).getEntry() + ") "+getString(R.string.pref_summary_min_cluster_size)); + ((Preference)findPreference(getString(R.string.pref_key_gain_max_radius))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_gain_max_radius))).getEntry() + ") "+getString(R.string.pref_summary_gain_max_radius)); } public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { @@ -73,6 +75,9 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref 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_decimation_factor))==0) pref.setSummary("("+((ListPreference)pref).getValue() + "%%) "+getString(R.string.pref_summary_opt_decimation_factor)); 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)); + + if(key.compareTo(getString(R.string.pref_key_min_cluster_size))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_min_cluster_size)); + if(key.compareTo(getString(R.string.pref_key_gain_max_radius))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_gain_max_radius)); } }