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;
/* Used for per-track average error calculation after reconstruction */
Tracks tracks;
CameraIntrinsics *intrinsics;
std::shared_ptr<CameraIntrinsics> intrinsics;
double error;
bool is_valid;
};
@ -252,21 +252,22 @@ static void libmv_cameraIntrinsicsFillFromOptions(
* options values.
*/
static CameraIntrinsics* libmv_cameraIntrinsicsCreateFromOptions(
static
std::shared_ptr<CameraIntrinsics> libmv_cameraIntrinsicsCreateFromOptions(
const libmv_CameraIntrinsicsOptions* camera_intrinsics_options) {
CameraIntrinsics *camera_intrinsics = NULL;
std::shared_ptr<CameraIntrinsics> camera_intrinsics;
switch (camera_intrinsics_options->distortion_model) {
case SFM_DISTORTION_MODEL_POLYNOMIAL:
camera_intrinsics = new PolynomialCameraIntrinsics();
camera_intrinsics = std::make_shared<PolynomialCameraIntrinsics>();
break;
case SFM_DISTORTION_MODEL_DIVISION:
camera_intrinsics = new DivisionCameraIntrinsics();
camera_intrinsics = std::make_shared<DivisionCameraIntrinsics>();
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_Reconstruction> 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> libmv_reconstruction = std::make_shared<libmv_Reconstruction>();
Tracks tracks = libmv_tracks;
EuclideanReconstruction &reconstruction =
libmv_reconstruction->reconstruction;
/* Retrieve reconstruction options from C-API to libmv API. */
CameraIntrinsics *camera_intrinsics;
std::shared_ptr<CameraIntrinsics> 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

@ -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_Reconstruction> libmv_solveReconstructionImpl(
const std::vector<String> &images,
const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options,
libmv_ReconstructionOptions* libmv_reconstruction_options)
@ -182,9 +183,10 @@ public:
// 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 @@ public:
// 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 @@ public:
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 @@ public:
{
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 @@ public:
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 @@ public:
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 @@ private:
getIntrinsics().copyTo(K.getMat());
}
libmv_Reconstruction libmv_reconstruction_;
std::shared_ptr<libmv_Reconstruction> libmv_reconstruction_;
libmv_ReconstructionOptions libmv_reconstruction_options_;
libmv_CameraIntrinsicsOptions libmv_camera_intrinsics_options_;
};

Loading…
Cancel
Save