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
diff options
context:
space:
mode:
Diffstat (limited to 'extern/libmv/patches/overscan.patch')
-rw-r--r--extern/libmv/patches/overscan.patch182
1 files changed, 182 insertions, 0 deletions
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.