From 8fb37629cd3a516b8f2391f3e8e66bfe47d6de9f Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sat, 15 Oct 2011 19:30:51 +0000 Subject: Camera tracking integration =========================== Some improvements for feature detectors: - Sort features by score when filtering features by distance using FAST library. - Added option to place markers only in areas outlined by grease pencil. --- source/blender/blenkernel/BKE_tracking.h | 7 +- source/blender/blenkernel/intern/tracking.c | 112 +++++++++++++++++++++++----- 2 files changed, 98 insertions(+), 21 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h index 0e29bb44181..6cf00b704ac 100644 --- a/source/blender/blenkernel/BKE_tracking.h +++ b/source/blender/blenkernel/BKE_tracking.h @@ -34,6 +34,7 @@ * \author Sergey Sharybin */ +struct bGPDlayer; struct ImBuf; struct MovieTrackingTrack; struct MovieTrackingMarker; @@ -87,7 +88,11 @@ void BKE_tracking_projection_matrix(struct MovieTracking *tracking, int framenr, void BKE_tracking_apply_intrinsics(struct MovieTracking *tracking, float co[2], float nco[2]); void BKE_tracking_invert_intrinsics(struct MovieTracking *tracking, float co[2], float nco[2]); -void BKE_tracking_detect(struct MovieTracking *tracking, struct ImBuf *imbuf, int framenr, int margin, int min_trackness, int count, int min_distance, int fast); +void BKE_tracking_detect_fast(struct MovieTracking *tracking, struct ImBuf *imbuf, + int framenr, int margin, int min_trackness, int min_distance, struct bGPDlayer *layer); + +void BKE_tracking_detect_moravec(struct MovieTracking *tracking, struct ImBuf *imbuf, + int framenr, int margin, int count, int min_distance, struct bGPDlayer *layer); struct MovieTrackingTrack *BKE_tracking_indexed_bundle(struct MovieTracking *tracking, int bundlenr); diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 9f5478df0b1..3208450f5a4 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -37,6 +37,7 @@ #include "MEM_guardedalloc.h" +#include "DNA_gpencil_types.h" #include "DNA_movieclip_types.h" #include "DNA_object_types.h" /* SELECT */ #include "DNA_scene_types.h" @@ -1495,7 +1496,6 @@ void BKE_tracking_invert_intrinsics(MovieTracking *tracking, float co[2], float } #ifdef WITH_LIBMV -/* flips upside-down */ static unsigned char *acquire_ucharbuf(ImBuf *ibuf) { int x, y; @@ -1504,18 +1504,16 @@ static unsigned char *acquire_ucharbuf(ImBuf *ibuf) fp= pixels= MEM_callocN(ibuf->x*ibuf->y*sizeof(unsigned char), "tracking ucharBuf"); for(y= 0; yy; y++) { for (x= 0; xx; x++) { - int pixel= ibuf->x*(ibuf->y-y-1) + x; + int pixel= ibuf->x*y + x; if(ibuf->rect_float) { float *rrgbf= ibuf->rect_float + pixel*4; - //*fp= 0.2126f*rrgbf[0] + 0.7152f*rrgbf[1] + 0.0722f*rrgbf[2]; - *fp= (11*rrgbf[0]+16*rrgbf[1]+5*rrgbf[2])/32; + *fp= 0.2126f*rrgbf[0] + 0.7152f*rrgbf[1] + 0.0722f*rrgbf[2]; } else { char *rrgb= (char*)ibuf->rect + pixel*4; - //*fp= 0.2126f*rrgb[0] + 0.7152f*rrgb[1] + 0.0722f*rrgb[2]; - *fp= (11*rrgb[0]+16*rrgb[1]+5*rrgb[2])/32; + *fp= 0.2126f*rrgb[0] + 0.7152f*rrgb[1] + 0.0722f*rrgb[2]; } fp++; @@ -1526,32 +1524,106 @@ static unsigned char *acquire_ucharbuf(ImBuf *ibuf) } #endif -void BKE_tracking_detect(MovieTracking *tracking, ImBuf *ibuf, int framenr, int margin, int min_trackness, int count, int min_distance, int fast) +static int point_in_stroke(bGPDstroke *stroke, float x, float y) { -#ifdef WITH_LIBMV - struct libmv_Features *features; - unsigned char *pixels= acquire_ucharbuf(ibuf); - int a; + int i, prev; + int count= 0; + bGPDspoint *points= stroke->points; - if(fast) - features= libmv_detectFeaturesFAST(pixels, ibuf->x, ibuf->y, ibuf->x, margin, min_trackness, min_distance); - else - features= libmv_detectFeaturesMORAVEC(pixels, ibuf->x, ibuf->y, ibuf->x, margin, count, min_distance); + prev= stroke->totpoints-1; - MEM_freeN(pixels); + for(i= 0; itotpoints; i++) { + if((points[i].y=y) || (points[prev].y=y)) { + float fac= (y-points[i].y)/(points[prev].y-points[i].y); + + if (points[i].x+fac*(points[prev].x-points[i].x)frames.first; + + while(frame) { + bGPDstroke *stroke= frame->strokes.first; + while(stroke) { + if(point_in_stroke(stroke, x, y)) + return 1; + + stroke= stroke->next; + } + frame= frame->next; + } + + return 0; +} + +static void retrive_libmv_features(MovieTracking *tracking, struct libmv_Features *features, + int framenr, int width, int height, bGPDlayer *layer) +{ +#ifdef WITH_LIBMV + int a; a= libmv_countFeatures(features); while(a--) { MovieTrackingTrack *track; double x, y, size, score; + int ok= 1; + float xu, yu; libmv_getFeature(features, a, &x, &y, &score, &size); - track= BKE_tracking_add_track(tracking, x/ibuf->x, 1.0f-(y/ibuf->y), framenr, ibuf->x, ibuf->y); - track->flag|= SELECT; - track->pat_flag|= SELECT; - track->search_flag|= SELECT; + xu= x/width; + yu= y/height; + + if(layer) + ok= point_in_layer(layer, xu, yu); + + if(ok) { + track= BKE_tracking_add_track(tracking, xu, yu, framenr, width, height); + track->flag|= SELECT; + track->pat_flag|= SELECT; + track->search_flag|= SELECT; + } } +#endif +} + +void BKE_tracking_detect_fast(MovieTracking *tracking, ImBuf *ibuf, + int framenr, int margin, int min_trackness, int min_distance, bGPDlayer *layer) +{ +#ifdef WITH_LIBMV + struct libmv_Features *features; + unsigned char *pixels= acquire_ucharbuf(ibuf); + + features= libmv_detectFeaturesFAST(pixels, ibuf->x, ibuf->y, ibuf->x, margin, min_trackness, min_distance); + + MEM_freeN(pixels); + + retrive_libmv_features(tracking, features, framenr, ibuf->x, ibuf->y, layer); + + libmv_destroyFeatures(features); +#endif +} + +void BKE_tracking_detect_moravec(MovieTracking *tracking, ImBuf *ibuf, + int framenr, int margin, int count, int min_distance, bGPDlayer *layer) +{ +#ifdef WITH_LIBMV + struct libmv_Features *features; + unsigned char *pixels= acquire_ucharbuf(ibuf); + + features= libmv_detectFeaturesMORAVEC(pixels, ibuf->x, ibuf->y, ibuf->x, margin, count, min_distance); + + MEM_freeN(pixels); + + retrive_libmv_features(tracking, features, framenr, ibuf->x, ibuf->y, layer); libmv_destroyFeatures(features); #endif -- cgit v1.2.3