[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40582] branches/soc-2011-tomato: Camera tracking integration

Sergey Sharybin g.ulairi at gmail.com
Mon Sep 26 21:00:12 CEST 2011


Revision: 40582
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40582
Author:   nazgul
Date:     2011-09-26 19:00:12 +0000 (Mon, 26 Sep 2011)
Log Message:
-----------
Camera tracking integration
===========================

Lookup grids used for image distortion/undistortion are now
caching and re-building if distortion settings are changing.

This speedups compositor node for cases distortion model isn't
changing, but first run and runs after changing distortion
coefficients is still slow.

Modified Paths:
--------------
    branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp
    branches/soc-2011-tomato/extern/libmv/libmv-capi.h
    branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
    branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c
    branches/soc-2011-tomato/source/blender/makesdna/DNA_tracking_types.h

Modified: branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp
===================================================================
--- branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp	2011-09-26 18:51:10 UTC (rev 40581)
+++ branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp	2011-09-26 19:00:12 UTC (rev 40582)
@@ -543,6 +543,86 @@
 	delete (libmv::Feature *)libmv_features;
 }
 
+/* ************ camera intrinsics ************ */
+
+struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsNew(double focal_length, double principal_x, double principal_y,
+			double k1, double k2, double k3)
+{
+	libmv::CameraIntrinsics *intrinsics= new libmv::CameraIntrinsics();
+
+	intrinsics->SetFocalLength(focal_length, focal_length);
+	intrinsics->SetPrincipalPoint(principal_x, principal_y);
+	intrinsics->SetRadialDistortion(k1, k2, k3);
+
+	return (struct libmv_CameraIntrinsics *) intrinsics;
+}
+
+void libmv_CameraIntrinsicsDestroy(struct libmv_CameraIntrinsics *libmvIntrinsics)
+{
+	libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics;
+
+	delete intrinsics;
+}
+
+void libmv_CameraIntrinsicsUpdate(struct libmv_CameraIntrinsics *libmvIntrinsics, double focal_length,
+			double principal_x, double principal_y, double k1, double k2, double k3)
+{
+	libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics;
+
+	if (intrinsics->focal_length() != focal_length)
+		intrinsics->SetFocalLength(focal_length, focal_length);
+
+	if (intrinsics->principal_point_x() != principal_x || intrinsics->principal_point_y() != principal_y)
+		intrinsics->SetFocalLength(focal_length, focal_length);
+
+	if (intrinsics->k1() != k1 || intrinsics->k2() != k2 || intrinsics->k3() != k3)
+		intrinsics->SetRadialDistortion(k1, k2, k3);
+}
+
+void libmv_CameraIntrinsicsUndistortByte(struct libmv_CameraIntrinsics *libmvIntrinsics,
+			unsigned char *src, unsigned char *dst, int width, int height, int channels)
+{
+	libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics;
+
+	if (intrinsics->image_width() != width || intrinsics->image_height() != height)
+		intrinsics->SetImageSize(width, height);
+
+	intrinsics->Undistort(src, dst, width, height, channels);
+}
+
+void libmv_CameraIntrinsicsUndistortFloat(struct libmv_CameraIntrinsics *libmvIntrinsics,
+			float *src, float *dst, int width, int height, int channels)
+{
+	libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics;
+
+	if (intrinsics->image_width() != width || intrinsics->image_height() != height)
+		intrinsics->SetImageSize(width, height);
+
+	intrinsics->Undistort(src, dst, width, height, channels);
+}
+
+void libmv_CameraIntrinsicsDistortByte(struct libmv_CameraIntrinsics *libmvIntrinsics,
+			unsigned char *src, unsigned char *dst, int width, int height, int channels)
+{
+	libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics;
+
+	if (intrinsics->image_width() != width || intrinsics->image_height() != height)
+		intrinsics->SetImageSize(width, height);
+
+	intrinsics->Distort(src, dst, width, height, channels);
+}
+
+void libmv_CameraIntrinsicsDistortFloat(struct libmv_CameraIntrinsics *libmvIntrinsics,
+			float *src, float *dst, int width, int height, int channels)
+{
+	libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics;
+
+	if (intrinsics->image_width() != width || intrinsics->image_height() != height)
+		intrinsics->SetImageSize(width, height);
+
+	intrinsics->Distort(src, dst, width, height, channels);
+}
+
 /* ************ distortion ************ */
 
 void libmv_undistortByte(double focal_length, double principal_x, double principal_y, double k1, double k2, double k3,

Modified: branches/soc-2011-tomato/extern/libmv/libmv-capi.h
===================================================================
--- branches/soc-2011-tomato/extern/libmv/libmv-capi.h	2011-09-26 18:51:10 UTC (rev 40581)
+++ branches/soc-2011-tomato/extern/libmv/libmv-capi.h	2011-09-26 19:00:12 UTC (rev 40582)
@@ -37,6 +37,7 @@
 struct libmv_Tracks;
 struct libmv_Reconstruction;
 struct libmv_Features;
+struct libmv_CameraIntrinsics;
 
 /* Logging */
 void libmv_initLogging(const char *argv0);
@@ -77,6 +78,27 @@
 void libmv_getFeature(struct libmv_Features *libmv_features, int number, double *x, double *y, double *score, double *size);
 void libmv_destroyFeatures(struct libmv_Features *libmv_features);
 
+/* camera intrinsics */
+struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsNew(double focal_length, double principal_x, double principal_y,
+			double k1, double k2, double k3);
+
+void libmv_CameraIntrinsicsDestroy(struct libmv_CameraIntrinsics *libmvIntrinsics);
+
+void libmv_CameraIntrinsicsUpdate(struct libmv_CameraIntrinsics *libmvIntrinsics, double focal_length,
+			double principal_x, double principal_y, double k1, double k2, double k3);
+
+void libmv_CameraIntrinsicsUndistortByte(struct libmv_CameraIntrinsics *libmvIntrinsics,
+			unsigned char *src, unsigned char *dst, int width, int height, int channels);
+
+void libmv_CameraIntrinsicsUndistortFloat(struct libmv_CameraIntrinsics *libmvIntrinsics,
+			float *src, float *dst, int width, int height, int channels);
+
+void libmv_CameraIntrinsicsDistortByte(struct libmv_CameraIntrinsics *libmvIntrinsics,
+			unsigned char *src, unsigned char *dst, int width, int height, int channels);
+
+void libmv_CameraIntrinsicsDistortFloat(struct libmv_CameraIntrinsics *libmvIntrinsics,
+			float *src, float *dst, int width, int height, int channels);
+
 /* dsitortion */
 void libmv_undistortByte(double focal_length, double principal_x, double principal_y, double k1, double k2, double k3,
 			unsigned char *src, unsigned char *dst, int width, int height, int channels);

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2011-09-26 18:51:10 UTC (rev 40581)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2011-09-26 19:00:12 UTC (rev 40582)
@@ -463,6 +463,11 @@
 
 	if(tracking->stabilization.scaleibuf)
 		IMB_freeImBuf(tracking->stabilization.scaleibuf);
+
+#ifdef WITH_LIBMV
+	if(tracking->camera.intrinsics)
+		libmv_CameraIntrinsicsDestroy(tracking->camera.intrinsics);
+#endif
 }
 
 /*********************** tracking *************************/
