Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/extern
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2011-10-10 00:28:29 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2011-10-10 00:28:29 +0400
commit6f42be1e70a4293f90742624128b2487df72be97 (patch)
tree93b5c41c85446c9b7d0c3d90078dfc3a23f8c0a0 /extern
parent855885425c2efd17859fb94d421140d27a100aba (diff)
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.
Diffstat (limited to 'extern')
-rw-r--r--extern/libmv/libmv-capi.cpp32
-rw-r--r--extern/libmv/libmv-capi.h10
-rw-r--r--extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc46
-rw-r--r--extern/libmv/libmv/simple_pipeline/camera_intrinsics.h14
-rw-r--r--extern/libmv/patches/overscan.patch182
-rw-r--r--extern/libmv/patches/series1
6 files changed, 238 insertions, 47 deletions
diff --git a/extern/libmv/libmv-capi.cpp b/extern/libmv/libmv-capi.cpp
index c3d3c02b043..8bf27ac0656 100644
--- a/extern/libmv/libmv-capi.cpp
+++ b/extern/libmv/libmv-capi.cpp
@@ -592,40 +592,40 @@ void libmv_CameraIntrinsicsUpdate(struct libmv_CameraIntrinsics *libmvIntrinsics
}
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;
- intrinsics->Distort(src, dst, width, height, channels);
+ intrinsics->Distort(src, dst, width, height, overscan, channels);
}
/* ************ distortion ************ */
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)
+ unsigned char *src, unsigned char *dst, int width, int height, float overscan, int channels)
{
libmv::CameraIntrinsics intrinsics;
@@ -633,11 +633,11 @@ void libmv_undistortByte(double focal_length, double principal_x, double princip
intrinsics.SetPrincipalPoint(principal_x, principal_y);
intrinsics.SetRadialDistortion(k1, k2, k3);
- intrinsics.Undistort(src, dst, width, height, channels);
+ intrinsics.Undistort(src, dst, width, height, overscan, channels);
}
void libmv_undistortFloat(double focal_length, double principal_x, double principal_y, double k1, double k2, double k3,
- 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;
@@ -645,11 +645,11 @@ void libmv_undistortFloat(double focal_length, double principal_x, double princi
intrinsics.SetPrincipalPoint(principal_x, principal_y);
intrinsics.SetRadialDistortion(k1, k2, k3);
- intrinsics.Undistort(src, dst, width, height, channels);
+ intrinsics.Undistort(src, dst, width, height, overscan, channels);
}
void libmv_distortByte(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)
+ unsigned char *src, unsigned char *dst, int width, int height, float overscan, int channels)
{
libmv::CameraIntrinsics intrinsics;
@@ -657,11 +657,11 @@ void libmv_distortByte(double focal_length, double principal_x, double principal
intrinsics.SetPrincipalPoint(principal_x, principal_y);
intrinsics.SetRadialDistortion(k1, k2, k3);
- intrinsics.Distort(src, dst, width, height, channels);
+ intrinsics.Distort(src, dst, width, height, overscan, channels);
}
void libmv_distortFloat(double focal_length, double principal_x, double principal_y, double k1, double k2, double k3,
- 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;
@@ -669,7 +669,7 @@ void libmv_distortFloat(double focal_length, double principal_x, double principa
intrinsics.SetPrincipalPoint(principal_x, principal_y);
intrinsics.SetRadialDistortion(k1, k2, k3);
- intrinsics.Distort(src, dst, width, height, channels);
+ intrinsics.Distort(src, dst, width, height, overscan, channels);
}
/* ************ utils ************ */
diff --git a/extern/libmv/libmv-capi.h b/extern/libmv/libmv-capi.h
index e0a40a1ad86..8f2a57748b2 100644
--- a/extern/libmv/libmv-capi.h
+++ b/extern/libmv/libmv-capi.h
@@ -84,22 +84,24 @@ struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsNew(double focal_length, do
struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsCopy(struct libmv_CameraIntrinsics *libmvIntrinsics);
+struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsCopy(struct libmv_CameraIntrinsics *libmvIntrinsics);
+
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, int width, int height);
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);
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);
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);
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);
/* dsitortion */
void libmv_undistortByte(double focal_length, double principal_x, double principal_y, double k1, double k2, double k3,
diff --git a/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc b/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc
index 110a16d1812..366129dd3d2 100644
--- a/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc
+++ b/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc
@@ -31,6 +31,7 @@ struct Offset {
struct Grid {
struct Offset *offset;
int width, height;
+ double overscan;
};
static struct Grid *copyGrid(struct Grid *from)
@@ -42,6 +43,7 @@ static struct Grid *copyGrid(struct Grid *from)
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 @@ void CameraIntrinsics::InvertIntrinsics(double image_x,
// 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 @@ struct InvertIntrinsicsFunction {
}
};
-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 @@ void CameraIntrinsics::CheckDistortLookupGrid(int width, int height)
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 @@ void CameraIntrinsics::CheckUndistortLookupGrid(int width, int height)
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 @@ void CameraIntrinsics::Distort(const float* src, float* dst, int width, int heig
//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 @@ void CameraIntrinsics::Distort(const unsigned char* src, unsigned char* dst, int
//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 @@ void CameraIntrinsics::Undistort(const float* src, float* dst, int width, int he
//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);
diff --git a/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h b/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h
index f5255713e89..f4bf903c36c 100644
--- a/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h
+++ b/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h
@@ -91,7 +91,7 @@ class CameraIntrinsics {
\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 @@ class CameraIntrinsics {
\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 @@ class CameraIntrinsics {
\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 @@ class CameraIntrinsics {
\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.
diff --git a/extern/libmv/patches/overscan.patch b/extern/libmv/patches/overscan.patch
new file mode 100644
index 00000000000..c68f36804ec
--- /dev/null
+++ b/extern/libmv/patches/overscan.patch
@@ -0,0 +1,182 @@
+diff --git a/src/libmv/simple_pipeline/camera_intrinsics.cc b/src/libmv/simple_pipeline/camera_intrinsics.cc
+index 110a16d..366129d 100644
+--- a/src/libmv/simple_pipeline/camera_intrinsics.cc
++++ b/src/libmv/simple_pipeline/camera_intrinsics.cc
+@@ -31,6 +31,7 @@ struct Offset {
+ struct Grid {
+ struct Offset *offset;
+ int width, height;
++ double overscan;
+ };
+
+ static struct Grid *copyGrid(struct Grid *from)
+@@ -42,6 +43,7 @@ static struct Grid *copyGrid(struct Grid *from)
+
+ 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 @@ void CameraIntrinsics::InvertIntrinsics(double image_x,
+
+ // 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 @@ struct InvertIntrinsicsFunction {
+ }
+ };
+
+-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 @@ void CameraIntrinsics::CheckDistortLookupGrid(int width, int height)
+
+ 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 @@ void CameraIntrinsics::CheckUndistortLookupGrid(int width, int height)
+
+ 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 @@ void CameraIntrinsics::Distort(const float* src, float* dst, int width, int heig
+ //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 @@ void CameraIntrinsics::Distort(const unsigned char* src, unsigned char* dst, int
+ //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 @@ void CameraIntrinsics::Undistort(const float* src, float* dst, int width, int he
+ //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);
+diff --git a/src/libmv/simple_pipeline/camera_intrinsics.h b/src/libmv/simple_pipeline/camera_intrinsics.h
+index f525571..f4bf903 100644
+--- a/src/libmv/simple_pipeline/camera_intrinsics.h
++++ b/src/libmv/simple_pipeline/camera_intrinsics.h
+@@ -91,7 +91,7 @@ class CameraIntrinsics {
+ \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 @@ class CameraIntrinsics {
+ \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 @@ class CameraIntrinsics {
+ \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 @@ class CameraIntrinsics {
+ \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.
diff --git a/extern/libmv/patches/series b/extern/libmv/patches/series
index 8f785a659cf..410a14ca135 100644
--- a/extern/libmv/patches/series
+++ b/extern/libmv/patches/series
@@ -9,3 +9,4 @@ high_distortion_crash_fix.patch
mingw.patch
msvc2010.patch
scaled_distortion.patch
+overscan.patch