Merge pull request #2733 from alalek:fix_sfm_memory_leak

pull/2739/head^2
Alexander Alekhin 5 years ago
commit 8f3aa5c763
  1. 27
      modules/sfm/src/libmv_capi.h
  2. 25
      modules/sfm/src/simple_pipeline.cpp

@ -75,7 +75,7 @@ struct libmv_Reconstruction {
EuclideanReconstruction reconstruction; EuclideanReconstruction reconstruction;
/* Used for per-track average error calculation after reconstruction */ /* Used for per-track average error calculation after reconstruction */
Tracks tracks; Tracks tracks;
CameraIntrinsics *intrinsics; std::shared_ptr<CameraIntrinsics> intrinsics;
double error; double error;
bool is_valid; bool is_valid;
}; };
@ -252,21 +252,22 @@ static void libmv_cameraIntrinsicsFillFromOptions(
* options values. * options values.
*/ */
static CameraIntrinsics* libmv_cameraIntrinsicsCreateFromOptions( static
std::shared_ptr<CameraIntrinsics> libmv_cameraIntrinsicsCreateFromOptions(
const libmv_CameraIntrinsicsOptions* camera_intrinsics_options) { const libmv_CameraIntrinsicsOptions* camera_intrinsics_options) {
CameraIntrinsics *camera_intrinsics = NULL; std::shared_ptr<CameraIntrinsics> camera_intrinsics;
switch (camera_intrinsics_options->distortion_model) { switch (camera_intrinsics_options->distortion_model) {
case SFM_DISTORTION_MODEL_POLYNOMIAL: case SFM_DISTORTION_MODEL_POLYNOMIAL:
camera_intrinsics = new PolynomialCameraIntrinsics(); camera_intrinsics = std::make_shared<PolynomialCameraIntrinsics>();
break; break;
case SFM_DISTORTION_MODEL_DIVISION: case SFM_DISTORTION_MODEL_DIVISION:
camera_intrinsics = new DivisionCameraIntrinsics(); camera_intrinsics = std::make_shared<DivisionCameraIntrinsics>();
break; break;
default: default:
assert(!"Unknown distortion model"); assert(!"Unknown distortion model");
} }
libmv_cameraIntrinsicsFillFromOptions(camera_intrinsics_options, libmv_cameraIntrinsicsFillFromOptions(camera_intrinsics_options,
camera_intrinsics); camera_intrinsics.get());
return camera_intrinsics; return camera_intrinsics;
} }
@ -361,19 +362,19 @@ static void finishReconstruction(
/* Perform the complete reconstruction process /* Perform the complete reconstruction process
*/ */
static libmv_Reconstruction *libmv_solveReconstruction( static
std::shared_ptr<libmv_Reconstruction> libmv_solveReconstruction(
const Tracks &libmv_tracks, const Tracks &libmv_tracks,
const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options, const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options,
libmv_ReconstructionOptions* libmv_reconstruction_options) { libmv_ReconstructionOptions* libmv_reconstruction_options) {
libmv_Reconstruction *libmv_reconstruction = std::shared_ptr<libmv_Reconstruction> libmv_reconstruction = std::make_shared<libmv_Reconstruction>();
new libmv_Reconstruction();
Tracks tracks = libmv_tracks; Tracks tracks = libmv_tracks;
EuclideanReconstruction &reconstruction = EuclideanReconstruction &reconstruction =
libmv_reconstruction->reconstruction; libmv_reconstruction->reconstruction;
/* Retrieve reconstruction options from C-API to libmv API. */ /* Retrieve reconstruction options from C-API to libmv API. */
CameraIntrinsics *camera_intrinsics; std::shared_ptr<CameraIntrinsics> camera_intrinsics;
camera_intrinsics = libmv_reconstruction->intrinsics = camera_intrinsics = libmv_reconstruction->intrinsics =
libmv_cameraIntrinsicsCreateFromOptions(libmv_camera_intrinsics_options); libmv_cameraIntrinsicsCreateFromOptions(libmv_camera_intrinsics_options);
@ -426,7 +427,7 @@ static libmv_Reconstruction *libmv_solveReconstruction(
libmv_reconstruction_options->refine_intrinsics, libmv_reconstruction_options->refine_intrinsics,
libmv::BUNDLE_NO_CONSTRAINTS, libmv::BUNDLE_NO_CONSTRAINTS,
&reconstruction, &reconstruction,
camera_intrinsics); camera_intrinsics.get());
} }
/* Set reconstruction scale to unity. */ /* Set reconstruction scale to unity. */
@ -434,10 +435,10 @@ static libmv_Reconstruction *libmv_solveReconstruction(
finishReconstruction(tracks, finishReconstruction(tracks,
*camera_intrinsics, *camera_intrinsics,
libmv_reconstruction); libmv_reconstruction.get());
libmv_reconstruction->is_valid = true; libmv_reconstruction->is_valid = true;
return (libmv_Reconstruction *) libmv_reconstruction; return libmv_reconstruction;
} }
#endif #endif

