From d3dd8594592ad4e79378240142efb5cb50e6c2e8 Mon Sep 17 00:00:00 2001 From: edgarriba Date: Fri, 8 Jan 2016 19:41:16 +0100 Subject: [PATCH] add io submodule for import scenes --- .../sfm/doc/pics/import_sagrada_familia.png | Bin 0 -> 92709 bytes modules/sfm/include/opencv2/sfm.hpp | 2 + modules/sfm/include/opencv2/sfm/io.hpp | 88 ++++++++ modules/sfm/samples/import_reconstruction.cpp | 80 ++++++++ modules/sfm/src/io.cpp | 92 +++++++++ modules/sfm/src/io/io_bundler.h | 189 ++++++++++++++++++ .../sfm_import_reconstruction.markdown | 28 +++ .../sfm_trajectory_estimation.markdown | 2 +- .../tutorials/table_of_content_sfm.markdown | 10 +- 9 files changed, 489 insertions(+), 2 deletions(-) create mode 100644 modules/sfm/doc/pics/import_sagrada_familia.png create mode 100644 modules/sfm/include/opencv2/sfm/io.hpp create mode 100644 modules/sfm/samples/import_reconstruction.cpp create mode 100644 modules/sfm/src/io.cpp create mode 100644 modules/sfm/src/io/io_bundler.h create mode 100644 modules/sfm/tutorials/sfm_import_reconstruction/sfm_import_reconstruction.markdown diff --git a/modules/sfm/doc/pics/import_sagrada_familia.png b/modules/sfm/doc/pics/import_sagrada_familia.png new file mode 100644 index 0000000000000000000000000000000000000000..05661190808f5339cc07d675a6ca71b91e2094a1 GIT binary patch literal 92709 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 T$S8}Uzlw`5wm>QA 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 Y!Fjf_(esU{_3tD>FEw6NKDP}0KmOQyeE #include +#include #include #include #include @@ -77,6 +78,7 @@ This module has been originally developed as a project for Google Summer of Code @{ @defgroup conditioning Conditioning @defgroup fundamental Fundamental + @defgroup io Input/Output @defgroup numeric Numeric @defgroup projection Projection @defgroup robust Robust Estimation diff --git a/modules/sfm/include/opencv2/sfm/io.hpp b/modules/sfm/include/opencv2/sfm/io.hpp new file mode 100644 index 000000000..dc01a2518 --- /dev/null +++ b/modules/sfm/include/opencv2/sfm/io.hpp @@ -0,0 +1,88 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// + // + // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. + // + // By downloading, copying, installing or using the software you agree to this license. + // If you do not agree to this license, do not download, install, + // copy or use the software. + // + // + // License Agreement + // For Open Source Computer Vision Library + // + // Copyright (C) 2015, OpenCV Foundation, all rights reserved. + // Third party copyrights are property of their respective owners. + // + // Redistribution and use in source and binary forms, with or without modification, + // are permitted provided that the following conditions are met: + // + // * Redistribution's of source code must retain the above copyright notice, + // this list of conditions and the following disclaimer. + // + // * Redistribution's in binary form must reproduce the above copyright notice, + // this list of conditions and the following disclaimer in the documentation + // and/or other materials provided with the distribution. + // + // * The name of the copyright holders may not be used to endorse or promote products + // derived from this software without specific prior written permission. + // + // This software is provided by the copyright holders and contributors "as is" and + // any express or implied warranties, including, but not limited to, the implied + // warranties of merchantability and fitness for a particular purpose are disclaimed. + // In no event shall the Intel Corporation or contributors be liable for any direct, + // indirect, incidental, special, exemplary, or consequential damages + // (including, but not limited to, procurement of substitute goods or services; + // loss of use, data, or profits; or business interruption) however caused + // and on any theory of liability, whether in contract, strict liability, + // or tort (including negligence or otherwise) arising in any way out of + // the use of this software, even if advised of the possibility of such damage. + // + //M*/ + +#ifndef __OPENCV_SFM_IO_HPP__ +#define __OPENCV_SFM_IO_HPP__ + +#include + +namespace cv +{ +namespace sfm +{ + +//! @addtogroup io +//! @{ + +/** @brief Different supported file formats. + */ +enum { + SFM_IO_BUNDLER = 0, + SFM_IO_VISUALSFM = 1, + SFM_IO_OPENSFM = 2, + SFM_IO_OPENMVG = 3, + SFM_IO_THEIASFM = 4 +}; + +/** @brief Import a reconstruction file. + @param file The path to the file. + @param Rs Output vector of 3x3 rotations of the camera + @param Ts Output vector of 3x1 translations of the camera. + @param Ks Output vector of 3x3 instrinsics of the camera. + @param points3d Output array with 3d points. Is 3 x N. + @param file_format The format of the file to import. + + The function supports reconstructions from Bundler. +*/ +CV_EXPORTS_W +void +importReconstruction(const cv::String &file, OutputArrayOfArrays Rs, + OutputArrayOfArrays Ts, OutputArrayOfArrays Ks, + OutputArray points3d, int file_format = SFM_IO_BUNDLER); + +//! @} sfm + +} /* namespace sfm */ +} /* namespace cv */ + +#endif + +/* End of file. */ diff --git a/modules/sfm/samples/import_reconstruction.cpp b/modules/sfm/samples/import_reconstruction.cpp new file mode 100644 index 000000000..4c31e4e68 --- /dev/null +++ b/modules/sfm/samples/import_reconstruction.cpp @@ -0,0 +1,80 @@ +#include +#include + +#include + +using namespace std; +using namespace cv; +using namespace cv::sfm; + +static void help() { + cout + << "\n---------------------------------------------------------------------------\n" + << " This program shows how to import a reconstructed scene in the \n" + << " OpenCV Structure From Motion (SFM) module.\n" + << " Usage:\n" + << " example_sfm_import_reconstruction \n" + << " where: file_path is the absolute path file into your system which contains\n" + << " the reconstructed scene. \n" + << "---------------------------------------------------------------------------\n\n" + << endl; +} + + +int main(int argc, char* argv[]) +{ + /// Read input parameters + + if ( argc != 2 ) { + help(); + exit(0); + } + + /// Immport a reconstructed scene + + vector Rs, Ts, Ks, points3d; + importReconstruction(argv[1], Rs, Ts, Ks, points3d, SFM_IO_BUNDLER); + + + /// Create 3D windows + + viz::Viz3d window("Coordinate Frame"); + window.setWindowSize(Size(500,500)); + window.setWindowPosition(Point(150,150)); + window.setBackgroundColor(); // black by default + + + /// Create the pointcloud + + vector point_cloud; + for (int i = 0; i < points3d.size(); ++i){ + point_cloud.push_back(Vec3f(points3d[i])); + } + + + /// Recovering cameras + + vector path; + for (size_t i = 0; i < Rs.size(); ++i) + path.push_back(Affine3d(Rs[i], Ts[i])); + + + /// Create and show widgets + + viz::WCloud cloud_widget(point_cloud, viz::Color::green()); + viz::WTrajectory trajectory(path, viz::WTrajectory::FRAMES, 0.5); + viz::WTrajectoryFrustums frustums(path, Vec2f(0.889484, 0.523599), 0.5, + viz::Color::yellow()); + + window.showWidget("point_cloud", cloud_widget); + window.showWidget("cameras", trajectory); + window.showWidget("frustums", frustums); + + + /// Wait for key 'q' to close the window + cout << endl << "Press 'q' to close each windows ... " << endl; + + window.spin(); + + return 0; +} \ No newline at end of file diff --git a/modules/sfm/src/io.cpp b/modules/sfm/src/io.cpp new file mode 100644 index 000000000..8e4255bab --- /dev/null +++ b/modules/sfm/src/io.cpp @@ -0,0 +1,92 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// + // + // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. + // + // By downloading, copying, installing or using the software you agree to this license. + // If you do not agree to this license, do not download, install, + // copy or use the software. + // + // + // License Agreement + // For Open Source Computer Vision Library + // + // Copyright (C) 2015, OpenCV Foundation, all rights reserved. + // Third party copyrights are property of their respective owners. + // + // Redistribution and use in source and binary forms, with or without modification, + // are permitted provided that the following conditions are met: + // + // * Redistribution's of source code must retain the above copyright notice, + // this list of conditions and the following disclaimer. + // + // * Redistribution's in binary form must reproduce the above copyright notice, + // this list of conditions and the following disclaimer in the documentation + // and/or other materials provided with the distribution. + // + // * The name of the copyright holders may not be used to endorse or promote products + // derived from this software without specific prior written permission. + // + // This software is provided by the copyright holders and contributors "as is" and + // any express or implied warranties, including, but not limited to, the implied + // warranties of merchantability and fitness for a particular purpose are disclaimed. + // In no event shall the Intel Corporation or contributors be liable for any direct, + // indirect, incidental, special, exemplary, or consequential damages + // (including, but not limited to, procurement of substitute goods or services; + // loss of use, data, or profits; or business interruption) however caused + // and on any theory of liability, whether in contract, strict liability, + // or tort (including negligence or otherwise) arising in any way out of + // the use of this software, even if advised of the possibility of such damage. + // + //M*/ + +#include +#include "io/io_bundler.h" + +namespace cv +{ +namespace sfm +{ + +void +importReconstruction(const cv::String &file, OutputArrayOfArrays _Rs, + OutputArrayOfArrays _Ts, OutputArrayOfArrays _Ks, + OutputArray _points3d, int file_format) { + + std::vector Rs, Ks; + std::vector Ts, points3d; + + if (file_format == SFM_IO_BUNDLER) { + readBundlerFile(file, Rs, Ts, Ks, points3d); + } else if (file_format == SFM_IO_VISUALSFM) { + CV_Error(Error::StsNotImplemented, "The requested function/feature is not implemented"); + } else if (file_format == SFM_IO_OPENSFM) { + CV_Error(Error::StsNotImplemented, "The requested function/feature is not implemented"); + } else if (file_format == SFM_IO_OPENMVG) { + CV_Error(Error::StsNotImplemented, "The requested function/feature is not implemented"); + } else if (file_format == SFM_IO_THEIASFM) { + CV_Error(Error::StsNotImplemented, "The requested function/feature is not implemented"); + } else { + CV_Error(Error::StsBadArg, "The file format one of SFM_IO_BUNDLER, SFM_IO_VISUALSFM, SFM_IO_OPENSFM, SFM_IO_OPENMVG or SFM_IO_THEIASFM"); + } + + const size_t num_cameras = Rs.size(); + const size_t num_points = points3d.size(); + + _Rs.create(num_cameras, 1, CV_64F); + _Ts.create(num_cameras, 1, CV_64F); + _Ks.create(num_cameras, 1, CV_64F); + _points3d.create(num_points, 1, CV_64F); + + for (size_t i = 0; i < num_cameras; ++i) { + Mat(Rs[i]).copyTo(_Rs.getMatRef(i)); + Mat(Ts[i]).copyTo(_Ts.getMatRef(i)); + Mat(Ks[i]).copyTo(_Ks.getMatRef(i)); + } + + for (size_t i = 0; i < num_points; ++i) + Mat(points3d[i]).copyTo(_points3d.getMatRef(i)); +} + + +} /* namespace sfm */ +} /* namespace cv */ \ No newline at end of file diff --git a/modules/sfm/src/io/io_bundler.h b/modules/sfm/src/io/io_bundler.h new file mode 100644 index 000000000..0bce9be45 --- /dev/null +++ b/modules/sfm/src/io/io_bundler.h @@ -0,0 +1,189 @@ +/* + Based on TheiaSfM library. + https://github.com/sweeneychris/TheiaSfM/blob/master/src/theia/io/read_bundler_files.cc + + Adapted by Edgar Riba + +*/ + +#include +#include +#include + +// The bundle files contain the estimated scene and camera geometry have the +// following format: +// # Bundle file v0.3 +// [two integers] +// +// +// ... +// +// +// +// ... +// +// Each camera entry contains the estimated camera intrinsics and +// extrinsics, and has the form: +// [the focal length, followed by two radial distortion +// coeffs] +// [a 3x3 matrix representing the camera rotation] +// [a 3-vector describing the camera translation] +// The cameras are specified in the order they appear in the list of images. +// +// Each point entry has the form: +// [a 3-vector describing the 3D position of the point] +// [a 3-vector describing the RGB color of the point] +// [a list of views the point is visible in] +// +// The view list begins with the length of the list (i.e., the number of cameras +// the point is visible in). The list is then given as a list of quadruplets +// , where is a camera index, the index of +// the SIFT keypoint where the point was detected in that camera, and and +// are the detected positions of that keypoint. Both indices are 0-based +// (e.g., if camera 0 appears in the list, this corresponds to the first camera +// in the scene file and the first image in "list.txt"). The pixel positions are +// floating point numbers in a coordinate system where the origin is the center +// of the image, the x-axis increases to the right, and the y-axis increases +// towards the top of the image. Thus, (-w/2, -h/2) is the lower-left corner of +// the image, and (w/2, h/2) is the top-right corner (where w and h are the +// width and height of the image). +bool readBundlerFile(const std::string &file, + std::vector &Rs, + std::vector &Ts, + std::vector &Ks, + std::vector &points3d) { + + // Read in num cameras, num points. + std::ifstream ifs(file.c_str(), std::ios::in); + if (!ifs.is_open()) { + std::cout << "Cannot read the file from " << file << std::endl; + return false; + } + + const cv::Matx33d bundler_to_opencv(1, 0, 0, 0, -1, 0, 0, 0, -1); + + std::string header_string; + std::getline(ifs, header_string); + + // If the first line starts with '#' then it is a comment, so skip it! + if (header_string[0] == '#') { + std::getline(ifs, header_string); + } + const char* p = header_string.c_str(); + char* p2; + const int num_cameras = strtol(p, &p2, 10); + + p = p2; + const int num_points = strtol(p, &p2, 10); + + // Read in the camera params. + for (int i = 0; i < num_cameras; i++) { + // Read in focal length, radial distortion. + std::string internal_params; + std::getline(ifs, internal_params); + p = internal_params.c_str(); + const double focal_length = strtod(p, &p2); + p = p2; + //const double k1 = strtod(p, &p2); + p = p2; + //const double k2 = strtod(p, &p2); + p = p2; + + cv::Matx33d intrinsics; + intrinsics(0,0) = intrinsics(1,1) = focal_length; + Ks.push_back(intrinsics); + + // Read in rotation (row-major). + cv::Matx33d rotation; + for (int r = 0; r < 3; r++) { + std::string rotation_row; + std::getline(ifs, rotation_row); + p = rotation_row.c_str(); + + for (int c = 0; c < 3; c++) { + rotation(r, c) = strtod(p, &p2); + p = p2; + } + } + + std::string translation_string; + std::getline(ifs, translation_string); + p = translation_string.c_str(); + cv::Vec3d translation; + for (int j = 0; j < 3; j++) { + translation(j) = strtod(p, &p2); + p = p2; + } + + rotation = bundler_to_opencv * rotation; + translation = bundler_to_opencv * translation; + + cv::Matx33d rotation_t = rotation.t(); + translation = -1.0 * rotation_t * translation; + + Rs.push_back(rotation); + Ts.push_back(translation); + + if ((i + 1) % 100 == 0 || i == num_cameras - 1) { + std::cout << "\r Loading parameters for camera " << i + 1 << " / " + << num_cameras << std::flush; + } + } + std::cout << std::endl; + + // Read in each 3D point and correspondences. + for (int i = 0; i < num_points; i++) { + // Read position. + std::string position_str; + std::getline(ifs, position_str); + p = position_str.c_str(); + cv::Vec3d position; + for (int j = 0; j < 3; j++) { + position(j) = strtod(p, &p2); + p = p2; + } + points3d.push_back(position); + + // Read color. + std::string color_str; + std::getline(ifs, color_str); + p = color_str.c_str(); + cv::Vec3d color; + for (int j = 0; j < 3; j++) { + color(j) = static_cast(strtol(p, &p2, 10)) / 255.0; + p = p2; + } + + // Read viewlist. + std::string view_list_string; + std::getline(ifs, view_list_string); + p = view_list_string.c_str(); + const int num_views = strtol(p, &p2, 10); + p = p2; + + // Reserve the view list for this 3D point. + for (int j = 0; j < num_views; j++) { + // Camera key x y + //const int camera_index = strtol(p, &p2, 10); + p = p2; + // Returns the index of the sift descriptor in the camera for this track. + strtol(p, &p2, 10); + p = p2; + //const float x_pos = strtof(p, &p2); + p = p2; + //const float y_pos = strtof(p, &p2); + p = p2; + + } + + if ((i + 1) % 100 == 0 || i == num_points - 1) { + std::cout << "\r Loading 3D points " << i + 1 << " / " << num_points + << std::flush; + } + } + + std::cout << std::endl; + ifs.close(); + + return true; +} \ No newline at end of file diff --git a/modules/sfm/tutorials/sfm_import_reconstruction/sfm_import_reconstruction.markdown b/modules/sfm/tutorials/sfm_import_reconstruction/sfm_import_reconstruction.markdown new file mode 100644 index 000000000..2c56809e7 --- /dev/null +++ b/modules/sfm/tutorials/sfm_import_reconstruction/sfm_import_reconstruction.markdown @@ -0,0 +1,28 @@ +Import Reconstruction {#tutorial_sfm_import_reconstruction} +===================== + +Goal +---- + +In this tutorial you will learn how to import a reconstruction from a given file obtained with Bundler [1]: + +- Load a file containing a set of cameras and 3D points. +- Show obtained results using Viz. + + +Code +---- + +@include sfm/samples/import_reconstruction.cpp + +Results +------- + +The following picture shows a reconstruction from la *Sagrada Familia* (BCN) using dataset [2]. + +![](pics/import_sagrada_familia.png) + +[1] [http://www.cs.cornell.edu/~snavely/bundler](http://www.cs.cornell.edu/~snavely/bundler) + +[2] Penate Sanchez, A. and Moreno-Noguer, F. and Andrade Cetto, J. and Fleuret, F. (2014). LETHA: Learning from High Quality Inputs for 3D Pose Estimation in Low Quality Images. Proceedings of the International Conference on 3D vision (3DV). +[URL](http://www.iri.upc.edu/research/webprojects/pau/datasets/sagfam) diff --git a/modules/sfm/tutorials/sfm_trajectory_estimation/sfm_trajectory_estimation.markdown b/modules/sfm/tutorials/sfm_trajectory_estimation/sfm_trajectory_estimation.markdown index f39bba23c..e01373483 100644 --- a/modules/sfm/tutorials/sfm_trajectory_estimation/sfm_trajectory_estimation.markdown +++ b/modules/sfm/tutorials/sfm_trajectory_estimation/sfm_trajectory_estimation.markdown @@ -6,7 +6,7 @@ Goal In this tutorial you will learn how to use the reconstruction api for camera motion estimation: -- Load and file with the tracked 2d points and build the container over all the frames. +- Load a file with the tracked 2d points and build the container over all the frames. - Run libmv reconstruction pipeline. - Show obtained results using Viz. diff --git a/modules/sfm/tutorials/table_of_content_sfm.markdown b/modules/sfm/tutorials/table_of_content_sfm.markdown index 7d9423e2d..3239949c1 100644 --- a/modules/sfm/tutorials/table_of_content_sfm.markdown +++ b/modules/sfm/tutorials/table_of_content_sfm.markdown @@ -23,4 +23,12 @@ Structure From Motion {#tutorial_table_of_content_sfm} *Author:* Edgar Riba - Sparse scene reconstruction from a given set of images. \ No newline at end of file + Sparse scene reconstruction from a given set of images. + +- @subpage tutorial_sfm_import_reconstruction + + *Compatibility:* \> OpenCV 3.0 + + *Author:* Edgar Riba + + Import a scene reconstruction. \ No newline at end of file