Skip to content
Open
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
1 change: 1 addition & 0 deletions cmake_build_dms.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
cmake .. -DBUILD_TESTS=OFF -DBUILD_PYTHON=ON -DPYBIND11_PYTHON_VERSION=3.8 -DPYTHON_INSTALL_DIR=/home/dmaturan/miniconda2/envs/colmap_ws/lib/python3.8/site-packages/ -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX
60 changes: 45 additions & 15 deletions python/pyopengv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <opengv/sac_problems/absolute_pose/AbsolutePoseSacProblem.hpp>
#include <opengv/sac_problems/relative_pose/CentralRelativePoseSacProblem.hpp>
#include <opengv/sac_problems/relative_pose/RotationOnlySacProblem.hpp>
#include <opengv/sac_problems/relative_pose/TranslationOnlySacProblem.hpp>
#include <opengv/triangulation/methods.hpp>

#include "types.hpp"
Expand Down Expand Up @@ -622,6 +623,29 @@ py::object lmeds_rotationOnly(
return arrayFromRotation(lmeds.model_coefficients_);
}

py::object ransac_translationOnly(pyarray_d &b1,
pyarray_d &b2,
pyarray_d &R,
double threshold,
int max_iterations,
double probability) {

using namespace opengv::sac_problems::relative_pose;

CentralRelativeAdapter adapter(b1, b2, R);
std::shared_ptr<TranslationOnlySacProblem> relposeproblem_ptr(new TranslationOnlySacProblem(adapter));

opengv::sac::Ransac<TranslationOnlySacProblem> ransac;

ransac.sac_model_ = relposeproblem_ptr;
ransac.threshold_ = threshold;
ransac.max_iterations_ = max_iterations;
ransac.probability_ = probability;

ransac.computeModel();
return arrayFromTransformation(ransac.model_coefficients_);
}

} // namespace relative_pose

namespace triangulation
Expand Down Expand Up @@ -667,6 +691,7 @@ py::object triangulate2( pyarray_d &b1,

PYBIND11_MODULE(pyopengv, m) {
namespace py = pybind11;
using namespace pybind11::literals;

m.def("absolute_pose_p2p", pyopengv::absolute_pose::p2p);
m.def("absolute_pose_p3p_kneip", pyopengv::absolute_pose::p3p_kneip);
Expand All @@ -693,16 +718,16 @@ PYBIND11_MODULE(pyopengv, m) {
py::arg("probability") = 0.99
);

m.def("relative_pose_twopt", pyopengv::relative_pose::twopt);
m.def("relative_pose_twopt_rotation_only", pyopengv::relative_pose::twopt_rotationOnly);
m.def("relative_pose_rotation_only", pyopengv::relative_pose::rotationOnly);
m.def("relative_pose_fivept_nister", pyopengv::relative_pose::fivept_nister);
m.def("relative_pose_fivept_kneip", pyopengv::relative_pose::fivept_kneip);
m.def("relative_pose_sevenpt", pyopengv::relative_pose::sevenpt);
m.def("relative_pose_eightpt", pyopengv::relative_pose::eightpt);
m.def("relative_pose_eigensolver", pyopengv::relative_pose::eigensolver);
m.def("relative_pose_sixpt", pyopengv::relative_pose::sixpt);
m.def("relative_pose_optimize_nonlinear", pyopengv::relative_pose::optimize_nonlinear);
m.def("relative_pose_twopt", pyopengv::relative_pose::twopt, "b1"_a, "b2"_a, "R"_a);
m.def("relative_pose_twopt_rotation_only", pyopengv::relative_pose::twopt_rotationOnly, "b1"_a, "b2"_a);
m.def("relative_pose_rotation_only", pyopengv::relative_pose::rotationOnly, "b1"_a, "b2"_a);
m.def("relative_pose_fivept_nister", pyopengv::relative_pose::fivept_nister, "b1"_a, "b2"_a);
m.def("relative_pose_fivept_kneip", pyopengv::relative_pose::fivept_kneip, "b1"_a, "b2"_a);
m.def("relative_pose_sevenpt", pyopengv::relative_pose::sevenpt, "b1"_a, "b2"_a);
m.def("relative_pose_eightpt", pyopengv::relative_pose::eightpt, "b1"_a, "b2"_a);
m.def("relative_pose_eigensolver", pyopengv::relative_pose::eigensolver, "b1"_a, "b2"_a, "R"_a);
m.def("relative_pose_sixpt", pyopengv::relative_pose::sixpt, "b1"_a, "b2"_a);
m.def("relative_pose_optimize_nonlinear", pyopengv::relative_pose::optimize_nonlinear, "b1"_a, "b2"_a, "t12"_a, "R12"_a);
m.def("relative_pose_ransac", pyopengv::relative_pose::ransac,
py::arg("b1"),
py::arg("b2"),
Expand Down Expand Up @@ -733,9 +758,14 @@ PYBIND11_MODULE(pyopengv, m) {
py::arg("iterations") = 1000,
py::arg("probability") = 0.99
);



m.def("triangulation_triangulate", pyopengv::triangulation::triangulate);
m.def("triangulation_triangulate2", pyopengv::triangulation::triangulate2);
m.def("relative_pose_ransac_translation_only", pyopengv::relative_pose::ransac_translationOnly,
py::arg("b1"),
py::arg("b2"),
py::arg("R"),
py::arg("threshold"),
py::arg("max_iterations") = 1000,
py::arg("probability") = 0.99
);
m.def("triangulation_triangulate", pyopengv::triangulation::triangulate, "b1"_a, "b2"_a, "t12"_a, "R12"_a);
m.def("triangulation_triangulate2", pyopengv::triangulation::triangulate2, "b1"_a, "b2"_a, "t12"_a, "R12"_a);
}
14 changes: 14 additions & 0 deletions python/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,19 @@ def test_relative_pose_ransac_rotation_only():
print("Done testing relative pose ransac rotation only")


def test_relative_pose_ransac_translation_only():
print("Testing relative pose ransac translation only")

d = RelativePoseDataset(100, 0.0, 0.3)

ransac_transformation = pyopengv.relative_pose_ransac_translation_only(
d.bearing_vectors1, d.bearing_vectors2, d.rotation, 0.01, 1000)

assert same_transformation(d.position, d.rotation, ransac_transformation)

print("Done testing relative pose ransac translation only")


def test_triangulation():
print("Testing triangulation")

Expand All @@ -234,4 +247,5 @@ def test_triangulation():
test_relative_pose()
test_relative_pose_ransac()
test_relative_pose_ransac_rotation_only()
test_relative_pose_ransac_translation_only()
test_triangulation()