A lightweight 3D Morphable Face Model library in modern C++
This release contains quite a few major updates, alongside some smaller "maintenance" updates.
glm::project()
, perspective()
and ortho()
using Eigen (see eos/render/matrix_projection.hpp).GLM_FORCE_UNRESTRICTED_GENTYPE
. Eigen and Ceres work much nicer together. Many improvements, and most cost functions were renamed - check the commit message in d101ca546118ae8736920915c6ac0dead448161f for more details. Also reworked PriorCost
and renamed it to NormCost
(e79da919a14b2449acbf8eff57572238e205ed95), and updated fit-model-ceres.fitting::concat
to contour_correspondence.hpp
(1029f96f8bd8fa66b55ad1f73962b14aa3fc0f85)add_definitions()
for Boost (1de80682ad38f0e5784302e3089b52b6aca5ff39), and used CMake targets whenever available (e.g. Ceres::ceres
).The documentation website is updated to v1.4.0.
The updated release is available on PyPI, with wheels for Python 3.9, 3.10 and 3.11 on Windows (x64), and source installation for other platforms.
Note: It is very likely that the next release will require the C++17 standard, and will no longer compile in C++14 mode.
This is a minor maintenance release, but with one important change, warranting the version push to 1.3.0 to not catch anyone off guard: The Eigen version in 3rdparty/
is updated from 3.3.4 to the latest 3.4.0.
Full release notes:
3rdparty/
is updated from 3.3.4 to 3.4.0. The submodule now also uses the official Eigen gitlab.com URL.CITATION.cff
file to make it easier to correctly cite eos__repr__
methods of some Python bindings a bit (9b8b3509e609be026f56d98073c2cb6699c55978)ExpressionModelType
None
with none
in Python to avoid clashing with Python's keyword None
(85d09d255da4d57817e0263a06aec0626ed38fed)eos::core::Mesh
's Python bindings to make it more convenient to create a Mesh
object (b2f24a12123b0e2409c139cc5d991e3b2a326454)Note: It is quite likely that support for C++14 will be dropped in one of the future releases, and a C++17 compliant compiler will become the minimum requirement to use eos.
This is a follow-up update pushing the python bindings to PyPI:
Updated pybind11 to their latest master commit, and changed the Visual Studio CMake generator for the Python bindings from VS 2017 to VS 2019 (75ecca4ac84dce5a1a5113704f7f8714060663da).
eos/@patrikhuber is now part of GitHub Sponsors. If you are finding eos valuable, there is now the possibility of becoming a sponsor.
See the v1.2.0 release notes for all the changes and improvements in this release!
The updated release is available on PyPI.
This release updates the renderer and texture extraction, with full support for perspective projection (along with orthographic projection), and contains various other smaller improvements and fixes.
New / major improvements:
v2::extract_texture(...)
to support texture coordinates with seams (63243b2)v2::extract_texture(...)
to the eos::render
namespace and made it the new default (08cba28). Calling code needs to be adjusted slightly, but the function's parameters are very similar. This new texture extraction uses the Rasterizer
of the new renderer, and supports both orthographic and perspective projection.extract_texture(...)
function, which only supported affine cameras (8fd1735)SoftwareRenderer::render(...)
to correctly deal with texture maps with seams (c1defba)render(...)
function, moved v2::SoftwareRenderer
to the render
namespace, and added a convenience function for the new renderer that can be called (almost) like the old renderer (12a4120) - calling code needs slight adjustments. The core of the new renderer is the same, but the architecture has been changed to mirror more closely the hardware (or OpenGL) pipeline, with vertex- and fragment shaders. Results should be exactly the same, and they have the same parameters.
(0.5, 0.5, 0.5)
, in the new renderer, they will have default colour black (bd01644). In any case, it does not make sense to try and render a mesh without vertex colours or texture.enum class
ProjectionType
, which specifies whether orthographic or perspective projection should be used.Fixes:
Image
python bindings to account for row-major Image
class (dc0fce8). (The Image
class was changed to row-major in a commit a while ago, but the python bindings were never updated to accommodate this.)mpark::variant
to their latest master (bd590bf). This should fix a few compile errors with certain compilers when compiling eos in C++14 mode.Minor improvements/changes:
v2::extract_texture(...)
to not crash when the projected model is partially outside the image (442497e)clear_buffers()
function to SoftwareRenderer
and Rasterizer
to clear the colour- and depth buffers (1e8a875)project(...)
function to PcaModel
(4694d6f) (see #295 for a potential issue)render/draw_utils.hpp
to render/opencv/
(914fdd5)draw_wireframe(...)
function that doesn't need OpenCV (7303b39) and added python binding for it (f1f83d0)<filename>.isomap.png
output of the example apps to <filename>.texture.png
(174a2c2)Removed:
render::detail::interpolate_black_line(...)
(it was only needed for #4, which was fixed, and also it was for the old texture extraction) (35abed8)estimate_affine_camera(...)
. See the commit message, for people that were still using this. (507eb77)render_affine(...)
, this was used in the old texture extraction and is no longer needed (aee7984).This is a minor update that slightly improves the internals of loading .scm
models from CVSSP from the University of Surrey, and also adds load_scm_model(...)
to the Python bindings, so these models can be loaded directly in Python.
Changes/improvements:
eos/morphablemodel/io/cvssp.hpp
, and clarified the documentation slightly [dd4cd62d4724f4368916875d1303f03e98f2f0fb and following]utils/scm-to-cereal
being the only one) can now be built without OpenCV [d465a042a860283ba3f11ce15683bf186a607273]load_scm_model(...)
to the Python bindings (in the namespace eos.morphablemodel.load_scm_model(...)
) [b82b85244d5e5ed55a257d0483d21bcfcef4c9c6]The updated release is also available on PyPI.
This release mainly fixes the write_obj(...)
and write_textured_obj(...)
functions to now also write out the texture triangle indices (tti), when they're present in a mesh. Previously for meshes who used a different set of texture triangle indices, this could cause weird artefacts on the top of the head because the tti were not written to the obj. [c25319769f3d103293d62c857a1b330631c90e5f]
Other small changes/improvements:
write_obj(...)
and write_textured_obj(...)
into a separate header, eos/core/write_obj.hpp
, so that including Mesh.hpp
doesn't result in transitively including <fstream>
and <string>
[a040c0ed73b6df426fdfedb7fa7804e28514a879]EOS_
in the eos::core
namespace to reduce possible name collisions [4381fd16b994c4533e9af2fe6cc1f63b5adea48a]write_obj(...)
now also inverts the y axis of the uv coords, to be consistent with write_textured_obj(...)
[7ce291825a916190aedf790b465ec68dcf49373f]setup.py
now checks for CMake 3.10.0 on Windows [3dd69f7727167345f135421a918f2e1ec7c6b5b7]This release contains an important fix for models that have separate texture_triangle_indices
, like e.g. the 4DFM.
It also contains a number of other minor improvements and an updated documentation.
Fixes:
texture_triangle_indices
is now correctly passed along to sample_to_mesh(...)
in all MorphableModel
member functions (e598203ddf8ec370cc86b6ab3e1ea8045f6fb705). Previously, get_mean
and the draw_sample
functions (except for the one that takes shape, colour and expression coefficients) would have returned a mesh without the texture triangle indices (if the MorphableModel
contained them).
This might actually have been causing wrong code to be run or some bad memory access to - the assert that checks for that in sample_to_mesh(...)
is not triggered in Release and RelWithDebInfo builds, therefore we haven't caught this for a while.
Now we always handle models correctly that contain texture triangle indices, like the 4DFM.Minor improvements & changes:
v1.1.0
Mesh::tti
to the Python bindings (afc80dfb4bdd3160c867e6327be0ec3818da1fb0)eos/render/normals.hpp
header (5b6cd230ffac75c8139bb1e74be8d888eb830004)include/eos/render/utils.hpp
to transforms.hpp
MorphableModels
with odd versions (41fddf6d732df07c5077139b74235b995f7edf4f)ray_triangle_intersect(...)
to its own header (5b574092d562e8628b95edbf4af83a2f8049b5e9)Image
visualiser for Image Watch: Set channel type to RGB(A) for 3 and 4 channel images (622fc35a0e6fd22938237e834c1511c7a749bbf4)In-progress changes:
These are in-progress changes on new rendering/texture extraction stuff in the render::v2
namespace - these work in principle but are not too thoroughly tested or used in eos yet.
v2::extract_texture(...)
and updated all affected code (23d07554a014d7ce1a1fcafe13e4173074175512)v2::SoftwareRenderer
and related code to compile with the latest eos changes and without OpenCVSmall maintenance release with updated Python bindings, fixed demo.py
script (updated to work with the latest eos changes), and fixed BFM2009/2017 converter scripts.
See the release notes from v1.0.0 for the latest changes!
The API and functionality of eos have been quite stable for a while now and proven themselves robust and useful. This release mainly constitutes the exciting bump to v1.0!
One major recent addition is support for the 4D Face Model, 4DFM, a full-head 3D morphable face model with 36 expressions/action units, from 4dface.io.
The update also includes the most recent version of pybind11, and addition of sample_to_mesh()
to the Python bindings.
Other recent changes & improvements include supporting uv coordinates with seams, support for landmark/vertex definitions in the MorphableModel
class to give certain vertices a fixed semantic meaning, and lots of other things. See the release notes from v0.17.0 and v0.18.0 for more details.
This release adds support for texture maps with seams. When a texture map contains seams, the vertices at the seams are usually duplicated, and then some of the triangle indices are different in uv space from the triangulation of the 3D vertices. This change allows to support the texture coordinates of the full-head 4D Face Model (4DFM).
MorphableModel
file format version was increased to 4
to store an additional member containing the uv triangulation (85cc563afe7e1916fa98d577c5b036cb622c8806)extract_texture
to support uv coordinates with seams (a70ded3d3c7644b54fd97878183d7b5c46323624)Other minor changes:
Please also have a look at the changes in v0.17.0.