Tango: added min texture cluster size option

This commit is contained in:
matlabbe
2017-03-04 19:34:40 -05:00
parent e003fb8d35
commit d927b82020
11 changed files with 92 additions and 55 deletions

View File

@@ -2,7 +2,7 @@
<!-- BEGIN_INCLUDE(manifest) --> <!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.introlab.rtabmap" package="com.introlab.rtabmap"
android:versionCode="39" android:versionCode="40"
android:versionName="@RTABMAP_VERSION@"> android:versionName="@RTABMAP_VERSION@">
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />

View File

@@ -1558,7 +1558,6 @@ bool RTABMapApp::exportMesh(
bool meshing, bool meshing,
int textureSize, int textureSize,
int normalK, int normalK,
float maxTextureDistance,
bool optimized, bool optimized,
float optimizedVoxelSize, float optimizedVoxelSize,
int optimizedDepth, int optimizedDepth,
@@ -1566,6 +1565,8 @@ bool RTABMapApp::exportMesh(
float optimizedColorRadius, float optimizedColorRadius,
bool optimizedCleanWhitePolygons, bool optimizedCleanWhitePolygons,
bool optimizedColorWhitePolygons, // not yet used bool optimizedColorWhitePolygons, // not yet used
float optimizedMaxTextureDistance,
int optimizedMinTextureClusterSize,
bool blockRendering) bool blockRendering)
{ {
// make sure createdMeshes_ is not modified while exporting! We don't // make sure createdMeshes_ is not modified while exporting! We don't
@@ -1991,8 +1992,8 @@ bool RTABMapApp::exportMesh(
mesh, mesh,
cameraPoses, cameraPoses,
cameraModels, cameraModels,
maxTextureDistance, optimizedMaxTextureDistance,
50, optimizedMinTextureClusterSize,
&progressionStatus_); &progressionStatus_);
LOGI("Texturing... done! %fs", timer.ticks()); LOGI("Texturing... done! %fs", timer.ticks());

View File

@@ -151,7 +151,6 @@ class RTABMapApp : public UEventsHandler {
bool meshing, bool meshing,
int textureSize, int textureSize,
int normalK, int normalK,
float maxTextureDistance,
bool optimized, bool optimized,
float optimizedVoxelSize, float optimizedVoxelSize,
int optimizedDepth, int optimizedDepth,
@@ -159,6 +158,8 @@ class RTABMapApp : public UEventsHandler {
float optimizedColorRadius, float optimizedColorRadius,
bool optimizedCleanWhitePolygons, bool optimizedCleanWhitePolygons,
bool optimizedColorWhitePolygons, bool optimizedColorWhitePolygons,
float optimizedMaxTextureDistance,
int optimizedMinTextureClusterSize,
bool blockRendering); bool blockRendering);
bool postExportation(bool visualize); bool postExportation(bool visualize);
int postProcessing(int approach); int postProcessing(int approach);

View File

@@ -312,7 +312,6 @@ Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
bool meshing, bool meshing,
int textureSize, int textureSize,
int normalK, int normalK,
float maxTextureDistance,
bool optimized, bool optimized,
float optimizedVoxelSize, float optimizedVoxelSize,
int optimizedDepth, int optimizedDepth,
@@ -320,6 +319,8 @@ Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
float optimizedColorRadius, float optimizedColorRadius,
bool optimizedCleanWhitePolygons, bool optimizedCleanWhitePolygons,
bool optimizedColorWhitePolygons, bool optimizedColorWhitePolygons,
float optimizedMaxTextureDistance,
int optimizedMinTextureClusterSize,
bool blockRendering) bool blockRendering)
{ {
std::string filePathC; std::string filePathC;
@@ -331,7 +332,6 @@ Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
meshing, meshing,
textureSize, textureSize,
normalK, normalK,
maxTextureDistance,
optimized, optimized,
optimizedVoxelSize, optimizedVoxelSize,
optimizedDepth, optimizedDepth,
@@ -339,6 +339,8 @@ Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
optimizedColorRadius, optimizedColorRadius,
optimizedCleanWhitePolygons, optimizedCleanWhitePolygons,
optimizedColorWhitePolygons, optimizedColorWhitePolygons,
optimizedMaxTextureDistance,
optimizedMinTextureClusterSize,
blockRendering); blockRendering);
} }