@@ -1898,18 +1903,32 @@
 
 	resibuf= IMB_dupImBuf(ibuf);
 
+#ifdef WITH_LIBMV
+	if(camera->intrinsics == NULL) {
+		camera->intrinsics= libmv_CameraIntrinsicsNew(camera->focal,
+				camera->principal[0], camera->principal[1] * aspy,
+				camera->k1, camera->k2, camera->k3);
+	} else {
+		libmv_CameraIntrinsicsUpdate(camera->intrinsics, camera->focal,
+				camera->principal[0], camera->principal[1] * aspy,
+				camera->k1, camera->k2, camera->k3);
+	}
+#endif
+
 	if(ibuf->rect_float) {
-		libmv_undistortFloat(camera->focal,
-		                     camera->principal[0], camera->principal[1] * aspy,
-		                     camera->k1, camera->k2, camera->k3,
-		                     ibuf->rect_float, resibuf->rect_float, ibuf->x, ibuf->y, ibuf->channels);
+#ifdef WITH_LIBMV
+		libmv_CameraIntrinsicsUndistortFloat(camera->intrinsics,
+					ibuf->rect_float, resibuf->rect_float,
+					ibuf->x, ibuf->y, ibuf->channels);
+#endif
 
 		ibuf->userflags|= IB_RECT_INVALID;
 	} else {
-		libmv_undistortByte(camera->focal,
-		                    camera->principal[0], camera->principal[1] * aspy,
-		                    camera->k1, camera->k2, camera->k3,
-		                    (unsigned char*)ibuf->rect, (unsigned char*)resibuf->rect, ibuf->x, ibuf->y, ibuf->channels);
+#ifdef WITH_LIBMV
+		libmv_CameraIntrinsicsUndistortByte(camera->intrinsics,
+					(unsigned char*)ibuf->rect, (unsigned char*)resibuf->rect,
+					ibuf->x, ibuf->y, ibuf->channels);
+#endif
 	}
 
 	return resibuf;
