[Bf-blender-cvs] [c8d2ebe] master: Compositor: Speedup movie (un)distortion operation
Sergey Sharybin
noreply at git.blender.org
Tue Jan 26 11:46:12 CET 2016
Commit: c8d2ebe13c1a93a7390df60607525c47614b4984
Author: Sergey Sharybin
Date: Tue Jan 26 11:42:55 2016 +0100
Branches: master
https://developer.blender.org/rBc8d2ebe13c1a93a7390df60607525c47614b4984
Compositor: Speedup movie (un)distortion operation
Avoid per-pixel camera intrincs object construction and synchronization.
Here on a bit synthetic file it gives about 40% speedup with a single node.
===================================================================
M intern/libmv/intern/camera_intrinsics.cc
M intern/libmv/intern/camera_intrinsics.h
M intern/libmv/intern/stub.cc
M source/blender/blenkernel/BKE_tracking.h
M source/blender/blenkernel/intern/tracking.c
M source/blender/compositor/intern/COM_compositor.cpp
M source/blender/compositor/operations/COM_MovieDistortionOperation.cpp
M source/blender/compositor/operations/COM_MovieDistortionOperation.h
===================================================================
diff --git a/intern/libmv/intern/camera_intrinsics.cc b/intern/libmv/intern/camera_intrinsics.cc
index 0ce757c..24a34ae 100644
--- a/intern/libmv/intern/camera_intrinsics.cc
+++ b/intern/libmv/intern/camera_intrinsics.cc
@@ -264,33 +264,23 @@ void libmv_cameraIntrinsicsDistortFloat(
}
void libmv_cameraIntrinsicsApply(
- const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options,
+ const struct libmv_CameraIntrinsics* libmv_intrinsics,
double x,
double y,
double* x1,
double* y1) {
- /* Do a lens distortion if focal length is non-zero only. */
- if (libmv_camera_intrinsics_options->focal_length) {
- CameraIntrinsics* camera_intrinsics =
- libmv_cameraIntrinsicsCreateFromOptions(libmv_camera_intrinsics_options);
- camera_intrinsics->ApplyIntrinsics(x, y, x1, y1);
- LIBMV_OBJECT_DELETE(camera_intrinsics, CameraIntrinsics);
- }
+ CameraIntrinsics *intrinsics = (CameraIntrinsics *) libmv_intrinsics;
+ intrinsics->ApplyIntrinsics(x, y, x1, y1);
}
void libmv_cameraIntrinsicsInvert(
- const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options,
+ const struct libmv_CameraIntrinsics* libmv_intrinsics,
double x,
double y,
double* x1,
double* y1) {
- /* Do a lens un-distortion if focal length is non-zero only/ */
- if (libmv_camera_intrinsics_options->focal_length) {
- CameraIntrinsics *camera_intrinsics =
- libmv_cameraIntrinsicsCreateFromOptions(libmv_camera_intrinsics_options);
- camera_intrinsics->InvertIntrinsics(x, y, x1, y1);
- LIBMV_OBJECT_DELETE(camera_intrinsics, CameraIntrinsics);
- }
+ CameraIntrinsics *intrinsics = (CameraIntrinsics *) libmv_intrinsics;
+ intrinsics->InvertIntrinsics(x, y, x1, y1);
}
static void libmv_cameraIntrinsicsFillFromOptions(
diff --git a/intern/libmv/intern/camera_intrinsics.h b/intern/libmv/intern/camera_intrinsics.h
index 9910d16..50a0073 100644
--- a/intern/libmv/intern/camera_intrinsics.h
+++ b/intern/libmv/intern/camera_intrinsics.h
@@ -108,14 +108,14 @@ void libmv_cameraIntrinsicsDistortFloat(
float* destination_image);
void libmv_cameraIntrinsicsApply(
- const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options,
+ const struct libmv_CameraIntrinsics* libmv_intrinsics,
double x,
double y,
double* x1,
double* y1);
void libmv_cameraIntrinsicsInvert(
- const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options,
+ const struct libmv_CameraIntrinsics* libmv_intrinsics,
double x,
double y,
double* x1,
diff --git a/intern/libmv/intern/stub.cc b/intern/libmv/intern/stub.cc
index ad64820..47e1915 100644
--- a/intern/libmv/intern/stub.cc
+++ b/intern/libmv/intern/stub.cc
@@ -303,29 +303,23 @@ void libmv_cameraIntrinsicsDistortFloat(
/* ************ utils ************ */
void libmv_cameraIntrinsicsApply(
- const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options,
- double x,
- double y,
+ const struct libmv_CameraIntrinsics* /*libmv_intrinsics*/,
+ double /*x*/,
+ double /*y*/,
double* x1,
double* y1) {
- double focal_length = libmv_camera_intrinsics_options->focal_length;
- double principal_x = libmv_camera_intrinsics_options->principal_point_x;
- double principal_y = libmv_camera_intrinsics_options->principal_point_y;
- *x1 = x * focal_length + principal_x;
- *y1 = y * focal_length + principal_y;
+ *x1 = 0.0;
+ *y1 = 0.0;
}
void libmv_cameraIntrinsicsInvert(
- const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options,
- double x,
- double y,
+ const struct libmv_CameraIntrinsics* /*libmv_intrinsics*/,
+ double /*x*/,
+ double /*y*/,
double* x1,
double* y1) {
- double focal_length = libmv_camera_intrinsics_options->focal_length;
- double principal_x = libmv_camera_intrinsics_options->principal_point_x;
- double principal_y = libmv_camera_intrinsics_options->principal_point_y;
- *x1 = (x - principal_x) / focal_length;
- *y1 = (y - principal_y) / focal_length;
+ *x1 = 0.0;
+ *y1 = 0.0;
}
void libmv_homography2DFromCorrespondencesEuc(/* const */ double (* /*x1*/)[2],
diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h
index 264bf2b..2ca8842 100644
--- a/source/blender/blenkernel/BKE_tracking.h
+++ b/source/blender/blenkernel/BKE_tracking.h
@@ -200,6 +200,12 @@ void BKE_tracking_distortion_set_threads(struct MovieDistortion *distortion, int
struct MovieDistortion *BKE_tracking_distortion_copy(struct MovieDistortion *distortion);
struct ImBuf *BKE_tracking_distortion_exec(struct MovieDistortion *distortion, struct MovieTracking *tracking,
struct ImBuf *ibuf, int width, int height, float overscan, bool undistort);
+void BKE_tracking_distortion_distort_v2(struct MovieDistortion *distortion,
+ const float co[2],
+ float r_co[2]);
+void BKE_tracking_distortion_undistort_v2(struct MovieDistortion *distortion,
+ const float co[2],
+ float r_co[2]);
void BKE_tracking_distortion_free(struct MovieDistortion *distortion);
void BKE_tracking_distort_v2(struct MovieTracking *tracking, const float co[2], float r_co[2]);
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index e5719bd..3b76e45 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -69,6 +69,10 @@
typedef struct MovieDistortion {
struct libmv_CameraIntrinsics *intrinsics;
+ /* Parameters needed for coordinates normalization. */
+ float principal[2];
+ float pixel_aspect;
+ float focal;
} MovieDistortion;
static struct {
@@ -1878,6 +1882,11 @@ MovieDistortion *BKE_tracking_distortion_new(MovieTracking *tracking,
distortion = MEM_callocN(sizeof(MovieDistortion), "BKE_tracking_distortion_create");
distortion->intrinsics = libmv_cameraIntrinsicsNew(&camera_intrinsics_options);
+ const MovieTrackingCamera *camera = &tracking->camera;
+ copy_v2_v2(distortion->principal, camera->principal);
+ distortion->pixel_aspect = camera->pixel_aspect;
+ distortion->focal = camera->focal;
+
return distortion;
}
@@ -1891,6 +1900,11 @@ void BKE_tracking_distortion_update(MovieDistortion *distortion, MovieTracking *
calibration_height,
&camera_intrinsics_options);
+ const MovieTrackingCamera *camera = &tracking->camera;
+ copy_v2_v2(distortion->principal, camera->principal);
+ distortion->pixel_aspect = camera->pixel_aspect;
+ distortion->focal = camera->focal;
+
libmv_cameraIntrinsicsUpdate(&camera_intrinsics_options, distortion->intrinsics);
}
@@ -1904,7 +1918,7 @@ MovieDistortion *BKE_tracking_distortion_copy(MovieDistortion *distortion)
MovieDistortion *new_distortion;
new_distortion = MEM_callocN(sizeof(MovieDistortion), "BKE_tracking_distortion_create");
-
+ *new_distortion = *distortion;
new_distortion->intrinsics = libmv_cameraIntrinsicsCopy(distortion->intrinsics);
return new_distortion;
@@ -1962,6 +1976,36 @@ ImBuf *BKE_tracking_distortion_exec(MovieDistortion *distortion, MovieTracking *
return resibuf;
}
+void BKE_tracking_distortion_distort_v2(MovieDistortion *distortion,
+ const float co[2],
+ float r_co[2])
+{
+ const float aspy = 1.0f / distortion->pixel_aspect;
+
+ /* Normalize coords. */
+ float inv_focal = 1.0f / distortion->focal;
+ double x = (co[0] - distortion->principal[0]) * inv_focal,
+ y = (co[1] - distortion->principal[1] * aspy) * inv_focal;
+
+ libmv_cameraIntrinsicsApply(distortion->intrinsics, x, y, &x, &y);
+
+ /* Result is in image coords already. */
+ r_co[0] = x;
+ r_co[1] = y;
+}
+
+void BKE_tracking_distortion_undistort_v2(MovieDistortion *distortion,
+ const float co[2],
+ float r_co[2])
+{
+ double x = co[0], y = co[1];
+ libmv_cameraIntrinsicsInvert(distortion->intrinsics, x, y, &x, &y);
+
+ const float aspy = 1.0f / distortion->pixel_aspect;
+ r_co[0] = (float)x * distortion->focal + distortion->principal[0];
+ r_co[1] = (float)y * distortion->focal + distortion->principal[1] * aspy;
+}
+
void BKE_tracking_distortion_free(MovieDistortion *distortion)
{
libmv_cameraIntrinsicsDestroy(distortion->intrinsics);
@@ -1971,40 +2015,43 @@ void BKE_tracking_distortion_free(MovieDistortion *distortion)
void BKE_tracking_distort_v2(MovieTracking *tracking, const float co[2], float r_co[2])
{
- MovieTrackingCamera *camera = &tracking->camera;
+ const MovieTrackingCamera *camera = &tracking->camera;
+ const float aspy = 1.0f / tracking->camera.pixel_aspect;
libmv_CameraIntrinsicsOptions camera_intrinsics_options;
- double x, y;
- float aspy = 1.0f / tracking->camera.pixel_aspect;
-
tracking_cameraIntrinscisOptionsFromTracking(tracking,
0, 0,
&camera_intrinsics_options);
+ libmv_CameraIntrinsics *intrinsics =
+ libmv_cameraIntrinsicsNew(&camera_intrinsics_options);
- /* normalize coords */
- x = (co[0] - camera->principal[0]) / camera->focal;
- y = (co[1] - camera->principal[1] * aspy) / camera->focal;
+ /* Normalize coordinates. */
+ double x = (co[0] - camera->principal[0]) / camera->focal,
+ y = (co[1] - camera->principal[1] * aspy) / camera->focal;
- libmv_cameraIntrinsicsApply(&camera_intrinsics_options, x, y, &x, &y);
+ libmv_cameraIntrinsicsApply(intrinsics, x, y, &x, &y);
+ libmv_cameraIntrinsicsDestroy(intrinsics);
- /* result is in image coords already */
+ /* Result is in image coords already. */
r_co[0] = x;
r_co[1] = y;
}
void BKE_tracking_undistort_v2(MovieTracking *tracking, const float co[2], float r_co[2])
{
- MovieTrackingCamera *camera = &tracking->camera;
+ const MovieTrackingCamera *camera = &tracking->camera;
+ const float aspy = 1.0f / tracking->camera.pixel_a
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list