View File

@@ -65,8 +65,8 @@ const std::string kPointCloudVertexShader =
" vLightWeighting = 1.0;\n" " vLightWeighting = 1.0;\n"
" } else {\n" " } else {\n"
" vec3 transformedNormal = uN * aNormal;\n" " vec3 transformedNormal = uN * aNormal;\n"
" vLightWeighting = max(dot(transformedNormal, uLightingDirection), 0.0);\n" " vLightWeighting = max(dot(transformedNormal, uLightingDirection)*0.5+0.5, 0.0);\n"
" if(vLightWeighting<0.1) vLightWeighting=0.1;\n" " if(vLightWeighting<0.5) vLightWeighting=0.5;\n"
" }\n" " }\n"
" vColor = aColor;\n" " vColor = aColor;\n"
"}\n"; "}\n";
@@ -111,8 +111,8 @@ const std::string kTextureMeshVertexShader =
" vLightWeighting = 1.0;\n" " vLightWeighting = 1.0;\n"
" } else {\n" " } else {\n"
" vec3 transformedNormal = uN * aNormal;\n" " vec3 transformedNormal = uN * aNormal;\n"
" vLightWeighting = max(dot(transformedNormal, uLightingDirection), 0.0);\n" " vLightWeighting = max(dot(transformedNormal, uLightingDirection)*0.5+0.5, 0.0);\n"
" if(vLightWeighting<0.1) vLightWeighting=0.1;\n" " if(vLightWeighting<0.5) vLightWeighting=0.5;\n"
" }\n" " }\n"
"}\n"; "}\n";
const std::string kTextureMeshFragmentShader = const std::string kTextureMeshFragmentShader =

View File

@@ -217,6 +217,14 @@
android:entryValues="@array/pref_max_texture_distance_values" android:entryValues="@array/pref_max_texture_distance_values"
android:defaultValue="@string/pref_default_max_texture_distance"/> android:defaultValue="@string/pref_default_max_texture_distance"/>
<ListPreference
android:key="@string/pref_key_min_texture_cluster_size"
android:title="@string/pref_title_min_texture_cluster_size"
android:summary="@string/pref_summary_min_texture_cluster_size"
android:entries="@array/pref_min_texture_cluster_size_keys"
android:entryValues="@array/pref_min_texture_cluster_size_values"
android:defaultValue="@string/pref_default_min_texture_cluster_size"/>
<SwitchPreference <SwitchPreference
android:key="@string/pref_key_block_render" android:key="@string/pref_key_block_render"
android:title="@string/pref_title_block_render" android:title="@string/pref_title_block_render"

View File

