This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Olena, a generic and efficient image processing platform".
The branch next has been updated
via 71c9c144f233770f1b9652ba98d6137053e8ab47 (commit)
from 0d502d0cf9f3571471768db4f3833b0701ef39a0 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
No new revisions were added by this update.
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 6 ++++++
lrde-upload.sh | 2 +-
2 files changed, 7 insertions(+), 1 deletions(-)
hooks/post-receive
--
Olena, a generic and efficient image processing platform
* apps/mesh-segm-skel/mesh-segm.cc: Catch up with the new
interface of graphs.
Use mln::edge_image instead of mln::line_graph_image.
Turn a test into an invariant.
Use mln::morpho::watershed::flooding instead of
mln::morpho::meyer_wst.
* apps/mesh-segm-skel/Makefile.am (bin_PROGRAMS):
Re-enable mesg-segm.
(mesh_segm_SOURCES, mesh_segm_CPPFLAGS)
(mesh_segm_LDFLAGS, mesh_segm_LDADD):
Re-enable.
(TESTS): Reenable test-mesh-segm.
(MOSTLYCLEANFILES): Reenable socket-segm.off and teapot-segm.off.
---
milena/ChangeLog | 18 +++++
milena/apps/mesh-segm-skel/Makefile.am | 28 +++++----
milena/apps/mesh-segm-skel/mesh-segm.cc | 110 +++++++++++++++++++------------
3 files changed, 103 insertions(+), 53 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 2d28537..b2f2330 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,21 @@
+2010-05-11 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Revive, fix and update application mesh-segm.
+
+ * apps/mesh-segm-skel/mesh-segm.cc: Catch up with the new
+ interface of graphs.
+ Use mln::edge_image instead of mln::line_graph_image.
+ Turn a test into an invariant.
+ Use mln::morpho::watershed::flooding instead of
+ mln::morpho::meyer_wst.
+ * apps/mesh-segm-skel/Makefile.am (bin_PROGRAMS):
+ Re-enable mesg-segm.
+ (mesh_segm_SOURCES, mesh_segm_CPPFLAGS)
+ (mesh_segm_LDFLAGS, mesh_segm_LDADD):
+ Re-enable.
+ (TESTS): Reenable test-mesh-segm.
+ (MOSTLYCLEANFILES): Reenable socket-segm.off and teapot-segm.off.
+
2010-05-10 Roland Levillain <roland(a)lrde.epita.fr>
Fix a bug in the reimplementation of Trimesh algorithms.
diff --git a/milena/apps/mesh-segm-skel/Makefile.am b/milena/apps/mesh-segm-skel/Makefile.am
index 9768f25..501dec0 100644
--- a/milena/apps/mesh-segm-skel/Makefile.am
+++ b/milena/apps/mesh-segm-skel/Makefile.am
@@ -1,4 +1,5 @@
-# Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE).
+# Copyright (C) 2008, 2009, 2010 EPITA Research and Development
+# Laboratory (LRDE).
#
# This file is part of Olena.
#
@@ -49,19 +50,22 @@ MOSTLYCLEANFILES =
## ------------------------------------------------ ##
if ENABLE_TRIMESH
-# bin_PROGRAMS += mesh-segm mesh-skel
-#
-# mesh_segm_SOURCES = mesh-segm.cc io.hh
-# mesh_segm_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_trimesh)
-# mesh_segm_LDFLAGS = $(LDFLAGS_trimesh)
-# mesh_segm_LDADD = $(LDADD_trimesh)
-#
-# TESTS += test-mesh-segm
-# MOSTLYCLEANFILES += socket-segm.off teapot-segm.off
-
-# FIXME: mesh_skel is unfinished. Anyway, it should be superseded by
-# another program, using no Trimesh code.
-
+## FIXME: Rename as mesh-trimesh-graph-{max,pinv}-curv-segm?
+bin_PROGRAMS += mesh-segm
+mesh_segm_SOURCES = mesh-segm.cc io.hh
+mesh_segm_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_trimesh)
+mesh_segm_LDFLAGS = $(LDFLAGS_trimesh)
+mesh_segm_LDADD = $(LDADD_trimesh)
+
+TESTS += test-mesh-segm
+# FIXME: Likewise.
+MOSTLYCLEANFILES += socket-segm.off teapot-segm.off
+
+# FIXME: mesh_skel is unfinished. Anyway, it has been be superseded
+# by `mesh-complex-skel' (see below), using no Trimesh code.
+
+## FIXME: Rename as mesh-trimesh-graph-{max,pinv}-curv-skel?
+# bin_PROGRAMS += mesh-skel
# mesh_skel_SOURCES = mesh-skel.cc io.hh
# mesh_skel_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_trimesh)
# mesh_skel_LDFLAGS = $(LDFLAGS_trimesh)
diff --git a/milena/apps/mesh-segm-skel/mesh-segm.cc b/milena/apps/mesh-segm-skel/mesh-segm.cc
index bf87249..06ddc93 100644
--- a/milena/apps/mesh-segm-skel/mesh-segm.cc
+++ b/milena/apps/mesh-segm-skel/mesh-segm.cc
@@ -1,4 +1,5 @@
-// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2008, 2009, 2010 EPITA Research and Development
+// Laboratory (LRDE)
//
// This file is part of the Milena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
@@ -40,14 +41,18 @@
#include <TriMesh.h>
#include <mln/core/alias/point3d.hh>
-#include <mln/core/alias/point3d.hh>
+
+#include <mln/fun/i2v/array.hh>
+#include <mln/convert/from_to.hh>
#include <mln/util/graph.hh>
-#include <mln/core/image/line_graph_image.hh>
-#include <mln/core/image/line_graph_elt_neighborhood.hh>
+#include <mln/util/line_graph.hh>
+#include <mln/util/site_pair.hh>
+#include <mln/core/image/edge_image.hh>
+#include <mln/make/edge_image.hh>
#include <mln/morpho/closing/area.hh>
-#include <mln/morpho/meyer_wst.hh>
+#include <mln/morpho/watershed/flooding.hh>
#include "io.hh"
@@ -116,12 +121,9 @@ int main(int argc, char* argv[])
std::vector<curv_t> vertex_values (mesh.faces.size(), 0.f);
std::vector<curv_t> edge_values;
- /* FIXME: We don't have the required site type yet. Simulate with a
- dummy type (point3d). */
- mln::util::graph<mln::point3d> g;
+ mln::util::graph g;
// Populate the graph with vertices.
- for (unsigned i = 0; i < mesh.faces.size(); ++i)
- g.add_vertex (mln::point3d(i, i, i));
+ g.add_vertices(mesh.faces.size());
// Populate the graph with edges.
mesh.need_across_edge();
@@ -132,25 +134,26 @@ int main(int argc, char* argv[])
if (f_adj != -1)
{
// Add an edge into the graph.
- if (g.add_edge(f, f_adj) != mln_max(mln::util::edge_id::equiv))
- {
- // Find the edge (i.e., the two vertices) common to faces
- // F and F_ADJ.
- /* FIXME: We lack a proper interface from the TriMesh
- structure to do this elegantly. */
- std::vector<int> adj_vertices;
- adj_vertices.reserve(2);
- for (unsigned i = 0; i < 3; ++i)
- for (unsigned j = 0; j < 3; ++j)
- if (mesh.faces[f][i] == mesh.faces[f_adj][j])
- adj_vertices.push_back(mesh.faces[f][i]);
- mln_assertion(adj_vertices.size() == 2);
-
- // Compute the mean curvature on the edge.
- edge_values.push_back((vertex_h_inv[adj_vertices[0]] +
- vertex_h_inv[adj_vertices[1]])
- / 2);
- }
+ mln::util::edge_id_t new_edge = g.add_edge(f, f_adj);
+ mln_invariant(new_edge.is_valid());
+
+ /* Among the edges adjacent to F and F_ADJ, find the one
+ they share. In practice, find the two vertices shared
+ by F and F_ADJ. */
+ /* FIXME: We lack a proper interface from the TriMesh
+ structure to do this elegantly. */
+ std::vector<int> adj_vertices;
+ adj_vertices.reserve(2);
+ for (unsigned i = 0; i < 3; ++i)
+ for (unsigned j = 0; j < 3; ++j)
+ if (mesh.faces[f][i] == mesh.faces[f_adj][j])
+ adj_vertices.push_back(mesh.faces[f][i]);
+ mln_assertion(adj_vertices.size() == 2);
+
+ // Compute the mean curvature on the edge.
+ edge_values.push_back((vertex_h_inv[adj_vertices[0]] +
+ vertex_h_inv[adj_vertices[1]])
+ / 2);
// Check the consistency of the two arrays.
mln_assertion(g.edges().size() == edge_values.size());
@@ -161,19 +164,38 @@ int main(int argc, char* argv[])
| Line graph image. |
`-------------------*/
- mln::p_line_graph<mln::point3d> plg(g);
+ // Points associated to the line graph vertices (edges in the graph).
+ typedef mln::util::site_pair<mln::point3df> P;
+ typedef mln::fun::i2v::array<P> fsite_t;
+ fsite_t sites(g.e_nmax());
+ for (unsigned i = 0; i < g.e_nmax(); ++i)
+ /* FIXME: Add a dummy location information for the moment. This
+ doesn't really matter as we won't use it to produce the output.
+ However, we may need it later: do not forget to add relevant
+ locations (obtained from the mesh) in a future version of this
+ program. */
+ sites(i) = P(mln::point3df(0, 0, 0), mln::point3df(1, 1, 1));
+
+ // FIXME: This intermediate structure costs us a copy.
+ typedef mln::fun::i2v::array<curv_t> values_t;
+ values_t values;
+ mln::convert::from_to(edge_values, values);
+
+ typedef mln::edge_image<P, curv_t, mln::util::graph> ima_t;
+ ima_t graph_ima(g, sites, values);
- typedef mln::line_graph_image<mln::point3d, curv_t> ima_t;
- ima_t lg_ima(plg, vertex_values, edge_values);
/*-----------------.
| Simplification. |
`-----------------*/
- typedef mln::line_graph_elt_neighborhood<mln::point3d> nbh_t;
+ typedef ima_t::nbh_t nbh_t;
nbh_t nbh;
- ima_t closed_lg_ima = mln::morpho::closing::area(lg_ima, nbh, lambda);
+ // ``Area'' is not a proper term here, since it is defined to the
+ // number of edges in the graph. Taking into account the actual
+ // area of triangles would be a more clever choice.
+ ima_t closed_graph_ima = mln::morpho::closing::area(graph_ima, nbh, lambda);
/*------.
| WST. |
@@ -181,24 +203,30 @@ int main(int argc, char* argv[])
typedef unsigned wst_val_t;
wst_val_t nbasins;
- typedef mln::line_graph_image<mln::point3d, wst_val_t> wst_ima_t;
- wst_ima_t wshed = mln::morpho::meyer_wst(closed_lg_ima, nbh, nbasins);
+ typedef mln_ch_value_(ima_t, wst_val_t) wst_ima_t;
+ wst_ima_t wshed =
+ mln::morpho::watershed::flooding(closed_graph_ima, nbh, nbasins);
std::cout << "nbasins = " << nbasins << std::endl;
/*------------------------------------------.
| Label graph vertices (i.e., mesh faces). |
`------------------------------------------*/
- /* FIXME: We should be using wshed.vertex_values_ if
- mln::line_graph_image were fully functional... */
- std::vector<unsigned> vertex_label(wshed.domain().nvertices(), 0);
+ // FIXME: Use a vertex_image and a e2v neighborhood instead?
+
+ /* FIXME: p_edges does not provide nvertices(), so we cannot write
+
+ std::vector<unsigned> vertex_label(wshed.domain().nvertices(), 0);
+
+ Likewise, p_vertices does not provide n_edges(). */
+ std::vector<unsigned> vertex_label(wshed.domain().graph().v_nmax(), 0);
mln_piter_(wst_ima_t) pw(wshed.domain());
for_all(pw)
if (wshed(pw) != 0)
{
mln_psite_(wst_ima_t) pp(pw);
- vertex_label[pp.first_id().to_equiv()] = wshed(pw);
- vertex_label[pp.second_id().to_equiv()] = wshed(pw);
+ vertex_label[pp.v1().id()] = wshed(pw);
+ vertex_label[pp.v2().id()] = wshed(pw);
}
/*---------.
--
1.5.6.5
* apps/mesh-segm-skel/trimesh/misc.hh (mln::geom::mesh_curvature):
Always call algebra::ldlt_decomp, even when NDEBUG is defined.
Typo.
Avoid a warning about an undefined variable when NDEBUG is not
defined.
---
milena/ChangeLog | 10 ++++++++++
milena/apps/mesh-segm-skel/trimesh/misc.hh | 15 +++++++++------
2 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index f1c1386..2d28537 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,13 @@
+2010-05-10 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix a bug in the reimplementation of Trimesh algorithms.
+
+ * apps/mesh-segm-skel/trimesh/misc.hh (mln::geom::mesh_curvature):
+ Always call algebra::ldlt_decomp, even when NDEBUG is defined.
+ Typo.
+ Avoid a warning about an undefined variable when NDEBUG is not
+ defined.
+
2010-05-04 Roland Levillain <roland(a)lrde.epita.fr>
Improve topo::skeleton::breadth_first_thinning.
diff --git a/milena/apps/mesh-segm-skel/trimesh/misc.hh b/milena/apps/mesh-segm-skel/trimesh/misc.hh
index 5084632..79eea14 100644
--- a/milena/apps/mesh-segm-skel/trimesh/misc.hh
+++ b/milena/apps/mesh-segm-skel/trimesh/misc.hh
@@ -1,5 +1,5 @@
-// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory
-// (LRDE)
+// Copyright (C) 2008, 2009, 2010 EPITA Research and Development
+// Laboratory (LRDE)
//
// This file is part of the Milena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
@@ -623,10 +623,13 @@ namespace mln
// Least squares solution.
vec3f diag;
-#ifndef NDEBUG
- bool ldlt_decomp_sucess_p = algebra::ldlt_decomp(w, diag);
-#endif // ! NDEBUG
- mln_assertion(ldlt_decomp_sucess_p);
+ // Note that algebra::ldlt_decomp has side effects on its
+ // arguments; this call is not ``just an assertion''.
+ bool ldlt_decomp_success_p = algebra::ldlt_decomp(w, diag);
+ mln_assertion(ldlt_decomp_success_p);
+ // Avoid a warning about an undefined variable when NDEBUG
+ // is not defined.
+ (void) ldlt_decomp_success_p;
algebra::ldlt_solve(w, diag, m, m);
// Push it back out to the vertices
--
1.5.6.5