forked from bartvdbraak/blender
183 lines
8.5 KiB
Diff
183 lines
8.5 KiB
Diff
|
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.
|