@@ -102,6 +102,8 @@
<string name="pref_default_normal_k">6</string> <string name="pref_default_normal_k">6</string>
<string name="pref_key_max_texture_distance">pref_key_max_texture_distance</string> <string name="pref_key_max_texture_distance">pref_key_max_texture_distance</string>
<string name="pref_default_max_texture_distance">3</string> <string name="pref_default_max_texture_distance">3</string>
<string name="pref_key_min_texture_cluster_size">pref_key_min_texture_cluster_size</string>
<string name="pref_default_min_texture_cluster_size">50</string>
<string name="pref_key_block_render">pref_key_block_render</string> <string name="pref_key_block_render">pref_key_block_render</string>
<string name="pref_default_block_render">false</string> <string name="pref_default_block_render">false</string>
<string name="pref_key_opt_depth">pref_key_opt_depth</string> <string name="pref_key_opt_depth">pref_key_opt_depth</string>
@@ -481,6 +483,8 @@
<string name="pref_summary_normal_k">K-nearest neighbors used for normal computation when a mesh is created.</string> <string name="pref_summary_normal_k">K-nearest neighbors used for normal computation when a mesh is created.</string>
<string name="pref_title_max_texture_distance">Max Texture Distance</string> <string name="pref_title_max_texture_distance">Max Texture Distance</string>
<string name="pref_summary_max_texture_distance">Maximum distance from a camera for polygons to be textured by this camera.</string> <string name="pref_summary_max_texture_distance">Maximum distance from a camera for polygons to be textured by this camera.</string>
<string name="pref_title_min_texture_cluster_size">Min Texture Cluster Size</string>
<string name="pref_summary_min_texture_cluster_size">Minimum polygon cluster size to be textured by a camera. This helps to filter sparse textured polygons.</string>
<string name="pref_title_block_render">Block Rendering Thread While Exporting</string> <string name="pref_title_block_render">Block Rendering Thread While Exporting</string>
<string name="pref_summary_block_render">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.</string> <string name="pref_summary_block_render">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.</string>
@@ -543,7 +547,25 @@
<item>"2.5"</item> <item>"2.5"</item>
<item>"2"</item> <item>"2"</item>
</string-array> </string-array>
<string-array name="pref_min_texture_cluster_size_keys">
<item>"Disabled"</item>
<item>"1000"</item>
<item>"500"</item>
<item>"200"</item>
<item>"100"</item>
<item>"50"</item>
<item>"10"</item>
</string-array>
<string-array name="pref_min_texture_cluster_size_values">
<item>"0"</item>
<item>"1000"</item>
<item>"500"</item>
<item>"200"</item>
<item>"100"</item>
<item>"50"</item>
<item>"10"</item>
</string-array>
<string name="pref_title_optimized">Optimized</string> <string name="pref_title_optimized">Optimized</string>
<string name="pref_title_opt_voxel">Voxel Size</string> <string name="pref_title_opt_voxel">Voxel Size</string>
<string name="pref_summary_opt_voxel">Increasing this can reduce reconstruction time at the cost of less geometry precision.</string> <string name="pref_summary_opt_voxel">Increasing this can reduce reconstruction time at the cost of less geometry precision.</string>

View File

@@ -1165,8 +1165,8 @@ public class RTABMapActivity extends Activity implements OnClickListener {
mButtonShareOnSketchfab.setVisibility(View.VISIBLE); mButtonShareOnSketchfab.setVisibility(View.VISIBLE);
mItemSave.setEnabled(mButtonPause.isChecked()); mItemSave.setEnabled(mButtonPause.isChecked());
mItemExport.setEnabled(mButtonPause.isChecked() && !mItemDataRecorderMode.isChecked()); mItemExport.setEnabled(mButtonPause.isChecked() && !mItemDataRecorderMode.isChecked());
mItemOpen.setEnabled(mButtonPause.isChecked() && !mItemDataRecorderMode.isChecked()); mItemOpen.setEnabled(false);
mItemPostProcessing.setEnabled(mButtonPause.isChecked() && !mItemDataRecorderMode.isChecked()); mItemPostProcessing.setEnabled(false);
mItemSettings.setEnabled(true); mItemSettings.setEnabled(true);
mItemReset.setEnabled(true); mItemReset.setEnabled(true);
mItemModes.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 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 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 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 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 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))); 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, meshing,
textureSize, textureSize,
normalK, normalK,
maxTextureDistance,
optimized, optimized,
optimizedVoxelSize, optimizedVoxelSize,
optimizedDepth, optimizedDepth,
@@ -1760,6 +1760,8 @@ public class RTABMapActivity extends Activity implements OnClickListener {
optimizedColorRadius, optimizedColorRadius,
optimizedCleanWhitePolygons, optimizedCleanWhitePolygons,
optimizedColorWhitePolygons, optimizedColorWhitePolygons,
maxTextureDistance,
minTextureClusterSize,
blockRendering); blockRendering);
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {

View File

@@ -94,7 +94,6 @@ public class RTABMapLib
boolean meshing, boolean meshing,
int textureSize, int textureSize,
int normalK, int normalK,
float maxTextureDistance,
boolean optimized, boolean optimized,
float optimizedVoxelSize, float optimizedVoxelSize,
int optimizedDepth, int optimizedDepth,
@@ -102,6 +101,8 @@ public class RTABMapLib
float optimizedColorRadius, float optimizedColorRadius,
boolean optimizedCleanWhitePolygons, boolean optimizedCleanWhitePolygons,
boolean optimizedColorWhitePolygons, boolean optimizedColorWhitePolygons,
float optimizedMaxTextureDistance,
int optimizedMinTextureClusterSize,
boolean blockRendering); boolean blockRendering);
public static native boolean postExportation(boolean visualize); public static native boolean postExportation(boolean visualize);
public static native int postProcessing(int approach); public static native int postProcessing(int approach);

