OBJ and PLY loaders extention to support texture coordinates and difused colors #25221
### This PR changes
* Texture coordinates support added to `loadMesh()` and `saveMesh()`
* `loadMesh()` changes its behavior: all vertex attribute arrays (vertex coordinates, colors, normals, texture coordinates) now have the same size and same-index corresponce
- This makes sense for OBJ files where vertex attribute arrays are independent from each other and are randomly accessed when defining faces
- Looks like this behavior may also happen in some PLY files; however, it is not implemented until we encounter such files in a wild nature
- At the same time `loadPointCloud()` keeps its behavior and loads vertex attributes as they are given in the file
* PLY loader supports synonyms for the properties: `diffuse_red`, `diffuse_green` and `diffuse_blue` along with `red`, `green` and `blue`
* `std::vector<cv::Vec3i>` supported as an index array type
* Colors are loaded as [0, 1] floats instead of uchars
- Since colors are usually saved as floats, internal conversion to uchar at loading significantly drops accuracy
- Performing uchar conversion does not always makes sense and can be performed by a user if they needs it
* PLY loading fixed: wrong offset ruined x coordinate
* Python tests added for `loadPointCloud` and `loadMesh`
### Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
C-API cleanup: apps, imgproc_c and some constants #25075
Merge with https://github.com/opencv/opencv_contrib/pull/3642
* Removed obsolete apps - traincascade and createsamples (please use older OpenCV versions if you need them). These apps relied heavily on C-API
* removed all mentions of imgproc C-API headers (imgproc_c.h, types_c.h) - they were empty, included core C-API headers
* replaced usage of several C constants with C++ ones (error codes, norm modes, RNG modes, PCA modes, ...) - most part of this PR (split into two parts - all modules and calib+3d - for easier backporting)
* removed imgproc C-API headers (as separate commit, so that other changes could be backported to 4.x)
Most of these changes can be backported to 4.x.
[GSoC] Update octree methods and create frames for PCC #23985
## PR for GSoC Point Cloud Compression
[Issue for GSoC 2023](https://github.com/opencv/opencv/issues/23624)
* We are **updating the Octree method create() by using OctreeKey**: Through voxelization, directly calculate the leaf nodes that the point cloud belongs to, and omit the judgment whether the point cloud is in the range when inserted. The index of the child node is calculated by bit operation.
* We are also **introducing a new header file pcc.h (Point Cloud Compression) with API framework**.
* We added tests for restoring point clouds from an octree.
* Currently, the features related to octree creation and point cloud compression are part of the internal API, which means they are not directly accessible to users. However, our plan for the future is to **include only the 'PointCloudCompression' class in the 'opencv2/3d.hpp' header file**. This will provide an interface for utilizing the point cloud compression functionality.
The previous PR of this was closed due to repo name conflicts, therefore we resubmitted in this PR.
### Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
Triangle rasterization function #24459#24065 reopened since the previous one was automatically closed after rebase
Connected PR with ground truth data: [#1113@extra](https://github.com/opencv/opencv_extra/pull/1113)
### Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
PLY mesh support #24961
**Warning:** The PR changes exising API.
Fixes#24960
Connected PR: [#1145@extra](https://github.com/opencv/opencv_extra/pull/1145)
### Changes
* Adds faces loading from and saving to PLY files
* Fixes incorrect PLY loading (see issue)
* Adds per-vertex color loading / saving
### Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
finiteMask() and doubles for patchNaNs() #23098
Related to #22826
Connected PR in extra: [#1037@extra](https://github.com/opencv/opencv_extra/pull/1037)
### TODOs:
- [ ] Vectorize `finiteMask()` for 64FC3 and 64FC4
### Changes
This PR:
* adds a new function `finiteMask()`
* extends `patchNaNs()` by CV_64F support
* moves `patchNaNs()` and `finiteMask()` to a separate file
**NOTE:** now the function is called `finiteMask()` as discussed with the OpenCV core team
### Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
* started working on adding 32u, 64u, 64s, bool and 16bf types to OpenCV
* core & imgproc tests seem to pass
* fixed a few compile errors and test failures on macOS x86
* hopefully fixed some compile problems and test failures
* fixed some more warnings and test failures
* trying to fix small deviations in perf_core & perf_imgproc by revering randf_64f to exact version used before
* trying to fix behavior of the new OpenCV with old plugins; there is (quite strong) assumption that video capture would give us frames with depth == CV_8U (0) or CV_16U (2). If depth is > 7 then it means that the plugin is built with the old OpenCV. It needs to be recompiled, of course and then this hack can be removed.
* try to repair the case when target arch does not have FP64 SIMD
* 1. fixed bug in itoa() found by alalek
2. restored ==, !=, > and < univ. intrinsics on ARM32/ARM64.
Merge usac to 5.x #24005
### Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
Base branch is PR #23979. Merging PR #23078, 23900 and PR #23806 to 5.x
GSoC: Modified PLY reader to support color attribute read/write #23805
* Modified PLY reader to support color attribute read/write
* Fix bugs & Modified OBJ reader for color IO
* Replace with correct test file
* Fix I/O of property [w] in OBJ files
### Pull Request Readiness Checklist
**Merged with https://github.com/opencv/opencv_extra/pull/1075**
[Issue for GSoC 2023](https://github.com/opencv/opencv/issues/23624)
The ply loader in 3D module doesn't support color attribute reading. I modified that to support color attribute reading & writing for the color attribute compression as described in proposal.
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
Fixes#22799
Replaces #21559 which was taken as a base
Connected PR in contrib: [#3388@contrib](https://github.com/opencv/opencv_contrib/pull/3388)
### Changes
OK, now this is more Odometry-related PR than Volume-related. Anyway,
* `Volume` class gets wrapped
* The same was done for helper classes like `VolumeSettings`, `OdometryFrame` and `OdometrySettings`
* `OdometryFrame` constructor signature changed to more convenient where depth goes on 1st place, RGB image on 2nd.
This works better for depth-only `Odometry` algorithms.
* `OdometryFrame` is checked for amount of pyramid layers inside `Odometry::compute()`
* `Odometry` was fully wrapped + more docs added
* Added Python tests for `Odometry`, `OdometryFrame` and `Volume`
* Added Python sample for `Volume`
* Minor fixes including better var names
### Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
### Changes
* Duplicated code removal in TSDF tests by implementing them with fixtures and GTest params
* e.g. separate OCL tests file removed
* as a result, more test cases are covered
* the same's done for perf tests
### Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
Corresponding contrib PR: #3382@contrib
Changes
- Volume::raycast(): camera intrinsics can be explicitly passed to the function. If not, the ones from current volume settings are used
- getVolumeDimensions() renamed to getVolumeStrides() because they are strides actually
- TSDF tests: OpenCLStatusRevert and parametrized fixture
- ColorTSDF::integrate(): extra RGB projector is redundant, removed
- Minor changes
This PR contains:
- a new property enableGrowth which controls should the HashTSDF be extended during integration by adding new volume units or not
- a new method getBoundingBox which calculates the size of currently occupied data
- a set of tests to check that new functionality
- a fix for TSDF GPU reset (data is correctly zeroed now using floatToTsdf() function)
minor changes
There's a bug which appears when volume pose contains non-trivial rotation.
It results in wrong depth integration which can be observed during raycasting
or points/normals export.
- This PR fixes the bug for both CPU and OpenCL
- There is a reproducer for the bug
- The copy behavior of VolumeSettings fixed (now copy constructor creates a deep copy)
- Minor changes (e.g. unused vars removed)
Complement PR: #3366@contrib
Changes
OdometryFrame losts its getters: a user can provide data at construction stage only, pyramids and other generated data is read-only now
OdometryFrame is based on UMats: no TMat templates inside, CPU operations are done with UMat::getMat() method, chaining issues are solved ad-hoc
No more Odometry::createOdometryFrame() method, frames are compatible with all odometry algorithms
Normals computer is cached inside Odometry and exposed to API as well as its settings
Volume::raycast() won't return the result in OdometryFrame anymore
Added test for Odometry::prepareFrame*() & other test fixes
Minor code improvements
TODOs:
fix TODOs in code
lower acceptable accuracy errors
RgbdNormals: setMethod() removed as useless
RgbdNormals: tests + cross product, to be fixed
+ cross product
LINEMOD: diffThreshold param added + tests fixed
minor
diffThreshold fix
points3dToDepth16U fix
normals computer diffThreshold fix
random plane generation fixed + diffThreshold fix
Rendered normals test rewritten to GTest Params
random plane generation: scale
RGBD_Normals tests: thresholds tuned
Rendered normals tests: 64F support added
Random planes normal tests rewritten to GTest Params
LINEMOD and CrossProduct fix
SRI threshold raised
NormalsRandomPlanes: thresholds raised
assert on unknown alg; minor
fix
frame size reduced
TIFF replaced by YAML.GZ
depthTo3d test changed
cv::transform is used
fix warning
nanMask()
flipAxes()
absDotPixel() + forgotten code
helper functions removed
RGBDNormals: checkNormals() and compare LINEMOD's pts3d to depth input
Rendered: another criteria; thresholds; LINEMOD's pts3d to depth input comparison
thresholds raised a bit
SRI slightly optimized
assert change
normal tests refactored, parametrized, split
trailing namespace, thresholds raised
SRI caching optimized a lot
normal tests rewritten to fixture, no loop
minor
runCase() joined with testIt()
thresholds were put into GTest params
ternary operator
RgbdNormalsTest merged into NormalsRandomPlanes; RgbdPlanes moved closer to tests
normal test minor refactoring
plane finder tests refactored to GTest Params
skip tests
thresholds raised
plane test minor
plane tests: timers dropped, nPlanes put into GTest Params; refactoring
generated normals tests: minor refactoring
flipAxes() templated
rendered normals tests refactored: thresholds to GTest Params
CV_Error -> ASSERT_FALSE
Add normal estimation and region growing algorithm for point cloud
* Add normal estimation and region growing algorithm for point cloud
* 1.Modified documentation for normal estimation;2.Converted curvature in region growing to absolute values;3.Changed the data type of threshold from float to double;4.Fixed some bugs;
* Finished documentation
* Add tests for normal estimation. Test the normal and curvature of each point in the plane and sphere of the point cloud.
* Fix some warnings caused by to small numbers in test
* Change the test to calculate the average difference instead of comparing each normal and curvature
* Fixed the bugs found by testing
* Redesigned the interface and fixed problems:
1. Make the interface compatible with radius search.
2. Make region growing optionally sortable on results.
3. Modified the region growing interface.
4. Format reference.
5. Removed sphere test.
* Fix warnings
* Remove flann dependency
* Move the flann dependency to the corresponding test
GSoC module to save and load point cloud
* Add functionality to read point cloud data from files
* address issues found on review, add tests for mesh, refactor
* enable fail-safe execution and empty arrays as output
* Some improvements for point cloud io module
Co-authored-by: Julie Bareeva <julia.bareeva@xperience.ai>
Add support for 3D point cloud segmentation, using the USAC framework.
* Modify the RANSAC framework in usac such that RANSAC can be used in 3D point cloud segmentation.
* 1. Add support for 3D point cloud segmentation, using the USAC framework.
2. Add solvers, error estimators for plane model and sphere model.
* Added code samples to the comments of class SACSegmentation.
* 1. Update the segment interface parameters of SACSegmentation.
2. Fix some errors in variable naming.
* Add tests for plane detection.
* 1. Add tests for sphere segmentation.
2. Fix some bugs found by tests.
3. Rename "segmentation" to "sac segmentation".
4. Rename "detect" to "segment".
TODO: Too much duplicate code, the structure of the test needs to be rebuilt.
* 1. Use SIMD acceleration for plane model and sphere model error estimation.
2. Optimize the RansacQualityImpl#getScore function to avoid multiple calls to the error#getError function.
3. Fix a warning in test_sac_segmentation.cpp.
* 1. Fix the warning of ModelConstraintFunction ambiguity.
2. Fix warning: no previous declaration for'void cv::usac::modelParamsToUsacConfig(cv::Ptr<cv::usac::SimpleUsacConfig>&, const cv::Ptr<const cv::usac::Model>& )
* Fix a warning in test_sac_segmentation.cpp about direct comparison of different types of data.
* Add code comments related to the interpretation of model coefficients.
* Update the use of custom model constraint functions.
* Simplified test code structure.
* Update the method of checking plane models.
* Delete test for cylinder.
* Add some comments about UniversalRANSAC.
* 1. The RANSAC paper in the code comments is referenced using the bibtex format.
2. The sample code in the code comments is replaced using @snippet.
3. Change the public API class SACSegmentation to interface.
4. Clean up the old useless code.
* fix warning(no previous declaration) in 3d_sac_segmentation.cpp.
* Fix compilation errors caused by 3d_sac_segmentation.cpp.
* Move the function sacModelMinimumSampleSize() from ptcloud.hpp to sac_segmentation.cpp.
* 1. Change the interface for setting the number of threads to the interface for setting whether to be parallel.
2. Move interface implementation code in ptcloud_utils.hpp to ptcloud_utils.cpp.
* SACSegmentation no longer inherits Algorithm.
* Add the constructor and destructor of SACSegmentation.
* 1. For the declaration of the common API, the prefix and suffix of the parameter names no longer contain underscores.
2. Rename the function _getMatFromInputArray -> getPointsMatFromInputArray.
3. Change part of CV_CheckDepth to CV_CheckDepthEQ.
4. Remove the doxygen flag from the source code.
5. Update the loop termination condition of SIMD in the point cloud section of 3D module.
* fix warning: passing 'bool' chooses 'int' over 'size_t {aka unsigned int}' .
* fix warning: passing 'bool' chooses 'int' over 'size_t {aka unsigned int}' .
New odometry Pipeline
* first intergation
* tests run, but not pass
* add previous version of sigma calc
* add minor comment
* strange fixes
* fix fast ICP
* test changes; fast icp still not work correctly
* finaly, it works
* algtype fix
* change affine comparison
* boolean return
* fix bug with angle and cos
* test pass correctly
* fix for kinfu pipeline
* add compute points normals
* update for new odometry
* change odometry_evaluation
* odometry_evaluation works
* change debug logs
* minor changes
* change depth setting in odometryFrame
* fastICP works with 4num points
* all odometries work with 4mun points
* odometry full works on 4num points and normals
* replace ICP with DEPTH; comments replacements
* create prepareFrame; add docs for Odometry
* change getPyramids()
* delete extra code
* add intrinsics; but dont works
* bugfix with nan checking
* add gpu impl
* change createOdometryFrame func
* remove old fastICP code
* comments fix
* add comments
* minor fixes
* other minor fixes
* add channels assert
* add impl for odometry settings
* add pimpl to odometry
* linux warning fix
* linux warning fix 1
* linux warning fix 2
* linux error fix
* linux warning fix 3
* linux warning fix 4
* linux error fix 2
* fix test warnings
* python build fix
* doxygen fix
* docs fix
* change normal tests for 4channel point
* all Normal tests pass
* plane works
* add warp frame body
* minor fix
* warning fixes
* try to fix
* try to fix 1
* review fix
* lvls fix
* createOdometryFrame fix
* add comment
* const reference
* OPENCV_3D_ prefix
* const methods
* OdometryFramePyramidType ifx
* add assert
* precomp moved upper
* delete types_c
* add assert for get and set functions
* minor fixes
* remove core.hpp from header
* ocl_run add
* warning fix
* delete extra comment
* minor fix
* setDepth fix
* delete underscore
* odometry settings fix
* show debug image fix
* build error fix
* other minor fix
* add const to signatures
* fix
* conflict fix
* getter fix
Add 3D point cloud sampling functions to branch next
* Add several 3D point cloud sampling functions: Random, VoxelGrid, FarthestPoint.
* Made some code detail changes and exposed the random number generator parameters at the interface.
* Add simple tests for sampling.
* Modify interface output parameters.
* Modify interface return value.
* The sampling test is modified for the new changes of function interface.
* Improved test of VoxelGridFilterSampling
* Improved test of VoxelGridFilterSampling and FPS.
* Add test for the dist_lower_limit arguments of FPS function.
* Optimization function _getMatFromInputArray.
* Optimize the code style and some details according to the suggestions.
* Clear prefix cv: in the source code.
* Change the initialization of Mat in the sampling test.
* 1. Unified code style
2. Optimize randomSampling method
* 1. Optimize code comments.
2. Remove unused local variables.
* Rebuild the structure of the test, make the test case more reliable, and change the code style.
* Update test_sampling.cpp
Fix a warning.