[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