View File

@@ -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_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_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_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_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)); ((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_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_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_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_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)); 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));

View File

@@ -1193,51 +1193,49 @@ pcl::TextureMapping<PointInT>::textureMeshwithMultipleCameras2 (
// filter clusters // filter clusters
int clusterFaces = 0; int clusterFaces = 0;
if(min_cluster_size_>0)
std::vector<pcl::Vertices> polygons(visibleFaces[current_cam].size());
std::vector<int> polygon_to_face_index(visibleFaces[current_cam].size());
oi =0;
for(std::map<int, FaceInfo>::iterator iter=visibleFaces[current_cam].begin(); iter!=visibleFaces[current_cam].end(); ++iter)
{ {
std::vector<pcl::Vertices> polygons(visibleFaces[current_cam].size()); polygons[oi].vertices.resize(3);
std::vector<int> polygon_to_face_index(visibleFaces[current_cam].size()); polygons[oi].vertices[0] = faces[iter->first].vertices[0];
oi =0; polygons[oi].vertices[1] = faces[iter->first].vertices[1];
for(std::map<int, FaceInfo>::iterator iter=visibleFaces[current_cam].begin(); iter!=visibleFaces[current_cam].end(); ++iter) polygons[oi].vertices[2] = faces[iter->first].vertices[2];
{ polygon_to_face_index[oi] = iter->first;
polygons[oi].vertices.resize(3); ++oi;
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<std::set<int> > neighbors; std::vector<std::set<int> > neighbors;
std::vector<std::set<int> > vertexToPolygons; std::vector<std::set<int> > vertexToPolygons;
rtabmap::util3d::createPolygonIndexes(polygons, rtabmap::util3d::createPolygonIndexes(polygons,
(int)camera_cloud->size(), (int)camera_cloud->size(),
neighbors, neighbors,
vertexToPolygons); vertexToPolygons);
std::list<std::list<int> > clusters = rtabmap::util3d::clusterPolygons( std::list<std::list<int> > clusters = rtabmap::util3d::clusterPolygons(
neighbors, neighbors,
min_cluster_size_); min_cluster_size_);
std::set<int> polygonsKept; std::set<int> polygonsKept;
for(std::list<std::list<int> >::iterator iter=clusters.begin(); iter!=clusters.end(); ++iter) for(std::list<std::list<int> >::iterator iter=clusters.begin(); iter!=clusters.end(); ++iter)
{
for(std::list<int>::iterator jter=iter->begin(); jter!=iter->end(); ++jter)
{ {
for(std::list<int>::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<int, FaceInfo>::iterator iter=visibleFaces[current_cam].begin(); iter!=visibleFaces[current_cam].end();) for(std::map<int, FaceInfo>::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;
visibleFaces[current_cam].erase(iter++); }
++clusterFaces; else
} {
else ++iter;
{
++iter;
}
} }
} }