Skip to content

sfm: fix memory leak #2733

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 1, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 14 additions & 13 deletions modules/sfm/src/libmv_capi.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -426,18 +427,18 @@ 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. */
EuclideanScaleToUnity(&reconstruction);

finishReconstruction(tracks,
*camera_intrinsics,
libmv_reconstruction);
libmv_reconstruction.get());

libmv_reconstruction->is_valid = true;
return (libmv_Reconstruction *) libmv_reconstruction;
return libmv_reconstruction;
}

#endif
25 changes: 14 additions & 11 deletions modules/sfm/src/simple_pipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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_);
}


Expand All @@ -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);

Expand All @@ -246,22 +249,22 @@ 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));
}

}

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);
Expand All @@ -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));
}
Expand Down Expand Up @@ -300,7 +303,7 @@ class SFMLibmvReconstructionImpl : public T
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_;
};
Expand Down