Releases: patrikhuber/eos
v1.5.0
This release contains only a few very minor convenience code updates, and the CI move to GitHub Actions.
This will be the last release to support C++14. The next release will require a C++17 compiler.
Summarised changes:
- Added vcpkg.json to use dependencies from vcpkg for local development
- Updated CI: switched from Appveyor & Travis to GitHub Actions. Using vcpkg caching on CI.
- Added a .yml that builds the Python bindings using cibuildwheel (#361, thank you @omar-h-omar!)
- Adding more fitting python bindings (#354) fbb0763 (by @omar-h-omar)
- Updated pybind11 to 2.13.6 (support for Python 3.12), toml11 to 3.8.1, and Cereal (latest master)
- Improved
LandmarkMapper
support for hybrid mappings: There is now aget_vertex_index()
function inLandmarkMapper.hpp
that should be used for both use cases and works with both direct (landmark-id to vertex-index in the mappings .txt file) and indirect (landmark-id to generic-landmark-name in the mappings .txt file, generic-landmark-name to vertex-index aslandmark_definitions
inside aMorphableModel
(e.g. the 4DFM uses this)). (61ccbcb, 165d17c) - Added
get_shape_at_point()
for neutral shape only models and for PCA expression models (3445b1c, 3276019) - Minor
#include
& build fixes/updates
Thanks to the new cibuildwheel
CI, there are now Python wheels for Windows, Linux and macOS, and for various Python versions, on PyPI: https://pypi.org/project/eos-py/1.5.0/#files
v1.4.0
This release contains quite a few major updates, alongside some smaller "maintenance" updates.
- Removed the use of the GLM library completely, and now using Eigen types throughout. (E.g. 413c9f9, 7e99ab1, a23ee0b, 096b68e, and other commits). This simplified a lot of code. Rewrote
glm::project()
,perspective()
andortho()
using Eigen (see eos/render/matrix_projection.hpp). - Rewrote the nonlinear Ceres fitting using Eigen. This means no more messing around with
GLM_FORCE_UNRESTRICTED_GENTYPE
. Eigen and Ceres work much nicer together. Many improvements, and most cost functions were renamed - check the commit message in d101ca5 for more details. Also reworkedPriorCost
and renamed it toNormCost
(e79da91), and updated fit-model-ceres. - Now doing a proper conversion between quaternions (or rotation matrices) and Euler angles that makes sense (1023e4b, a23ee0b)
- Added the necessary Python bindings so that the fitting loop can now be written and customised in Python (#347) (Thank you @omar-h-omar)
- Updated eigen3-nnls, nanoflann, toml11 and pybind11 submodules to their latest version. Especially toml11 had a big update, and the updated pybind11 supports Python 3.11.
- Minor change, but may break downstream code: Moved
fitting::concat
tocontour_correspondence.hpp
(1029f96) - Modernised CMake scripts a bit. Removed
add_definitions()
for Boost (1de8068), 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.
v1.3.0
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:
- Eigen version in
3rdparty/
is updated from 3.3.4 to 3.4.0. The submodule now also uses the official Eigen gitlab.com URL. - Added a script to load the Liverpool-York Head Model (LYHM) (1153e77)
- Added a
CITATION.cff
file to make it easier to correctly cite eos - Updated the
__repr__
methods of some Python bindings a bit (9b8b350) - Replaced
ExpressionModelType
None
withnone
in Python to avoid clashing with Python's keywordNone
(85d09d2) - Added a constructor to
eos::core::Mesh
's Python bindings to make it more convenient to create aMesh
object (b2f24a1) - Updated pybind11 to 2.9.1
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.
v1.2.1
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 (75ecca4).
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.
v1.2.0
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:
- Improved
v2::extract_texture(...)
to support texture coordinates with seams (63243b2) - Moved
v2::extract_texture(...)
to theeos::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 theRasterizer
of the new renderer, and supports both orthographic and perspective projection. - Removed the old
extract_texture(...)
function, which only supported affine cameras (8fd1735) - Improved
SoftwareRenderer::render(...)
to correctly deal with texture maps with seams (c1defba) - Removed the old
render(...)
function, movedv2::SoftwareRenderer
to therender
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.- Note: Whereas previously, meshes without vertex colour would be rendered with the colour
(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.
- Note: Whereas previously, meshes without vertex colour would be rendered with the colour
- Added vertex visibility check function that supports both orthographic and perspective projection (0db88d3). Introduced an
enum class
ProjectionType
, which specifies whether orthographic or perspective projection should be used.
Fixes:
- Changed strides in
Image
python bindings to account for row-majorImage
class (dc0fce8). (TheImage
class was changed to row-major in a commit a while ago, but the python bindings were never updated to accommodate this.) - Updated
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:
- Improved
v2::extract_texture(...)
to not crash when the projected model is partially outside the image (442497e) - Added
clear_buffers()
function toSoftwareRenderer
andRasterizer
to clear the colour- and depth buffers (1e8a875) - Set the colourbuffer's clear color to fully transparent (fc1465e)
- Added
project(...)
function toPcaModel
(4694d6f) (see #295 for a potential issue) - Moved
render/draw_utils.hpp
torender/opencv/
(914fdd5) - Added new
draw_wireframe(...)
function that doesn't need OpenCV (7303b39) and added python binding for it (f1f83d0) - Renamed "isomap" to "texturemap" throughout, and the
<filename>.isomap.png
output of the example apps to<filename>.texture.png
(174a2c2) - Various other minor improvements.
Removed:
- 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) - Removed
estimate_affine_camera(...)
. See the commit message, for people that were still using this. (507eb77) - Removed
render_affine(...)
, this was used in the old texture extraction and is no longer needed (aee7984).
v1.1.2
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:
- Removed the OpenCV dependency of
eos/morphablemodel/io/cvssp.hpp
, and clarified the documentation slightly [dd4cd62 and following] - Subsequently, the utils (with
utils/scm-to-cereal
being the only one) can now be built without OpenCV [d465a04] - Added
load_scm_model(...)
to the Python bindings (in the namespaceeos.morphablemodel.load_scm_model(...)
) [b82b852]
The updated release is also available on PyPI.
v1.1.1
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. [c253197]
Other small changes/improvements:
- Moved
write_obj(...)
andwrite_textured_obj(...)
into a separate header,eos/core/write_obj.hpp
, so that includingMesh.hpp
doesn't result in transitively including<fstream>
and<string>
[a040c0e] - Prefixed all header guards with
EOS_
in theeos::core
namespace to reduce possible name collisions [4381fd1] write_obj(...)
now also inverts the y axis of the uv coords, to be consistent withwrite_textured_obj(...)
[7ce2918]setup.py
now checks for CMake 3.10.0 on Windows [3dd69f7]
v1.1.0
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 tosample_to_mesh(...)
in allMorphableModel
member functions (e598203). Previously,get_mean
and thedraw_sample
functions (except for the one that takes shape, colour and expression coefficients) would have returned a mesh without the texture triangle indices (if theMorphableModel
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 insample_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:
- The documentation at http://patrikhuber.github.io/eos/doc/ is now updated to eos
v1.1.0
- Added
Mesh::tti
to the Python bindings (afc80df) - Moved mesh normal computation functions to
eos/render/normals.hpp
header (5b6cd23) - Added functions to compute face and vertex normals of a mesh (7af6131)
- Renamed
include/eos/render/utils.hpp
totransforms.hpp
- Improve error messaging when loading
MorphableModels
with odd versions (41fddf6) - Moved
ray_triangle_intersect(...)
to its own header (5b57409) - Added simple image resize function (ae53398)
- Improved the natvis
Image
visualiser for Image Watch: Set channel type to RGB(A) for 3 and 4 channel images (622fc35)
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.
- Uncommented
v2::extract_texture(...)
and updated all affected code (23d0755) - Updated
v2::SoftwareRenderer
and related code to compile with the latest eos changes and without OpenCV
v1.0.1
v1.0.0
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.