diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-10-10 00:28:29 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-10-10 00:28:29 +0400 |
commit | 6f42be1e70a4293f90742624128b2487df72be97 (patch) | |
tree | 93b5c41c85446c9b7d0c3d90078dfc3a23f8c0a0 /extern/libmv | |
parent | 855885425c2efd17859fb94d421140d27a100aba (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/libmv')
-rw-r--r-- | extern/libmv/libmv-capi.cpp | 32 | ||||
-rw-r--r-- | extern/libmv/libmv-capi.h | 10 | ||||
-rw-r--r-- | extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc | 46 | ||||
-rw-r--r-- | extern/libmv/libmv/simple_pipeline/camera_intrinsics.h | 14 | ||||
-rw-r--r-- | extern/libmv/patches/overscan.patch | 182 | ||||
-rw-r--r-- | extern/libmv/patches/series | 1 |
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 |