From 5b05f5c36fef0a3dc3c275b233db5402fb028a3f Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Sat, 31 Oct 2020 12:57:41 +0000 Subject: [PATCH] sfm: fix memory leak --- modules/sfm/src/libmv_capi.h | 27 ++++++++++++++------------- modules/sfm/src/simple_pipeline.cpp | 25 ++++++++++++++----------- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/modules/sfm/src/libmv_capi.h b/modules/sfm/src/libmv_capi.h index cf2e5daf75a..3c39c2b5c71 100644 --- a/modules/sfm/src/libmv_capi.h +++ b/modules/sfm/src/libmv_capi.h @@ -75,7 +75,7 @@ struct libmv_Reconstruction { EuclideanReconstruction reconstruction; /* Used for per-track average error calculation after reconstruction */ Tracks tracks; - CameraIntrinsics *intrinsics; + std::shared_ptr intrinsics; double error; bool is_valid; }; @@ -252,21 +252,22 @@ static void libmv_cameraIntrinsicsFillFromOptions( * options values. */ -static CameraIntrinsics* libmv_cameraIntrinsicsCreateFromOptions( +static +std::shared_ptr libmv_cameraIntrinsicsCreateFromOptions( const libmv_CameraIntrinsicsOptions* camera_intrinsics_options) { - CameraIntrinsics *camera_intrinsics = NULL; + std::shared_ptr camera_intrinsics; switch (camera_intrinsics_options->distortion_model) { case SFM_DISTORTION_MODEL_POLYNOMIAL: - camera_intrinsics = new PolynomialCameraIntrinsics(); + camera_intrinsics = std::make_shared(); break; case SFM_DISTORTION_MODEL_DIVISION: - camera_intrinsics = new DivisionCameraIntrinsics(); + camera_intrinsics = std::make_shared(); break; default: assert(!"Unknown distortion model"); } libmv_cameraIntrinsicsFillFromOptions(camera_intrinsics_options, - camera_intrinsics); + camera_intrinsics.get()); return camera_intrinsics; } @@ -361,19 +362,19 @@ static void finishReconstruction( /* Perform the complete reconstruction process */ -static libmv_Reconstruction *libmv_solveReconstruction( +static +std::shared_ptr libmv_solveReconstruction( const Tracks &libmv_tracks, const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options, libmv_ReconstructionOptions* libmv_reconstruction_options) { - libmv_Reconstruction *libmv_reconstruction = - new libmv_Reconstruction(); + std::shared_ptr libmv_reconstruction = std::make_shared(); Tracks tracks = libmv_tracks; EuclideanReconstruction &reconstruction = libmv_reconstruction->reconstruction; /* Retrieve reconstruction options from C-API to libmv API. */ - CameraIntrinsics *camera_intrinsics; + std::shared_ptr camera_intrinsics; camera_intrinsics = libmv_reconstruction->intrinsics = libmv_cameraIntrinsicsCreateFromOptions(libmv_camera_intrinsics_options); @@ -426,7 +427,7 @@ static libmv_Reconstruction *libmv_solveReconstruction( libmv_reconstruction_options->refine_intrinsics, libmv::BUNDLE_NO_CONSTRAINTS, &reconstruction, - camera_intrinsics); + camera_intrinsics.get()); } /* Set reconstruction scale to unity. */ @@ -434,10 +435,10 @@ static libmv_Reconstruction *libmv_solveReconstruction( finishReconstruction(tracks, *camera_intrinsics, - libmv_reconstruction); + libmv_reconstruction.get()); libmv_reconstruction->is_valid = true; - return (libmv_Reconstruction *) libmv_reconstruction; + return libmv_reconstruction; } #endif diff --git a/modules/sfm/src/simple_pipeline.cpp b/modules/sfm/src/simple_pipeline.cpp index a0816108452..476b17e8794 100644 --- a/modules/sfm/src/simple_pipeline.cpp +++ b/modules/sfm/src/simple_pipeline.cpp @@ -118,7 +118,8 @@ parser_2D_tracks( const libmv::Matches &matches, libmv::Tracks &tracks ) * reconstruction pipeline. */ -static libmv_Reconstruction *libmv_solveReconstructionImpl( +static +std::shared_ptr libmv_solveReconstructionImpl( const std::vector &images, const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options, libmv_ReconstructionOptions* libmv_reconstruction_options) @@ -182,9 +183,10 @@ class SFMLibmvReconstructionImpl : public T // Perform reconstruction libmv_reconstruction_ = - *libmv_solveReconstruction(tracks, + libmv_solveReconstruction(tracks, &libmv_camera_intrinsics_options_, &libmv_reconstruction_options_); + CV_Assert(libmv_reconstruction_); } virtual void run(InputArrayOfArrays points2d, InputOutputArray K, OutputArray Rs, @@ -216,9 +218,10 @@ class SFMLibmvReconstructionImpl : public T // Perform reconstruction libmv_reconstruction_ = - *libmv_solveReconstructionImpl(images, + libmv_solveReconstructionImpl(images, &libmv_camera_intrinsics_options_, &libmv_reconstruction_options_); + CV_Assert(libmv_reconstruction_); } @@ -232,12 +235,12 @@ class SFMLibmvReconstructionImpl : public T extractLibmvReconstructionData(K, Rs, Ts, points3d); } - virtual double getError() const { return libmv_reconstruction_.error; } + virtual double getError() const { return libmv_reconstruction_->error; } virtual void getPoints(OutputArray points3d) { const size_t n_points = - libmv_reconstruction_.reconstruction.AllPoints().size(); + libmv_reconstruction_->reconstruction.AllPoints().size(); points3d.create(n_points, 1, CV_64F); @@ -246,7 +249,7 @@ class SFMLibmvReconstructionImpl : public T { for ( int j = 0; j < 3; ++j ) point3d[j] = - libmv_reconstruction_.reconstruction.AllPoints()[i].X[j]; + libmv_reconstruction_->reconstruction.AllPoints()[i].X[j]; Mat(point3d).copyTo(points3d.getMatRef(i)); } @@ -254,14 +257,14 @@ class SFMLibmvReconstructionImpl : public T virtual cv::Mat getIntrinsics() const { Mat K; - eigen2cv(libmv_reconstruction_.intrinsics->K(), K); + eigen2cv(libmv_reconstruction_->intrinsics->K(), K); return K; } virtual void getCameras(OutputArray Rs, OutputArray Ts) { const size_t n_views = - libmv_reconstruction_.reconstruction.AllCameras().size(); + libmv_reconstruction_->reconstruction.AllCameras().size(); Rs.create(n_views, 1, CV_64F); Ts.create(n_views, 1, CV_64F); @@ -270,8 +273,8 @@ class SFMLibmvReconstructionImpl : public T Vec3d t; for(size_t i = 0; i < n_views; ++i) { - eigen2cv(libmv_reconstruction_.reconstruction.AllCameras()[i].R, R); - eigen2cv(libmv_reconstruction_.reconstruction.AllCameras()[i].t, t); + eigen2cv(libmv_reconstruction_->reconstruction.AllCameras()[i].R, R); + eigen2cv(libmv_reconstruction_->reconstruction.AllCameras()[i].t, t); Mat(R).copyTo(Rs.getMatRef(i)); Mat(t).copyTo(Ts.getMatRef(i)); } @@ -300,7 +303,7 @@ class SFMLibmvReconstructionImpl : public T getIntrinsics().copyTo(K.getMat()); } - libmv_Reconstruction libmv_reconstruction_; + std::shared_ptr libmv_reconstruction_; libmv_ReconstructionOptions libmv_reconstruction_options_; libmv_CameraIntrinsicsOptions libmv_camera_intrinsics_options_; };