@@ -1923,18 +1942,32 @@
 
 	resibuf= IMB_dupImBuf(ibuf);
 
+#ifdef WITH_LIBMV
+	if(camera->intrinsics == NULL) {
+		camera->intrinsics= libmv_CameraIntrinsicsNew(camera->focal,
+				camera->principal[0], camera->principal[1] * aspy,
+				camera->k1, camera->k2, camera->k3);
+	} else {
+		libmv_CameraIntrinsicsUpdate(camera->intrinsics, camera->focal,
+				camera->principal[0], camera->principal[1] * aspy,
+				camera->k1, camera->k2, camera->k3);
+	}
+#endif
+
 	if(ibuf->rect_float) {
-		libmv_distortFloat(camera->focal,
-		                   camera->principal[0], camera->principal[1] * aspy,
-		                   camera->k1, camera->k2, camera->k3,
-		                   ibuf->rect_float, resibuf->rect_float, ibuf->x, ibuf->y, ibuf->channels);
+#ifdef WITH_LIBMV
+		libmv_CameraIntrinsicsDistortFloat(camera->intrinsics,
+				ibuf->rect_float, resibuf->rect_float,
+				ibuf->x, ibuf->y, ibuf->channels);
+#endif
 
 		ibuf->userflags|= IB_RECT_INVALID;
 	} else {
-		libmv_distortByte(camera->focal,
-		                  camera->principal[0], camera->principal[1] * aspy,
-		                  camera->k1, camera->k2, camera->k3,
-		                  (unsigned char*)ibuf->rect, (unsigned char*)resibuf->rect, ibuf->x, ibuf->y, ibuf->channels);
+#ifdef WITH_LIBMV
+		libmv_CameraIntrinsicsDistortByte(camera->intrinsics,
+					(unsigned char*)ibuf->rect, (unsigned char*)resibuf->rect,
+					ibuf->x, ibuf->y, ibuf->channels);
+#endif
 	}
 
 	return resibuf;

Modified: branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c	2011-09-26 18:51:10 UTC (rev 40581)
+++ branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c	2011-09-26 19:00:12 UTC (rev 40582)
@@ -1259,6 +1259,9 @@
 	for(;clip; clip= clip->id.next) {
 		if(clip->cache)
 			oldnewmap_insert(fd->movieclipmap, clip->cache, clip->cache, 0);
+
+		if(clip->tracking.camera.intrinsics)
+			oldnewmap_insert(fd->movieclipmap, clip->tracking.camera.intrinsics, clip->tracking.camera.intrinsics, 0);
 	}
 }
 
@@ -1278,6 +1281,7 @@
 
 	for(;clip; clip= clip->id.next) {
 		clip->cache= newmclipadr(fd, clip->cache);
+		clip->tracking.camera.intrinsics= newmclipadr(fd, clip->tracking.camera.intrinsics);
 	}
 }
 
@@ -5803,6 +5807,9 @@
 	if(fd->movieclipmap) clip->cache= newmclipadr(fd, clip->cache);
 	else clip->cache= NULL;
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list