mirror of
https://github.com/opencv/opencv.git
synced 2026-07-25 21:33:04 +04:00
0d88e1933a
[GSOC] Added Visual Odometry (VO) for SLAM
425 lines
22 KiB
C++
425 lines
22 KiB
C++
// This file is part of OpenCV project.
|
|
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
|
// of this distribution and at http://opencv.org/license.html
|
|
|
|
#ifndef POINT_CLOUD_MODULE_HPP
|
|
#define POINT_CLOUD_MODULE_HPP
|
|
|
|
#include "opencv2/core.hpp"
|
|
#include "opencv2/ptcloud/depth.hpp"
|
|
#include "opencv2/ptcloud/volume.hpp"
|
|
#include "opencv2/ptcloud/odometry.hpp"
|
|
#include "opencv2/ptcloud/odometry_frame.hpp"
|
|
#include "opencv2/ptcloud/odometry_settings.hpp"
|
|
#include "opencv2/ptcloud/slam.hpp"
|
|
|
|
/**
|
|
@defgroup ptcloud Point Cloud Processing
|
|
|
|
Point-cloud and mesh processing: reading/writing point clouds and meshes,
|
|
triangle rasterization, octree partitioning, and RGB-D / volumetric 3D
|
|
reconstruction (odometry, TSDF volumes).
|
|
|
|
@{
|
|
@defgroup ptcloud_rgbd RGB-D and Volumetric Reconstruction
|
|
@}
|
|
*/
|
|
|
|
//! @addtogroup ptcloud
|
|
//! @{
|
|
|
|
namespace cv {
|
|
|
|
/** @brief Loads a point cloud from a file.
|
|
*
|
|
* The function loads point cloud from the specified file and returns it.
|
|
* If the cloud cannot be read, throws an error.
|
|
* Vertex coordinates, normals and colors are returned as they are saved in the file
|
|
* even if these arrays have different sizes and their elements do not correspond to each other
|
|
* (which is typical for OBJ files for example)
|
|
*
|
|
* Currently, the following file formats are supported:
|
|
* - [Wavefront obj file *.obj](https://en.wikipedia.org/wiki/Wavefront_.obj_file)
|
|
* - [Polygon File Format *.ply](https://en.wikipedia.org/wiki/PLY_(file_format))
|
|
*
|
|
* @param filename Name of the file
|
|
* @param vertices vertex coordinates, each value contains 3 floats
|
|
* @param normals per-vertex normals, each value contains 3 floats
|
|
* @param rgb per-vertex colors, each value contains 3 floats
|
|
*/
|
|
CV_EXPORTS_W void loadPointCloud(const String &filename, OutputArray vertices, OutputArray normals = noArray(), OutputArray rgb = noArray());
|
|
|
|
/** @brief Saves a point cloud to a specified file.
|
|
*
|
|
* The function saves point cloud to the specified file.
|
|
* File format is chosen based on the filename extension.
|
|
*
|
|
* @param filename Name of the file
|
|
* @param vertices vertex coordinates, each value contains 3 floats
|
|
* @param normals per-vertex normals, each value contains 3 floats
|
|
* @param rgb per-vertex colors, each value contains 3 floats
|
|
*/
|
|
CV_EXPORTS_W void savePointCloud(const String &filename, InputArray vertices, InputArray normals = noArray(), InputArray rgb = noArray());
|
|
|
|
/** @brief Loads a mesh from a file.
|
|
*
|
|
* The function loads mesh from the specified file and returns it.
|
|
* If the mesh cannot be read, throws an error
|
|
* Vertex attributes (i.e. space and texture coodinates, normals and colors) are returned in same-sized
|
|
* arrays with corresponding elements having the same indices.
|
|
* This means that if a face uses a vertex with a normal or a texture coordinate with different indices
|
|
* (which is typical for OBJ files for example), this vertex will be duplicated for each face it uses.
|
|
*
|
|
* Currently, the following file formats are supported:
|
|
* - [Wavefront obj file *.obj](https://en.wikipedia.org/wiki/Wavefront_.obj_file) (ONLY TRIANGULATED FACES)
|
|
* - [Polygon File Format *.ply](https://en.wikipedia.org/wiki/PLY_(file_format))
|
|
* @param filename Name of the file
|
|
* @param vertices vertex coordinates, each value contains 3 floats
|
|
* @param indices per-face list of vertices, each value is a vector of ints
|
|
* @param normals per-vertex normals, each value contains 3 floats
|
|
* @param colors per-vertex colors, each value contains 3 floats
|
|
* @param texCoords per-vertex texture coordinates, each value contains 2 or 3 floats
|
|
*/
|
|
CV_EXPORTS_W void loadMesh(const String &filename, OutputArray vertices, OutputArrayOfArrays indices,
|
|
OutputArray normals = noArray(), OutputArray colors = noArray(),
|
|
OutputArray texCoords = noArray());
|
|
|
|
/** @brief Saves a mesh to a specified file.
|
|
*
|
|
* The function saves mesh to the specified file.
|
|
* File format is chosen based on the filename extension.
|
|
*
|
|
* @param filename Name of the file.
|
|
* @param vertices vertex coordinates, each value contains 3 floats
|
|
* @param indices per-face list of vertices, each value is a vector of ints
|
|
* @param normals per-vertex normals, each value contains 3 floats
|
|
* @param colors per-vertex colors, each value contains 3 floats
|
|
* @param texCoords per-vertex texture coordinates, each value contains 2 or 3 floats
|
|
*/
|
|
CV_EXPORTS_W void saveMesh(const String &filename, InputArray vertices, InputArrayOfArrays indices,
|
|
InputArray normals = noArray(), InputArray colors = noArray(), InputArray texCoords = noArray());
|
|
|
|
|
|
//! Triangle fill settings
|
|
enum TriangleShadingType
|
|
{
|
|
RASTERIZE_SHADING_WHITE = 0, //!< a white color is used for the whole triangle
|
|
RASTERIZE_SHADING_FLAT = 1, //!< a color of 1st vertex of each triangle is used
|
|
RASTERIZE_SHADING_SHADED = 2 //!< a color is interpolated between 3 vertices with perspective correction
|
|
};
|
|
|
|
//! Face culling settings: what faces are drawn after face culling
|
|
enum TriangleCullingMode
|
|
{
|
|
RASTERIZE_CULLING_NONE = 0, //!< all faces are drawn, no culling is actually performed
|
|
RASTERIZE_CULLING_CW = 1, //!< triangles which vertices are given in clockwork order are drawn
|
|
RASTERIZE_CULLING_CCW = 2 //!< triangles which vertices are given in counterclockwork order are drawn
|
|
};
|
|
|
|
//! GL compatibility settings
|
|
enum TriangleGlCompatibleMode
|
|
{
|
|
RASTERIZE_COMPAT_DISABLED = 0, //!< Color and depth have their natural values and converted to internal formats if needed
|
|
RASTERIZE_COMPAT_INVDEPTH = 1 //!< Color is natural, Depth is transformed from [-zNear; -zFar] to [0; 1]
|
|
//!< by the following formula: \f$ \frac{z_{far} \left(z + z_{near}\right)}{z \left(z_{far} - z_{near}\right)} \f$ \n
|
|
//!< In this mode the input/output depthBuf is considered to be in this format,
|
|
//!< therefore it's faster since there're no conversions performed
|
|
};
|
|
|
|
/**
|
|
* @brief Structure to keep settings for rasterization
|
|
*/
|
|
struct CV_EXPORTS_W_SIMPLE TriangleRasterizeSettings
|
|
{
|
|
TriangleRasterizeSettings();
|
|
|
|
CV_WRAP TriangleRasterizeSettings& setShadingType(TriangleShadingType st) { shadingType = st; return *this; }
|
|
CV_WRAP TriangleRasterizeSettings& setCullingMode(TriangleCullingMode cm) { cullingMode = cm; return *this; }
|
|
CV_WRAP TriangleRasterizeSettings& setGlCompatibleMode(TriangleGlCompatibleMode gm) { glCompatibleMode = gm; return *this; }
|
|
|
|
TriangleShadingType shadingType;
|
|
TriangleCullingMode cullingMode;
|
|
TriangleGlCompatibleMode glCompatibleMode;
|
|
};
|
|
|
|
|
|
/** @brief Renders a set of triangles on a depth and color image
|
|
*
|
|
* Triangles can be drawn white (1.0, 1.0, 1.0), flat-shaded or with a color interpolation between vertices.
|
|
* In flat-shaded mode the 1st vertex color of each triangle is used to fill the whole triangle.
|
|
*
|
|
* The world2cam is an inverted camera pose matrix in fact. It transforms vertices from world to
|
|
* camera coordinate system.
|
|
*
|
|
* The camera coordinate system emulates the OpenGL's coordinate system having coordinate origin in a screen center,
|
|
* X axis pointing right, Y axis pointing up and Z axis pointing towards the viewer
|
|
* except that image is vertically flipped after the render.
|
|
* This means that all visible objects are placed in z-negative area, or exactly in -zNear > z > -zFar since
|
|
* zNear and zFar are positive.
|
|
* For example, at fovY = PI/2 the point (0, 1, -1) will be projected to (width/2, 0) screen point,
|
|
* (1, 0, -1) to (width/2 + height/2, height/2). Increasing fovY makes projection smaller and vice versa.
|
|
*
|
|
* The function does not create or clear output images before the rendering. This means that it can be used
|
|
* for drawing over an existing image or for rendering a model into a 3D scene using pre-filled Z-buffer.
|
|
*
|
|
* Empty scene results in a depth buffer filled by the maximum value since every pixel is infinitely far from the camera.
|
|
* Therefore, before rendering anything from scratch the depthBuf should be filled by zFar values (or by ones in INVDEPTH mode).
|
|
*
|
|
* There are special versions of this function named triangleRasterizeDepth and triangleRasterizeColor
|
|
* for cases if a user needs a color image or a depth image alone; they may run slightly faster.
|
|
*
|
|
* @param vertices vertices coordinates array. Should contain values of CV_32FC3 type or a compatible one (e.g. cv::Vec3f, etc.)
|
|
* @param indices triangle vertices index array, 3 per triangle. Each index indicates a vertex in a vertices array.
|
|
* Should contain CV_32SC3 values or compatible
|
|
* @param colors per-vertex colors of CV_32FC3 type or compatible. Can be empty or the same size as vertices array.
|
|
* If the values are out of [0; 1] range, the result correctness is not guaranteed
|
|
* @param colorBuf an array representing the final rendered image. Should containt CV_32FC3 values and be the same size as depthBuf.
|
|
* Not cleared before rendering, i.e. the content is reused as there is some pre-rendered scene.
|
|
* @param depthBuf an array of floats containing resulting Z buffer. Should contain float values and be the same size as colorBuf.
|
|
* Not cleared before rendering, i.e. the content is reused as there is some pre-rendered scene.
|
|
* Empty scene corresponds to all values set to zFar (or to 1.0 in INVDEPTH mode)
|
|
* @param world2cam a 4x3 or 4x4 float or double matrix containing inverted (sic!) camera pose
|
|
* @param fovY field of view in vertical direction, given in radians
|
|
* @param zNear minimum Z value to render, everything closer is clipped
|
|
* @param zFar maximum Z value to render, everything farther is clipped
|
|
* @param settings see TriangleRasterizeSettings. By default the smooth shading is on,
|
|
* with CW culling and with disabled GL compatibility
|
|
*/
|
|
CV_EXPORTS_W void triangleRasterize(InputArray vertices, InputArray indices, InputArray colors,
|
|
InputOutputArray colorBuf, InputOutputArray depthBuf,
|
|
InputArray world2cam, double fovY, double zNear, double zFar,
|
|
const TriangleRasterizeSettings& settings = TriangleRasterizeSettings());
|
|
|
|
/** @brief Overloaded version of triangleRasterize() with depth-only rendering
|
|
*
|
|
* @param vertices vertices coordinates array. Should contain values of CV_32FC3 type or a compatible one (e.g. cv::Vec3f, etc.)
|
|
* @param indices triangle vertices index array, 3 per triangle. Each index indicates a vertex in a vertices array.
|
|
* Should contain CV_32SC3 values or compatible
|
|
* @param depthBuf an array of floats containing resulting Z buffer. Should contain float values and be the same size as colorBuf.
|
|
* Not cleared before rendering, i.e. the content is reused as there is some pre-rendered scene.
|
|
* Empty scene corresponds to all values set to zFar (or to 1.0 in INVDEPTH mode)
|
|
* @param world2cam a 4x3 or 4x4 float or double matrix containing inverted (sic!) camera pose
|
|
* @param fovY field of view in vertical direction, given in radians
|
|
* @param zNear minimum Z value to render, everything closer is clipped
|
|
* @param zFar maximum Z value to render, everything farther is clipped
|
|
* @param settings see TriangleRasterizeSettings. By default the smooth shading is on,
|
|
* with CW culling and with disabled GL compatibility
|
|
*/
|
|
CV_EXPORTS_W void triangleRasterizeDepth(InputArray vertices, InputArray indices, InputOutputArray depthBuf,
|
|
InputArray world2cam, double fovY, double zNear, double zFar,
|
|
const TriangleRasterizeSettings& settings = TriangleRasterizeSettings());
|
|
|
|
/** @brief Overloaded version of triangleRasterize() with color-only rendering
|
|
*
|
|
* @param vertices vertices coordinates array. Should contain values of CV_32FC3 type or a compatible one (e.g. cv::Vec3f, etc.)
|
|
* @param indices triangle vertices index array, 3 per triangle. Each index indicates a vertex in a vertices array.
|
|
* Should contain CV_32SC3 values or compatible
|
|
* @param colors per-vertex colors of CV_32FC3 type or compatible. Can be empty or the same size as vertices array.
|
|
* If the values are out of [0; 1] range, the result correctness is not guaranteed
|
|
* @param colorBuf an array representing the final rendered image. Should containt CV_32FC3 values and be the same size as depthBuf.
|
|
* Not cleared before rendering, i.e. the content is reused as there is some pre-rendered scene.
|
|
* @param world2cam a 4x3 or 4x4 float or double matrix containing inverted (sic!) camera pose
|
|
* @param fovY field of view in vertical direction, given in radians
|
|
* @param zNear minimum Z value to render, everything closer is clipped
|
|
* @param zFar maximum Z value to render, everything farther is clipped
|
|
* @param settings see TriangleRasterizeSettings. By default the smooth shading is on,
|
|
* with CW culling and with disabled GL compatibility
|
|
*/
|
|
CV_EXPORTS_W void triangleRasterizeColor(InputArray vertices, InputArray indices, InputArray colors, InputOutputArray colorBuf,
|
|
InputArray world2cam, double fovY, double zNear, double zFar,
|
|
const TriangleRasterizeSettings& settings = TriangleRasterizeSettings());
|
|
|
|
/** @brief Octree for 3D vision.
|
|
*
|
|
* In 3D vision filed, the Octree is used to process and accelerate the pointcloud data. The class Octree represents
|
|
* the Octree data structure. Each Octree will have a fixed depth. The depth of Octree refers to the distance from
|
|
* the root node to the leaf node.All OctreeNodes will not exceed this depth.Increasing the depth will increase
|
|
* the amount of calculation exponentially. And the small number of depth refers low resolution of Octree.
|
|
* Each node contains 8 children, which are used to divide the space cube into eight parts. Each octree node represents
|
|
* a cube. And these eight children will have a fixed order, the order is described as follows:
|
|
*
|
|
* For illustration, assume,
|
|
*
|
|
* rootNode: origin == (0, 0, 0), size == 2
|
|
*
|
|
* Then,
|
|
*
|
|
* children[0]: origin == (0, 0, 0), size == 1
|
|
*
|
|
* children[1]: origin == (1, 0, 0), size == 1, along X-axis next to child 0
|
|
*
|
|
* children[2]: origin == (0, 1, 0), size == 1, along Y-axis next to child 0
|
|
*
|
|
* children[3]: origin == (1, 1, 0), size == 1, in X-Y plane
|
|
*
|
|
* children[4]: origin == (0, 0, 1), size == 1, along Z-axis next to child 0
|
|
*
|
|
* children[5]: origin == (1, 0, 1), size == 1, in X-Z plane
|
|
*
|
|
* children[6]: origin == (0, 1, 1), size == 1, in Y-Z plane
|
|
*
|
|
* children[7]: origin == (1, 1, 1), size == 1, furthest from child 0
|
|
*/
|
|
|
|
class CV_EXPORTS_W Octree
|
|
{
|
|
public:
|
|
//! Default constructor.
|
|
Octree();
|
|
|
|
/** @overload
|
|
* @brief Creates an empty Octree with given maximum depth
|
|
*
|
|
* @param maxDepth The max depth of the Octree
|
|
* @param size bounding box size for the Octree
|
|
* @param origin Initial center coordinate
|
|
* @param withColors Whether to keep per-point colors or not
|
|
* @return resulting Octree
|
|
*/
|
|
CV_WRAP static Ptr<Octree> createWithDepth(int maxDepth, double size, const Point3f& origin = { }, bool withColors = false);
|
|
|
|
/** @overload
|
|
* @brief Create an Octree from the PointCloud data with the specific maxDepth
|
|
*
|
|
* @param maxDepth Max depth of the octree
|
|
* @param pointCloud point cloud data, should be 3-channel float array
|
|
* @param colors color attribute of point cloud in the same 3-channel float format
|
|
* @return resulting Octree
|
|
*/
|
|
CV_WRAP static Ptr<Octree> createWithDepth(int maxDepth, InputArray pointCloud, InputArray colors = noArray());
|
|
|
|
/** @overload
|
|
* @brief Creates an empty Octree with given resolution
|
|
*
|
|
* @param resolution The size of the octree leaf node
|
|
* @param size bounding box size for the Octree
|
|
* @param origin Initial center coordinate
|
|
* @param withColors Whether to keep per-point colors or not
|
|
* @return resulting Octree
|
|
*/
|
|
CV_WRAP static Ptr<Octree> createWithResolution(double resolution, double size, const Point3f& origin = { }, bool withColors = false);
|
|
|
|
/** @overload
|
|
* @brief Create an Octree from the PointCloud data with the specific resolution
|
|
*
|
|
* @param resolution The size of the octree leaf node
|
|
* @param pointCloud point cloud data, should be 3-channel float array
|
|
* @param colors color attribute of point cloud in the same 3-channel float format
|
|
* @return resulting octree
|
|
*/
|
|
CV_WRAP static Ptr<Octree> createWithResolution(double resolution, InputArray pointCloud, InputArray colors = noArray());
|
|
|
|
//! Default destructor
|
|
~Octree();
|
|
|
|
/** @overload
|
|
* @brief Insert a point data with color to a OctreeNode.
|
|
*
|
|
* @param point The point data in Point3f format.
|
|
* @param color The color attribute of point in Point3f format.
|
|
* @return Returns whether the insertion is successful.
|
|
*/
|
|
CV_WRAP bool insertPoint(const Point3f& point, const Point3f& color = { });
|
|
|
|
/** @brief Determine whether the point is within the space range of the specific cube.
|
|
*
|
|
* @param point The point coordinates.
|
|
* @return If point is in bound, return ture. Otherwise, false.
|
|
*/
|
|
CV_WRAP bool isPointInBound(const Point3f& point) const;
|
|
|
|
//! returns true if the rootnode is NULL.
|
|
CV_WRAP bool empty() const;
|
|
|
|
/** @brief Reset all octree parameter.
|
|
*
|
|
* Clear all the nodes of the octree and initialize the parameters.
|
|
*/
|
|
CV_WRAP void clear();
|
|
|
|
/** @brief Delete a given point from the Octree.
|
|
*
|
|
* Delete the corresponding element from the pointList in the corresponding leaf node. If the leaf node
|
|
* does not contain other points after deletion, this node will be deleted. In the same way,
|
|
* its parent node may also be deleted if its last child is deleted.
|
|
* @param point The point coordinates, comparison is epsilon-based
|
|
* @return return ture if the point is deleted successfully.
|
|
*/
|
|
CV_WRAP bool deletePoint(const Point3f& point);
|
|
|
|
/** @brief restore point cloud data from Octree.
|
|
*
|
|
* Restore the point cloud data from existing octree. The points in same leaf node will be seen as the same point.
|
|
* This point is the center of the leaf node. If the resolution is small, it will work as a downSampling function.
|
|
* @param restoredPointCloud The output point cloud data, can be replaced by noArray() if not needed
|
|
* @param restoredColor The color attribute of point cloud data, can be omitted if not needed
|
|
*/
|
|
CV_WRAP void getPointCloudByOctree(OutputArray restoredPointCloud, OutputArray restoredColor = noArray());
|
|
|
|
/** @brief Radius Nearest Neighbor Search in Octree.
|
|
*
|
|
* Search all points that are less than or equal to radius.
|
|
* And return the number of searched points.
|
|
* @param query Query point.
|
|
* @param radius Retrieved radius value.
|
|
* @param points Point output. Contains searched points in 3-float format, and output vector is not in order,
|
|
* can be replaced by noArray() if not needed
|
|
* @param squareDists Dist output. Contains searched squared distance in floats, and output vector is not in order,
|
|
* can be omitted if not needed
|
|
* @return the number of searched points.
|
|
*/
|
|
CV_WRAP int radiusNNSearch(const Point3f& query, float radius, OutputArray points, OutputArray squareDists = noArray()) const;
|
|
|
|
/** @overload
|
|
* @brief Radius Nearest Neighbor Search in Octree.
|
|
*
|
|
* Search all points that are less than or equal to radius.
|
|
* And return the number of searched points.
|
|
* @param query Query point.
|
|
* @param radius Retrieved radius value.
|
|
* @param points Point output. Contains searched points in 3-float format, and output vector is not in order,
|
|
* can be replaced by noArray() if not needed
|
|
* @param colors Color output. Contains colors corresponding to points in pointSet, can be replaced by noArray() if not needed
|
|
* @param squareDists Dist output. Contains searched squared distance in floats, and output vector is not in order,
|
|
* can be replaced by noArray() if not needed
|
|
* @return the number of searched points.
|
|
*/
|
|
CV_WRAP int radiusNNSearch(const Point3f& query, float radius, OutputArray points, OutputArray colors, OutputArray squareDists) const;
|
|
|
|
/** @brief K Nearest Neighbor Search in Octree.
|
|
*
|
|
* Find the K nearest neighbors to the query point.
|
|
* @param query Query point.
|
|
* @param K amount of nearest neighbors to find
|
|
* @param points Point output. Contains K points in 3-float format, arranged in order of distance from near to far,
|
|
* can be replaced by noArray() if not needed
|
|
* @param squareDists Dist output. Contains K squared distance in floats, arranged in order of distance from near to far,
|
|
* can be omitted if not needed
|
|
*/
|
|
CV_WRAP void KNNSearch(const Point3f& query, const int K, OutputArray points, OutputArray squareDists = noArray()) const;
|
|
|
|
/** @overload
|
|
* @brief K Nearest Neighbor Search in Octree.
|
|
*
|
|
* Find the K nearest neighbors to the query point.
|
|
* @param query Query point.
|
|
* @param K amount of nearest neighbors to find
|
|
* @param points Point output. Contains K points in 3-float format, arranged in order of distance from near to far,
|
|
* can be replaced by noArray() if not needed
|
|
* @param colors Color output. Contains colors corresponding to points in pointSet, can be replaced by noArray() if not needed
|
|
* @param squareDists Dist output. Contains K squared distance in floats, arranged in order of distance from near to far,
|
|
* can be replaced by noArray() if not needed
|
|
*/
|
|
CV_WRAP void KNNSearch(const Point3f& query, const int K, OutputArray points, OutputArray colors, OutputArray squareDists) const;
|
|
|
|
protected:
|
|
struct Impl;
|
|
Ptr<Impl> p;
|
|
};
|
|
|
|
} // namespace cv
|
|
|
|
//! @} ptcloud
|
|
|
|
#endif
|