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

Sergey Sharybin g.ulairi at gmail.com
Sun Oct 9 22:28:29 CEST 2011


Revision: 40878
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40878
Author:   nazgul
Date:     2011-10-09 20:28:29 +0000 (Sun, 09 Oct 2011)
Log Message:
-----------
Camera tracking integration
===========================

Support for (un)distortion of images with overscan. Needed for
easier keeping this up-to-date until proper overscan support is
implemented in renderer. Not exposed into UI yet at all.

Modified Paths:
--------------
    branches/soc-2011-tomato/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc
    branches/soc-2011-tomato/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h
    branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp
    branches/soc-2011-tomato/extern/libmv/libmv-capi.h
    branches/soc-2011-tomato/extern/libmv/patches/series
    branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
    branches/soc-2011-tomato/source/blender/blenkernel/intern/movieclip.c
    branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
    branches/soc-2011-tomato/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c

Added Paths:
-----------
    branches/soc-2011-tomato/extern/libmv/patches/overscan.patch

Modified: branches/soc-2011-tomato/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc
===================================================================
--- branches/soc-2011-tomato/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc	2011-10-09 20:26:56 UTC (rev 40877)
+++ branches/soc-2011-tomato/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc	2011-10-09 20:28:29 UTC (rev 40878)
@@ -31,6 +31,7 @@
 struct Grid {
   struct Offset *offset;
   int width, height;
+  double overscan;
 };
 
 static struct Grid *copyGrid(struct Grid *from)
@@ -42,6 +43,7 @@
 
     to->width = from->width;
     to->height = from->height;
+    to->overscan = from->overscan;
 
     to->offset = new Offset[to->width*to->height];
     memcpy(to->offset, from->offset, sizeof(struct Offset)*to->width*to->height);
@@ -184,17 +186,19 @@
 
 // TODO(MatthiasF): downsample lookup
 template<typename WarpFunction>
