Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.8 KiB
78 lines
2.8 KiB
// 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 OPENCV_3D_PTCLOUD_UTILS_HPP |
|
#define OPENCV_3D_PTCLOUD_UTILS_HPP |
|
|
|
namespace cv { |
|
|
|
/** |
|
* @brief Get cv::Mat with Nx3 or 3xN type CV_32FC1 from cv::InputArray. |
|
* |
|
* @param input_pts Point cloud xyz data. |
|
* @param[out] mat Point cloud xyz data in cv::Mat with Nx3 or 3xN type CV_32FC1. |
|
* @param arrangement_of_points The arrangement of point data in the matrix, |
|
* 0 by row (Nx3, [x1, y1, z1, ..., xn, yn, zn]), |
|
* 1 by column (3xN, [x1, ..., xn, y1, ..., yn, z1, ..., zn]). |
|
* @param clone_data Flag to specify whether data cloning is mandatory. |
|
* |
|
* @note The following cases will clone data even if flag clone_data is false: |
|
* 1. Data is discontinuous in memory |
|
* 2. Data type is not float |
|
* 3. The original arrangement of data is not the same as the expected new arrangement. |
|
* For example, transforming from |
|
* Nx3(x1, y1, z1, ..., xn, yn, zn) to 3xN(x1, ..., xn, y1, ..., yn, z1, ..., zn) |
|
* |
|
*/ |
|
inline void _getMatFromInputArray(InputArray input_pts, Mat &mat, |
|
int arrangement_of_points = 1, bool clone_data = false) |
|
{ |
|
CV_Check(input_pts.dims(), input_pts.dims() < 3, |
|
"Only support data with dimension less than 3."); |
|
|
|
// Guaranteed data can construct N×3 point clouds |
|
int rows = input_pts.rows(), cols = input_pts.cols(), channels = input_pts.channels(); |
|
size_t total = rows * cols * channels; |
|
CV_Check(total, total % 3 == 0, |
|
"total = input_pts.rows() * input_pts.cols() * input_pts.channels() must be an integer multiple of 3"); |
|
|
|
/** |
|
Layout of point cloud data in memory space. |
|
arrangement 0 : x1, y1, z1, ..., xn, yn, zn |
|
For example, the input is std::vector<Point3d>, or std::vector<int>, |
|
or cv::Mat with type N×1 CV_32FC3 |
|
arrangement 1 : x1, ..., xn, y1, ..., yn, z1, ..., zn |
|
For example, the input is cv::Mat with type 3×N CV_32FC1 |
|
*/ |
|
int ori_arrangement = (channels == 1 && rows == 3 && cols != 3) ? 1 : 0; |
|
|
|
// Convert to single channel without copying the data. |
|
mat = ori_arrangement == 0 ? input_pts.getMat().reshape(1, (int) (total / 3)) |
|
: input_pts.getMat(); |
|
|
|
if (ori_arrangement != arrangement_of_points) |
|
{ |
|
Mat tmp; |
|
transpose(mat, tmp); |
|
swap(mat, tmp); |
|
} |
|
|
|
if (mat.type() != CV_32F) |
|
{ |
|
Mat tmp; |
|
mat.convertTo(tmp, CV_32F); // Use float to store data |
|
swap(mat, tmp); |
|
} |
|
|
|
if (clone_data || (!mat.isContinuous())) |
|
{ |
|
mat = mat.clone(); |
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
#endif //OPENCV_3D_PTCLOUD_UTILS_HPP
|
|
|