@ -118,7 +118,8 @@ parser_2D_tracks( const libmv::Matches &matches, libmv::Tracks &tracks )
* reconstruction pipeline. * reconstruction pipeline.
*/ */
static libmv_Reconstruction *libmv_solveReconstructionImpl( static
std::shared_ptr<libmv_Reconstruction> libmv_solveReconstructionImpl(
const std::vector<String> &images, const std::vector<String> &images,
const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options, const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options,
libmv_ReconstructionOptions* libmv_reconstruction_options) libmv_ReconstructionOptions* libmv_reconstruction_options)
@ -182,9 +183,10 @@ public:
// Perform reconstruction // Perform reconstruction
libmv_reconstruction_ = libmv_reconstruction_ =
*libmv_solveReconstruction(tracks, libmv_solveReconstruction(tracks,
&libmv_camera_intrinsics_options_, &libmv_camera_intrinsics_options_,
&libmv_reconstruction_options_); &libmv_reconstruction_options_);
CV_Assert(libmv_reconstruction_);
} }
virtual void run(InputArrayOfArrays points2d, InputOutputArray K, OutputArray Rs, virtual void run(InputArrayOfArrays points2d, InputOutputArray K, OutputArray Rs,
@ -216,9 +218,10 @@ public:
// Perform reconstruction // Perform reconstruction
libmv_reconstruction_ = libmv_reconstruction_ =
*libmv_solveReconstructionImpl(images, libmv_solveReconstructionImpl(images,
&libmv_camera_intrinsics_options_, &libmv_camera_intrinsics_options_,
&libmv_reconstruction_options_); &libmv_reconstruction_options_);
CV_Assert(libmv_reconstruction_);
} }
@ -232,12 +235,12 @@ public:
extractLibmvReconstructionData(K, Rs, Ts, points3d); extractLibmvReconstructionData(K, Rs, Ts, points3d);
} }
virtual double getError() const { return libmv_reconstruction_.error; } virtual double getError() const { return libmv_reconstruction_->error; }
virtual void virtual void
getPoints(OutputArray points3d) { getPoints(OutputArray points3d) {
const size_t n_points = const size_t n_points =
libmv_reconstruction_.reconstruction.AllPoints().size(); libmv_reconstruction_->reconstruction.AllPoints().size();
points3d.create(n_points, 1, CV_64F); points3d.create(n_points, 1, CV_64F);
@ -246,7 +249,7 @@ public:
{ {
for ( int j = 0; j < 3; ++j ) for ( int j = 0; j < 3; ++j )
point3d[j] = point3d[j] =
libmv_reconstruction_.reconstruction.AllPoints()[i].X[j]; libmv_reconstruction_->reconstruction.AllPoints()[i].X[j];
Mat(point3d).copyTo(points3d.getMatRef(i)); Mat(point3d).copyTo(points3d.getMatRef(i));
} }
@ -254,14 +257,14 @@ public:
virtual cv::Mat getIntrinsics() const { virtual cv::Mat getIntrinsics() const {
Mat K; Mat K;
eigen2cv(libmv_reconstruction_.intrinsics->K(), K); eigen2cv(libmv_reconstruction_->intrinsics->K(), K);
return K; return K;
} }
virtual void virtual void
getCameras(OutputArray Rs, OutputArray Ts) { getCameras(OutputArray Rs, OutputArray Ts) {
const size_t n_views = const size_t n_views =
libmv_reconstruction_.reconstruction.AllCameras().size(); libmv_reconstruction_->reconstruction.AllCameras().size();
Rs.create(n_views, 1, CV_64F); Rs.create(n_views, 1, CV_64F);
Ts.create(n_views, 1, CV_64F); Ts.create(n_views, 1, CV_64F);
@ -270,8 +273,8 @@ public:
Vec3d t; Vec3d t;
for(size_t i = 0; i < n_views; ++i) for(size_t i = 0; i < n_views; ++i)
{ {
eigen2cv(libmv_reconstruction_.reconstruction.AllCameras()[i].R, R); eigen2cv(libmv_reconstruction_->reconstruction.AllCameras()[i].R, R);
eigen2cv(libmv_reconstruction_.reconstruction.AllCameras()[i].t, t); eigen2cv(libmv_reconstruction_->reconstruction.AllCameras()[i].t, t);
Mat(R).copyTo(Rs.getMatRef(i)); Mat(R).copyTo(Rs.getMatRef(i));
Mat(t).copyTo(Ts.getMatRef(i)); Mat(t).copyTo(Ts.getMatRef(i));
} }
@ -300,7 +303,7 @@ private:
getIntrinsics().copyTo(K.getMat()); getIntrinsics().copyTo(K.getMat());
} }
libmv_Reconstruction libmv_reconstruction_; std::shared_ptr<libmv_Reconstruction> libmv_reconstruction_;
libmv_ReconstructionOptions libmv_reconstruction_options_; libmv_ReconstructionOptions libmv_reconstruction_options_;
libmv_CameraIntrinsicsOptions libmv_camera_intrinsics_options_; libmv_CameraIntrinsicsOptions libmv_camera_intrinsics_options_;
}; };

Loading…
Cancel
Save