-void CameraIntrinsics::ComputeLookupGrid(Grid* grid, int width, int height) {
-  double aspx = (double)width / image_width_;
-  double aspy = (double)height / image_height_;
+void CameraIntrinsics::ComputeLookupGrid(Grid* grid, int width, int height, double overscan) {
+  double w = (double)width / (1 + overscan);
+  double h = (double)height / (1 + overscan);
+  double aspx = (double)w / image_width_;
+  double aspy = (double)h / image_height_;
 
   for (int y = 0; y < height; y++) {
     for (int x = 0; x < width; x++) {
-      double src_x = x / aspx, src_y = y / aspy;
+      double src_x = (x - 0.5 * overscan * w) / aspx, src_y = (y - 0.5 * overscan * h) / aspy;
       double warp_x, warp_y;
       WarpFunction(this,src_x,src_y,&warp_x,&warp_y);
-      warp_x = warp_x*aspx;
-      warp_y = warp_y*aspy;
+      warp_x = warp_x*aspx + 0.5 * overscan * w;
+      warp_y = warp_y*aspy + 0.5 * overscan * h;
       int ix = int(warp_x), iy = int(warp_y);
       int fx = round((warp_x-ix)*256), fy = round((warp_y-iy)*256);
       if(fx == 256) { fx=0; ix++; }
@@ -264,10 +268,10 @@
   }
 };
 
-void CameraIntrinsics::CheckDistortLookupGrid(int width, int height)
+void CameraIntrinsics::CheckDistortLookupGrid(int width, int height, double overscan)
 {
   if(distort_) {
-    if(distort_->width != width || distort_->height != height) {
+    if(distort_->width != width || distort_->height != height || distort_->overscan != overscan) {
       delete [] distort_->offset;
       distort_->offset = NULL;
     }
@@ -278,17 +282,18 @@
 
   if(!distort_->offset) {
       distort_->offset = new Offset[width*height];
-      ComputeLookupGrid<InvertIntrinsicsFunction>(distort_,width,height);
+      ComputeLookupGrid<InvertIntrinsicsFunction>(distort_,width,height,overscan);
   }
 
   distort_->width = width;
   distort_->height = height;
+  distort_->overscan = overscan;
 }
 
-void CameraIntrinsics::CheckUndistortLookupGrid(int width, int height)
+void CameraIntrinsics::CheckUndistortLookupGrid(int width, int height, double overscan)
 {
   if(undistort_) {
-    if(undistort_->width != width || undistort_->height != height) {
+    if(undistort_->width != width || undistort_->height != height || undistort_->overscan != overscan) {
       delete [] undistort_->offset;
       undistort_->offset = NULL;
     }
@@ -299,15 +304,16 @@
 
   if(!undistort_->offset) {
       undistort_->offset = new Offset[width*height];
-      ComputeLookupGrid<ApplyIntrinsicsFunction>(undistort_,width,height);
+      ComputeLookupGrid<ApplyIntrinsicsFunction>(undistort_,width,height,overscan);
   }
 
   undistort_->width = width;
   undistort_->height = height;
+  undistort_->overscan = overscan;
 }
 
-void CameraIntrinsics::Distort(const float* src, float* dst, int width, int height, int channels) {
-  CheckDistortLookupGrid(width, height);
+void CameraIntrinsics::Distort(const float* src, float* dst, int width, int height, double overscan, int channels) {
+  CheckDistortLookupGrid(width, height, overscan);
        if(channels==1) Warp<float,1>(distort_,src,dst,width,height);
   else if(channels==2) Warp<float,2>(distort_,src,dst,width,height);
   else if(channels==3) Warp<float,3>(distort_,src,dst,width,height);
@@ -315,8 +321,8 @@
   //else assert("channels must be between 1 and 4");
 }
 
-void CameraIntrinsics::Distort(const unsigned char* src, unsigned char* dst, int width, int height, int channels) {
-  CheckDistortLookupGrid(width, height);
+void CameraIntrinsics::Distort(const unsigned char* src, unsigned char* dst, int width, int height, double overscan, int channels) {
+  CheckDistortLookupGrid(width, height, overscan);
        if(channels==1) Warp<unsigned char,1>(distort_,src,dst,width,height);
   else if(channels==2) Warp<unsigned char,2>(distort_,src,dst,width,height);
   else if(channels==3) Warp<unsigned char,3>(distort_,src,dst,width,height);
@@ -324,8 +330,8 @@
   //else assert("channels must be between 1 and 4");
 }
 
-void CameraIntrinsics::Undistort(const float* src, float* dst, int width, int height, int channels) {
-  CheckUndistortLookupGrid(width, height);
+void CameraIntrinsics::Undistort(const float* src, float* dst, int width, int height, double overscan, int channels) {
+  CheckUndistortLookupGrid(width, height, overscan);
        if(channels==1) Warp<float,1>(undistort_,src,dst,width,height);
   else if(channels==2) Warp<float,2>(undistort_,src,dst,width,height);
   else if(channels==3) Warp<float,3>(undistort_,src,dst,width,height);
@@ -333,8 +339,8 @@
   //else assert("channels must be between 1 and 4");
 }
 
-void CameraIntrinsics::Undistort(const unsigned char* src, unsigned char* dst, int width, int height, int channels) {
-  CheckUndistortLookupGrid(width, height);
+void CameraIntrinsics::Undistort(const unsigned char* src, unsigned char* dst, int width, int height, double overscan, int channels) {
+  CheckUndistortLookupGrid(width, height, overscan);
        if(channels==1) Warp<unsigned char,1>(undistort_,src,dst,width,height);
   else if(channels==2) Warp<unsigned char,2>(undistort_,src,dst,width,height);
   else if(channels==3) Warp<unsigned char,3>(undistort_,src,dst,width,height);

Modified: branches/soc-2011-tomato/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h
===================================================================
--- branches/soc-2011-tomato/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h	2011-10-09 20:26:56 UTC (rev 40877)
+++ branches/soc-2011-tomato/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h	2011-10-09 20:28:29 UTC (rev 40878)
@@ -91,7 +91,7 @@
       \note This is the reference implementation using floating point images.
   */
   void Distort(const float* src, float* dst,
-               int width, int height, int channels);
+               int width, int height, double overscan, int channels);
   /*!
       Distort an image using the current camera instrinsics
 
@@ -101,7 +101,7 @@
       \note This version is much faster.
   */
   void Distort(const unsigned char* src, unsigned char* dst,
-               int width, int height, int channels);
+               int width, int height, double overscan, int channels);
   /*!
       Undistort an image using the current camera instrinsics
 
@@ -111,7 +111,7 @@
       \note This is the reference implementation using floating point images.
   */
   void Undistort(const float* src, float* dst,
-                 int width, int height, int channels);
+                 int width, int height, double overscan, int channels);
   /*!
       Undistort an image using the current camera instrinsics
 
@@ -121,12 +121,12 @@
       \note This version is much faster.
   */
   void Undistort(const unsigned char* src, unsigned char* dst,
-                 int width, int height, int channels);
+                 int width, int height, double overscan, int channels);
 
  private:
-  template<typename WarpFunction> void ComputeLookupGrid(struct Grid* grid, int width, int height);
-  void CheckUndistortLookupGrid(int width, int height);
-  void CheckDistortLookupGrid(int width, int height);
+  template<typename WarpFunction> void ComputeLookupGrid(struct Grid* grid, int width, int height, double overscan);
+  void CheckUndistortLookupGrid(int width, int height, double overscan);
+  void CheckDistortLookupGrid(int width, int height, double overscan);
   void FreeLookupGrid();
 
   // The traditional intrinsics matrix from x = K[R|t]X.

Modified: branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp
===================================================================
--- branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp	2011-10-09 20:26:56 UTC (rev 40877)
+++ branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp	2011-10-09 20:28:29 UTC (rev 40878)
@@ -592,40 +592,40 @@
 }
 
 void libmv_CameraIntrinsicsUndistortByte(struct libmv_CameraIntrinsics *libmvIntrinsics,
-			unsigned char *src, unsigned char *dst, int width, int height, int channels)
+			unsigned char *src, unsigned char *dst, int width, int height, float overscan, int channels)
 {
 	libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics;
 
-	intrinsics->Undistort(src, dst, width, height, channels);
+	intrinsics->Undistort(src, dst, width, height, overscan, channels);
 }
 
 void libmv_CameraIntrinsicsUndistortFloat(struct libmv_CameraIntrinsics *libmvIntrinsics,
-			float *src, float *dst, int width, int height, int channels)
+			float *src, float *dst, int width, int height, float overscan, int channels)
 {
 	libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics;
 
-	intrinsics->Undistort(src, dst, width, height, channels);
+	intrinsics->Undistort(src, dst, width, height, overscan, channels);
 }
 
 void libmv_CameraIntrinsicsDistortByte(struct libmv_CameraIntrinsics *libmvIntrinsics,
-			unsigned char *src, unsigned char *dst, int width, int height, int channels)
+			unsigned char *src, unsigned char *dst, int width, int height, float overscan, int channels)
 {
 	libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics;
-	intrinsics->Distort(src, dst, width, height, channels);
+	intrinsics->Distort(src, dst, width, height, overscan, channels);
 }
 
 void libmv_CameraIntrinsicsDistortFloat(struct libmv_CameraIntrinsics *libmvIntrinsics,
-			float *src, float *dst, int width, int height, int channels)
+			float *src, float *dst, int width, int height, float overscan, int channels)
 {
 	libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics;
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list