diff options
Diffstat (limited to 'intern/libmv/intern')
-rw-r--r-- | intern/libmv/intern/camera_intrinsics.cc | 73 | ||||
-rw-r--r-- | intern/libmv/intern/camera_intrinsics.h | 5 | ||||
-rw-r--r-- | intern/libmv/intern/reconstruction.cc | 23 | ||||
-rw-r--r-- | intern/libmv/intern/reconstruction.h | 20 |
4 files changed, 111 insertions, 10 deletions
diff --git a/intern/libmv/intern/camera_intrinsics.cc b/intern/libmv/intern/camera_intrinsics.cc index 554c4350b0a..628637e12cc 100644 --- a/intern/libmv/intern/camera_intrinsics.cc +++ b/intern/libmv/intern/camera_intrinsics.cc @@ -25,6 +25,7 @@ using libmv::CameraIntrinsics; using libmv::DivisionCameraIntrinsics; using libmv::PolynomialCameraIntrinsics; using libmv::NukeCameraIntrinsics; +using libmv::BrownCameraIntrinsics; libmv_CameraIntrinsics *libmv_cameraIntrinsicsNew( const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options) { @@ -64,6 +65,14 @@ libmv_CameraIntrinsics *libmv_cameraIntrinsicsCopy( *nuke_intrinsics); break; } + case libmv::DISTORTION_MODEL_BROWN: + { + const BrownCameraIntrinsics *brown_intrinsics = + static_cast<const BrownCameraIntrinsics*>(orig_intrinsics); + new_intrinsics = LIBMV_OBJECT_NEW(BrownCameraIntrinsics, + *brown_intrinsics); + break; + } default: assert(!"Unknown distortion model"); } @@ -164,6 +173,35 @@ void libmv_cameraIntrinsicsUpdate( break; } + case LIBMV_DISTORTION_MODEL_BROWN: + { + assert(camera_intrinsics->GetDistortionModelType() == + libmv::DISTORTION_MODEL_BROWN); + + BrownCameraIntrinsics *brown_intrinsics = + (BrownCameraIntrinsics *) camera_intrinsics; + + double k1 = libmv_camera_intrinsics_options->brown_k1; + double k2 = libmv_camera_intrinsics_options->brown_k2; + double k3 = libmv_camera_intrinsics_options->brown_k3; + double k4 = libmv_camera_intrinsics_options->brown_k4; + + if (brown_intrinsics->k1() != k1 || + brown_intrinsics->k2() != k2 || + brown_intrinsics->k3() != k3 || + brown_intrinsics->k4() != k4) { + brown_intrinsics->SetRadialDistortion(k1, k2, k3, k4); + } + + double p1 = libmv_camera_intrinsics_options->brown_p1; + double p2 = libmv_camera_intrinsics_options->brown_p2; + + if (brown_intrinsics->p1() != p1 || brown_intrinsics->p2() != p2) { + brown_intrinsics->SetTangentialDistortion(p1, p2); + } + break; + } + default: assert(!"Unknown distortion model"); } @@ -228,6 +266,21 @@ void libmv_cameraIntrinsicsExtractOptions( break; } + case libmv::DISTORTION_MODEL_BROWN: + { + const BrownCameraIntrinsics *brown_intrinsics = + static_cast<const BrownCameraIntrinsics *>(camera_intrinsics); + camera_intrinsics_options->distortion_model = + LIBMV_DISTORTION_MODEL_BROWN; + camera_intrinsics_options->brown_k1 = brown_intrinsics->k1(); + camera_intrinsics_options->brown_k2 = brown_intrinsics->k2(); + camera_intrinsics_options->brown_k3 = brown_intrinsics->k3(); + camera_intrinsics_options->brown_k4 = brown_intrinsics->k4(); + camera_intrinsics_options->brown_p1 = brown_intrinsics->p1(); + camera_intrinsics_options->brown_p2 = brown_intrinsics->p2(); + break; + } + default: assert(!"Unknown distortion model"); } @@ -366,6 +419,23 @@ static void libmv_cameraIntrinsicsFillFromOptions( break; } + case LIBMV_DISTORTION_MODEL_BROWN: + { + BrownCameraIntrinsics *brown_intrinsics = + static_cast<BrownCameraIntrinsics*>(camera_intrinsics); + + brown_intrinsics->SetRadialDistortion( + camera_intrinsics_options->brown_k1, + camera_intrinsics_options->brown_k2, + camera_intrinsics_options->brown_k3, + camera_intrinsics_options->brown_k4); + brown_intrinsics->SetTangentialDistortion( + camera_intrinsics_options->brown_p1, + camera_intrinsics_options->brown_p2); + + break; + } + default: assert(!"Unknown distortion model"); } @@ -384,6 +454,9 @@ CameraIntrinsics* libmv_cameraIntrinsicsCreateFromOptions( case LIBMV_DISTORTION_MODEL_NUKE: camera_intrinsics = LIBMV_OBJECT_NEW(NukeCameraIntrinsics); break; + case LIBMV_DISTORTION_MODEL_BROWN: + camera_intrinsics = LIBMV_OBJECT_NEW(BrownCameraIntrinsics); + break; default: assert(!"Unknown distortion model"); } diff --git a/intern/libmv/intern/camera_intrinsics.h b/intern/libmv/intern/camera_intrinsics.h index b3d259893bd..eb6176770ec 100644 --- a/intern/libmv/intern/camera_intrinsics.h +++ b/intern/libmv/intern/camera_intrinsics.h @@ -30,6 +30,7 @@ enum { LIBMV_DISTORTION_MODEL_POLYNOMIAL = 0, LIBMV_DISTORTION_MODEL_DIVISION = 1, LIBMV_DISTORTION_MODEL_NUKE = 2, + LIBMV_DISTORTION_MODEL_BROWN = 3, }; typedef struct libmv_CameraIntrinsicsOptions { @@ -49,6 +50,10 @@ typedef struct libmv_CameraIntrinsicsOptions { // Nuke distortion model. double nuke_k1, nuke_k2; + + // Brown-Conrady distortion model. + double brown_k1, brown_k2, brown_k3, brown_k4; + double brown_p1, brown_p2; } libmv_CameraIntrinsicsOptions; libmv_CameraIntrinsics *libmv_cameraIntrinsicsNew( diff --git a/intern/libmv/intern/reconstruction.cc b/intern/libmv/intern/reconstruction.cc index 64f00b19df0..0f4e890d4ca 100644 --- a/intern/libmv/intern/reconstruction.cc +++ b/intern/libmv/intern/reconstruction.cc @@ -95,12 +95,23 @@ void libmv_solveRefineIntrinsics( if (refine_intrinsics & LIBMV_REFINE_PRINCIPAL_POINT) { bundle_intrinsics |= libmv::BUNDLE_PRINCIPAL_POINT; } - if (refine_intrinsics & LIBMV_REFINE_RADIAL_DISTORTION_K1) { - bundle_intrinsics |= libmv::BUNDLE_RADIAL_K1; - } - if (refine_intrinsics & LIBMV_REFINE_RADIAL_DISTORTION_K2) { - bundle_intrinsics |= libmv::BUNDLE_RADIAL_K2; - } + +#define SET_DISTORTION_FLAG_CHECKED(type, coefficient) \ + do { \ + if (refine_intrinsics & LIBMV_REFINE_ ## type ##_DISTORTION_ ## coefficient) { \ + bundle_intrinsics |= libmv::BUNDLE_ ## type ## _ ## coefficient; \ + } \ + } while (0) + + SET_DISTORTION_FLAG_CHECKED(RADIAL, K1); + SET_DISTORTION_FLAG_CHECKED(RADIAL, K2); + SET_DISTORTION_FLAG_CHECKED(RADIAL, K3); + SET_DISTORTION_FLAG_CHECKED(RADIAL, K4); + + SET_DISTORTION_FLAG_CHECKED(TANGENTIAL, P1); + SET_DISTORTION_FLAG_CHECKED(TANGENTIAL, P2); + +#undef SET_DISTORTION_FLAG_CHECKED progress_update_callback(callback_customdata, 1.0, "Refining solution"); diff --git a/intern/libmv/intern/reconstruction.h b/intern/libmv/intern/reconstruction.h index 727a4943add..408ac884684 100644 --- a/intern/libmv/intern/reconstruction.h +++ b/intern/libmv/intern/reconstruction.h @@ -31,10 +31,22 @@ struct libmv_CameraIntrinsicsOptions; typedef struct libmv_Reconstruction libmv_Reconstruction; enum { - LIBMV_REFINE_FOCAL_LENGTH = (1 << 0), - LIBMV_REFINE_PRINCIPAL_POINT = (1 << 1), - LIBMV_REFINE_RADIAL_DISTORTION_K1 = (1 << 2), - LIBMV_REFINE_RADIAL_DISTORTION_K2 = (1 << 4), + LIBMV_REFINE_FOCAL_LENGTH = (1 << 0), + LIBMV_REFINE_PRINCIPAL_POINT = (1 << 1), + + LIBMV_REFINE_RADIAL_DISTORTION_K1 = (1 << 2), + LIBMV_REFINE_RADIAL_DISTORTION_K2 = (1 << 3), + LIBMV_REFINE_RADIAL_DISTORTION_K3 = (1 << 4), + LIBMV_REFINE_RADIAL_DISTORTION_K4 = (1 << 5), + LIBMV_REFINE_RADIAL_DISTORTION = (LIBMV_REFINE_RADIAL_DISTORTION_K1 | + LIBMV_REFINE_RADIAL_DISTORTION_K2 | + LIBMV_REFINE_RADIAL_DISTORTION_K3 | + LIBMV_REFINE_RADIAL_DISTORTION_K4), + + LIBMV_REFINE_TANGENTIAL_DISTORTION_P1 = (1 << 6), + LIBMV_REFINE_TANGENTIAL_DISTORTION_P2 = (1 << 7), + LIBMV_REFINE_TANGENTIAL_DISTORTION = (LIBMV_REFINE_TANGENTIAL_DISTORTION_P1 | + LIBMV_REFINE_TANGENTIAL_DISTORTION_P2), }; typedef struct libmv_ReconstructionOptions { |