forked from bartvdbraak/blender
Camera tracking integration: more code cleanup
This commit is contained in:
parent
55d0cb04aa
commit
d30987fd59
33
extern/libmv/libmv-capi.cpp
vendored
33
extern/libmv/libmv-capi.cpp
vendored
@ -59,13 +59,6 @@
|
|||||||
# define snprintf _snprintf
|
# define snprintf _snprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DEFAULT_WINDOW_HALFSIZE 5
|
|
||||||
|
|
||||||
typedef struct libmv_RegionTracker {
|
|
||||||
libmv::EsmRegionTracker *klt_region_tracker;
|
|
||||||
libmv::RegionTracker *region_tracker;
|
|
||||||
} libmv_RegionTracker;
|
|
||||||
|
|
||||||
typedef struct libmv_Reconstruction {
|
typedef struct libmv_Reconstruction {
|
||||||
libmv::EuclideanReconstruction reconstruction;
|
libmv::EuclideanReconstruction reconstruction;
|
||||||
|
|
||||||
@ -113,22 +106,18 @@ void libmv_setLoggingVerbosity(int verbosity)
|
|||||||
|
|
||||||
/* ************ RegionTracker ************ */
|
/* ************ RegionTracker ************ */
|
||||||
|
|
||||||
libmv_RegionTracker *libmv_regionTrackerNew(int max_iterations, int pyramid_level)
|
libmv_RegionTracker *libmv_regionTrackerNew(int max_iterations, int pyramid_level, int half_window_size)
|
||||||
{
|
{
|
||||||
libmv::EsmRegionTracker *klt_region_tracker = new libmv::EsmRegionTracker;
|
libmv::EsmRegionTracker *klt_region_tracker = new libmv::EsmRegionTracker;
|
||||||
|
|
||||||
klt_region_tracker->half_window_size = DEFAULT_WINDOW_HALFSIZE;
|
klt_region_tracker->half_window_size = half_window_size;
|
||||||
klt_region_tracker->max_iterations = max_iterations;
|
klt_region_tracker->max_iterations = max_iterations;
|
||||||
klt_region_tracker->min_determinant = 1e-4;
|
klt_region_tracker->min_determinant = 1e-4;
|
||||||
|
|
||||||
libmv::PyramidRegionTracker *region_tracker =
|
libmv::PyramidRegionTracker *region_tracker =
|
||||||
new libmv::PyramidRegionTracker(klt_region_tracker, pyramid_level);
|
new libmv::PyramidRegionTracker(klt_region_tracker, pyramid_level);
|
||||||
|
|
||||||
libmv_RegionTracker *configured_region_tracker = new libmv_RegionTracker;
|
return (libmv_RegionTracker *)region_tracker;
|
||||||
configured_region_tracker->klt_region_tracker = klt_region_tracker;
|
|
||||||
configured_region_tracker->region_tracker = region_tracker;
|
|
||||||
|
|
||||||
return configured_region_tracker;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void floatBufToImage(const float *buf, int width, int height, libmv::FloatImage *image)
|
static void floatBufToImage(const float *buf, int width, int height, libmv::FloatImage *image)
|
||||||
@ -270,18 +259,11 @@ static void saveBytesImage(char *prefix, unsigned char *data, int width, int hei
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int libmv_regionTrackerTrack(libmv_RegionTracker *libmv_tracker, const float *ima1, const float *ima2,
|
int libmv_regionTrackerTrack(libmv_RegionTracker *libmv_tracker, const float *ima1, const float *ima2,
|
||||||
int width, int height, int half_window_size,
|
int width, int height, double x1, double y1, double *x2, double *y2)
|
||||||
double x1, double y1, double *x2, double *y2)
|
|
||||||
{
|
{
|
||||||
libmv::RegionTracker *region_tracker;
|
libmv::RegionTracker *region_tracker = (libmv::RegionTracker *)libmv_tracker;
|
||||||
libmv::EsmRegionTracker *klt_region_tracker;
|
|
||||||
libmv::FloatImage old_patch, new_patch;
|
libmv::FloatImage old_patch, new_patch;
|
||||||
|
|
||||||
klt_region_tracker = libmv_tracker->klt_region_tracker;
|
|
||||||
region_tracker = libmv_tracker->region_tracker;
|
|
||||||
|
|
||||||
klt_region_tracker->half_window_size = half_window_size;
|
|
||||||
|
|
||||||
floatBufToImage(ima1, width, height, &old_patch);
|
floatBufToImage(ima1, width, height, &old_patch);
|
||||||
floatBufToImage(ima2, width, height, &new_patch);
|
floatBufToImage(ima2, width, height, &new_patch);
|
||||||
|
|
||||||
@ -304,8 +286,9 @@ int libmv_regionTrackerTrack(libmv_RegionTracker *libmv_tracker, const float *im
|
|||||||
|
|
||||||
void libmv_regionTrackerDestroy(libmv_RegionTracker *libmv_tracker)
|
void libmv_regionTrackerDestroy(libmv_RegionTracker *libmv_tracker)
|
||||||
{
|
{
|
||||||
delete libmv_tracker->region_tracker;
|
libmv::RegionTracker *region_tracker= (libmv::RegionTracker *)libmv_tracker;
|
||||||
delete libmv_tracker;
|
|
||||||
|
delete region_tracker;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************ Tracks ************ */
|
/* ************ Tracks ************ */
|
||||||
|
5
extern/libmv/libmv-capi.h
vendored
5
extern/libmv/libmv-capi.h
vendored
@ -43,10 +43,9 @@ void libmv_startDebugLogging(void);
|
|||||||
void libmv_setLoggingVerbosity(int verbosity);
|
void libmv_setLoggingVerbosity(int verbosity);
|
||||||
|
|
||||||
/* RegionTracker */
|
/* RegionTracker */
|
||||||
struct libmv_RegionTracker *libmv_regionTrackerNew(int max_iterations, int pyramid_level);
|
struct libmv_RegionTracker *libmv_regionTrackerNew(int max_iterations, int pyramid_level, int half_window_size);
|
||||||
int libmv_regionTrackerTrack(struct libmv_RegionTracker *libmv_tracker, const float *ima1, const float *ima2,
|
int libmv_regionTrackerTrack(struct libmv_RegionTracker *libmv_tracker, const float *ima1, const float *ima2,
|
||||||
int width, int height, int half_window_size,
|
int width, int height, double x1, double y1, double *x2, double *y2);
|
||||||
double x1, double y1, double *x2, double *y2);
|
|
||||||
void libmv_regionTrackerDestroy(struct libmv_RegionTracker *libmv_tracker);
|
void libmv_regionTrackerDestroy(struct libmv_RegionTracker *libmv_tracker);
|
||||||
|
|
||||||
/* SAD Tracker */
|
/* SAD Tracker */
|
||||||
|
@ -118,10 +118,6 @@ void BKE_tracking_clamp_track(MovieTrackingTrack *track, int event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(event==CLAMP_SEARCH_DIM) {
|
else if(event==CLAMP_SEARCH_DIM) {
|
||||||
float max_pyramid_level_factor = 1.0;
|
|
||||||
if (track->tracker == TRACKER_KLT) {
|
|
||||||
max_pyramid_level_factor = 1 << (track->pyramid_levels - 1);
|
|
||||||
}
|
|
||||||
for(a= 0; a<2; a++) {
|
for(a= 0; a<2; a++) {
|
||||||
/* search shouldn't be resized smaller than pattern */
|
/* search shouldn't be resized smaller than pattern */
|
||||||
track->search_min[a]= MIN2(pat_min[a], track->search_min[a]);
|
track->search_min[a]= MIN2(pat_min[a], track->search_min[a]);
|
||||||
@ -144,7 +140,6 @@ void BKE_tracking_clamp_track(MovieTrackingTrack *track, int event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(event==CLAMP_PYRAMID_LEVELS || (event==CLAMP_SEARCH_DIM && track->tracker == TRACKER_KLT)) {
|
else if(event==CLAMP_PYRAMID_LEVELS || (event==CLAMP_SEARCH_DIM && track->tracker == TRACKER_KLT)) {
|
||||||
float dim[2];
|
float dim[2];
|
||||||
sub_v2_v2v2(dim, track->pat_max, track->pat_min);
|
sub_v2_v2v2(dim, track->pat_max, track->pat_min);
|
||||||
@ -616,18 +611,23 @@ MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *u
|
|||||||
float search_size_y= (track->search_max[1]-track->search_min[1])*height;
|
float search_size_y= (track->search_max[1]-track->search_min[1])*height;
|
||||||
float pattern_size_x= (track->pat_max[0]-track->pat_min[0])*width;
|
float pattern_size_x= (track->pat_max[0]-track->pat_min[0])*width;
|
||||||
float pattern_size_y= (track->pat_max[1]-track->pat_min[1])*height;
|
float pattern_size_y= (track->pat_max[1]-track->pat_min[1])*height;
|
||||||
|
int wndx, wndy;
|
||||||
|
|
||||||
/* compute the maximum pyramid size */
|
/* compute the maximum pyramid size */
|
||||||
double search_to_pattern_ratio= MIN2(search_size_x, search_size_y)
|
float search_to_pattern_ratio= MIN2(search_size_x, search_size_y)
|
||||||
/ MAX2(pattern_size_x, pattern_size_y);
|
/ MAX2(pattern_size_x, pattern_size_y);
|
||||||
double log2_search_to_pattern_ratio = log(floor(search_to_pattern_ratio)) / M_LN2;
|
float log2_search_to_pattern_ratio = log(floor(search_to_pattern_ratio)) / M_LN2;
|
||||||
int max_pyramid_levels= floor(log2_search_to_pattern_ratio + 1);
|
int max_pyramid_levels= floor(log2_search_to_pattern_ratio + 1);
|
||||||
|
|
||||||
/* try to accomodate the user's choice of pyramid level in a way
|
/* try to accomodate the user's choice of pyramid level in a way
|
||||||
* that doesn't cause the coarsest pyramid pattern to be larger
|
* that doesn't cause the coarsest pyramid pattern to be larger
|
||||||
* than the search size */
|
* than the search size */
|
||||||
int level= MIN2(track_context->track->pyramid_levels, max_pyramid_levels);
|
int level= MIN2(track_context->track->pyramid_levels, max_pyramid_levels);
|
||||||
track_context->region_tracker= libmv_regionTrackerNew(100, level);
|
|
||||||
|
wndx= (int)((track->pat_max[0]-track->pat_min[0])*width)/2;
|
||||||
|
wndy= (int)((track->pat_max[1]-track->pat_min[1])*height)/2;
|
||||||
|
|
||||||
|
track_context->region_tracker= libmv_regionTrackerNew(100, level, MAX2(wndx, wndy));
|
||||||
}
|
}
|
||||||
else if(track_context->track->tracker==TRACKER_SAD) {
|
else if(track_context->track->tracker==TRACKER_SAD) {
|
||||||
/* nothing to initialize */
|
/* nothing to initialize */
|
||||||
@ -877,7 +877,7 @@ static ImBuf *get_keyframed_ibuf(MovieTrackingContext *context, MovieTrackingTra
|
|||||||
while(a>=0 && a<track->markersnr) {
|
while(a>=0 && a<track->markersnr) {
|
||||||
int next= (context->backwards) ? a+1 : a-1;
|
int next= (context->backwards) ? a+1 : a-1;
|
||||||
int is_keyframed= 0;
|
int is_keyframed= 0;
|
||||||
MovieTrackingMarker *marker= &track->markers[a];
|
MovieTrackingMarker *cur_marker= &track->markers[a];
|
||||||
MovieTrackingMarker *next_marker= NULL;
|
MovieTrackingMarker *next_marker= NULL;
|
||||||
|
|
||||||
if(next>=0 && next<track->markersnr)
|
if(next>=0 && next<track->markersnr)
|
||||||
@ -887,11 +887,11 @@ static ImBuf *get_keyframed_ibuf(MovieTrackingContext *context, MovieTrackingTra
|
|||||||
if(next_marker && next_marker->flag&MARKER_DISABLED)
|
if(next_marker && next_marker->flag&MARKER_DISABLED)
|
||||||
is_keyframed= 1;
|
is_keyframed= 1;
|
||||||
|
|
||||||
is_keyframed|= (marker->flag&MARKER_TRACKED)==0;
|
is_keyframed|= (cur_marker->flag&MARKER_TRACKED)==0;
|
||||||
|
|
||||||
if(is_keyframed) {
|
if(is_keyframed) {
|
||||||
framenr= marker->framenr;
|
framenr= cur_marker->framenr;
|
||||||
*marker_keyed= marker;
|
*marker_keyed= cur_marker;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1077,7 +1077,6 @@ int BKE_tracking_next(MovieTrackingContext *context)
|
|||||||
onbound= 1;
|
onbound= 1;
|
||||||
}
|
}
|
||||||
else if(track_context->track->tracker==TRACKER_KLT) {
|
else if(track_context->track->tracker==TRACKER_KLT) {
|
||||||
int wndx, wndy;
|
|
||||||
float *patch_new;
|
float *patch_new;
|
||||||
|
|
||||||
if(need_readjust) {
|
if(need_readjust) {
|
||||||
@ -1100,11 +1099,8 @@ int BKE_tracking_next(MovieTrackingContext *context)
|
|||||||
x2= pos[0];
|
x2= pos[0];
|
||||||
y2= pos[1];
|
y2= pos[1];
|
||||||
|
|
||||||
wndx= (int)((track->pat_max[0]-track->pat_min[0])*ibuf_new->x)/2;
|
|
||||||
wndy= (int)((track->pat_max[1]-track->pat_min[1])*ibuf_new->y)/2;
|
|
||||||
|
|
||||||
tracked= libmv_regionTrackerTrack(track_context->region_tracker, track_context->patch, patch_new,
|
tracked= libmv_regionTrackerTrack(track_context->region_tracker, track_context->patch, patch_new,
|
||||||
width, height, MAX2(wndx, wndy), x1, y1, &x2, &y2);
|
width, height, x1, y1, &x2, &y2);
|
||||||
|
|
||||||
MEM_freeN(patch_new);
|
MEM_freeN(patch_new);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user