[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