[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38820] branches/soc-2011-tomato: Camera tracking integration
Sergey Sharybin
g.ulairi at gmail.com
Fri Jul 29 17:25:00 CEST 2011
Revision: 38820
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38820
Author: nazgul
Date: 2011-07-29 15:25:00 +0000 (Fri, 29 Jul 2011)
Log Message:
-----------
Camera tracking integration
===========================
Implemented 2D stabilization:
- Based on average point of several tracks.
- Tracks for stabilization are controllable from
"2D stabilization" panel.
- Implemented autoscaling. Could fail if average point is
too close to frame boundary.
- Background clip in 3D viewport and MovieClip input
compositor nodes are using stable shot.
Some internal weak things:
- Stable shots aren't cached in moviecache. There is
only one "slot" for stable shot inside stabilization
structure.
- This could fail if several threads are requested different
frames (for example when starting playback, pause to make
Nodes Editor trigger refresh, continue playback).
- Due to it shouldn't crash i decided to implement better
caching for stable shots a bit later.
Modified Paths:
--------------
branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py
branches/soc-2011-tomato/source/blender/blenkernel/BKE_movieclip.h
branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
branches/soc-2011-tomato/source/blender/blenkernel/intern/depsgraph.c
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/blenloader/intern/readfile.c
branches/soc-2011-tomato/source/blender/editors/include/ED_clip.h
branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c
branches/soc-2011-tomato/source/blender/editors/space_clip/clip_editor.c
branches/soc-2011-tomato/source/blender/editors/space_clip/clip_intern.h
branches/soc-2011-tomato/source/blender/editors/space_clip/clip_ops.c
branches/soc-2011-tomato/source/blender/editors/space_clip/space_clip.c
branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c
branches/soc-2011-tomato/source/blender/editors/space_view3d/view3d_draw.c
branches/soc-2011-tomato/source/blender/makesdna/DNA_space_types.h
branches/soc-2011-tomato/source/blender/makesdna/DNA_tracking_types.h
branches/soc-2011-tomato/source/blender/makesrna/intern/rna_tracking.c
branches/soc-2011-tomato/source/blender/nodes/intern/CMP_nodes/CMP_movieclip.c
branches/soc-2011-tomato/source/blender/nodes/intern/CMP_util.h
Modified: branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py
===================================================================
--- branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py 2011-07-29 15:18:14 UTC (rev 38819)
+++ branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py 2011-07-29 15:25:00 UTC (rev 38820)
@@ -350,6 +350,44 @@
layout.prop(clip, "display_aspect", text="")
+class CLIP_PT_stabilization(bpy.types.Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'UI'
+ bl_label = "2D Stabilization"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+
+ return sc.clip
+
+ def draw_header(self, context):
+ sc = context.space_data
+ tracking = sc.clip.tracking
+ stab = tracking.stabilization
+
+ self.layout.prop(stab, "use_2d_stabilization", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ sc = context.space_data
+ tracking = sc.clip.tracking
+ stab = tracking.stabilization
+
+ layout.active = stab.use_2d_stabilization
+
+ layout.prop(stab, "use_autoscale")
+
+ row = layout.row()
+ row.template_list(stab, "tracks", stab, "active_track_index", rows=3)
+
+ sub = row.column(align=True)
+ sub.operator("clip.stabilize_2d_add", icon='ZOOMIN', text="")
+ sub.operator("clip.stabilize_2d_remove", icon='ZOOMOUT', text="")
+ sub.menu('CLIP_MT_stabilize_2d_specials', text="", icon="DOWNARROW_HLT")
+
+
class CLIP_PT_footage(bpy.types.Panel):
bl_space_type = 'CLIP_EDITOR'
bl_region_type = 'UI'
@@ -588,5 +626,14 @@
layout.operator('clip.track_copy_color', icon='COPY_ID')
+class CLIP_MT_stabilize_2d_specials(bpy.types.Menu):
+ bl_label = "Track Color Specials"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator('clip.stabilize_2d_select')
+
+
if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_movieclip.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_movieclip.h 2011-07-29 15:18:14 UTC (rev 38819)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_movieclip.h 2011-07-29 15:25:00 UTC (rev 38820)
@@ -48,6 +48,7 @@
void BKE_movieclip_reload(struct MovieClip *clip);
struct ImBuf *BKE_movieclip_acquire_ibuf(struct MovieClip *clip, struct MovieClipUser *user);
+struct ImBuf *BKE_movieclip_acquire_stable_ibuf(struct MovieClip *clip, struct MovieClipUser *user, float mat[4][4]);
void BKE_movieclip_acquire_size(struct MovieClip *clip, struct MovieClipUser *user, int *width, int *height);
int BKE_movieclip_has_frame(struct MovieClip *clip, struct MovieClipUser *user);
void BKE_movieclip_user_set_frame(struct MovieClipUser *user, int framenr);
Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h 2011-07-29 15:18:14 UTC (rev 38819)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h 2011-07-29 15:25:00 UTC (rev 38820)
@@ -87,6 +87,8 @@
struct MovieTrackingTrack *BKE_tracking_indexed_bundle(struct MovieTracking *tracking, int bundlenr);
+struct ImBuf *BKE_tracking_stabelize_shot(struct MovieTracking *tracking, int framenr, struct ImBuf *ibuf, float mat[4][4]);
+
#define TRACK_SELECTED(track) (((track->flag&TRACK_HIDDEN)==0) && ((track)->flag&SELECT || (track)->pat_flag&SELECT || (track)->search_flag&SELECT))
#define TRACK_AREA_SELECTED(track, area) (((track->flag&TRACK_HIDDEN)==0) && ((area)==TRACK_AREA_POINT?(track)->flag&SELECT : ((area)==TRACK_AREA_PAT?(track)->pat_flag&SELECT:(track)->search_flag&SELECT)))
Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/depsgraph.c 2011-07-29 15:18:14 UTC (rev 38819)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/depsgraph.c 2011-07-29 15:25:00 UTC (rev 38820)
@@ -2482,6 +2482,8 @@
}
if(idtype == ID_MC) {
+ bNode *node;
+
for(obt=bmain->object.first; obt; obt= obt->id.next){
bConstraint *con;
for (con = obt->constraints.first; con; con=con->next) {
@@ -2492,6 +2494,12 @@
}
}
}
+
+ for(node= sce->nodetree->nodes.first; node; node= node->next) {
+ if(node->id==id) {
+ NodeTagChanged(sce->nodetree, node);
+ }
+ }
}
/* camera's matrix is used to orient reconstructed stuff,
Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/movieclip.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/movieclip.c 2011-07-29 15:18:14 UTC (rev 38819)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/movieclip.c 2011-07-29 15:25:00 UTC (rev 38820)
@@ -321,6 +321,42 @@
return ibuf;
}
+ImBuf *BKE_movieclip_acquire_stable_ibuf(MovieClip *clip, MovieClipUser *user, float mat[4][4])
+{
+ ImBuf *ibuf, *stableibuf;
+ int framenr= user?user->framenr:clip->lastframe;
+
+ ibuf= BKE_movieclip_acquire_ibuf(clip, user);
+
+ if(clip->tracking.stabilization.flag&TRACKING_2D_STABILIZATION) {
+ MovieTrackingStabilization *stab= &clip->tracking.stabilization;
+
+ BLI_lock_thread(LOCK_MOVIECLIP);
+
+ if(user->framenr!=stab->framenr)
+ stab->ibufok= 0;
+
+ stableibuf= BKE_tracking_stabelize_shot(&clip->tracking, framenr, ibuf, mat);
+
+ stab->framenr= user->framenr;
+
+ BLI_unlock_thread(LOCK_MOVIECLIP);
+ } else {
+ if(mat)
+ unit_m4(mat);
+
+ stableibuf= ibuf;
+ }
+
+ if(stableibuf!=ibuf) {
+ IMB_freeImBuf(ibuf);
+ ibuf= stableibuf;
+ }
+
+ return ibuf;
+
+}
+
int BKE_movieclip_has_frame(MovieClip *clip, MovieClipUser *user)
{
ImBuf *ibuf= BKE_movieclip_acquire_ibuf(clip, user);
@@ -389,6 +425,9 @@
/* clear cache */
free_buffers(clip);
+ clip->tracking.stabilization.ok= 0;
+ clip->tracking.stabilization.ibufok= 0;
+
/* update clip source */
if(BLI_testextensie_array(clip->name, imb_ext_movie)) clip->source= MCLIP_SRC_MOVIE;
else clip->source= MCLIP_SRC_SEQUENCE;
Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c 2011-07-29 15:18:14 UTC (rev 38819)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c 2011-07-29 15:25:00 UTC (rev 38820)
@@ -33,6 +33,7 @@
#include <stddef.h>
#include <limits.h>
#include <math.h>
+#include <memory.h>
#include "MEM_guardedalloc.h"
@@ -449,6 +450,12 @@
if(tracking->camera.reconstructed)
MEM_freeN(tracking->camera.reconstructed);
+
+ if(tracking->stabilization.ibuf)
+ IMB_freeImBuf(tracking->stabilization.ibuf);
+
+ if(tracking->stabilization.scaleibuf)
+ IMB_freeImBuf(tracking->stabilization.scaleibuf);
}
/*********************** tracking *************************/
@@ -1211,3 +1218,227 @@
return NULL;
}
+
+static int stabilization_median_point(MovieTracking *tracking, int framenr, float median[2])
+{
+ int ok= 0;
+ float min[2], max[2];
+ MovieTrackingTrack *track;
+
+ INIT_MINMAX2(min, max);
+
+ track= tracking->tracks.first;
+ while(track) {
+ if(track->flag&TRACK_USE_2D_STAB) {
+ MovieTrackingMarker *marker= BKE_tracking_get_marker(track, framenr);
+
+ DO_MINMAX2(marker->pos, min, max);
+
+ ok= 1;
+ }
+
+ track= track->next;
+ }
+
+ median[0]= (max[0]+min[0])/2.f;
+ median[1]= (max[1]+min[1])/2.f;
+
+ return ok;
+}
+
+static float stabilization_auto_scale_factor(MovieTracking *tracking)
+{
+ float firstmedian[2];
+ MovieTrackingStabilization *stab= &tracking->stabilization;
+
+ if(stab->ok)
+ return stab->scale;
+
+ if(stabilization_median_point(tracking, 1, firstmedian)) {
+ int sfra= INT_MAX, efra= INT_MIN, cfra;
+ float delta[2]= {0.f, 0.f}, scalex, scaley, near[2]={1.f, 1.f};
+ MovieTrackingTrack *track;
+
+ track= tracking->tracks.first;
+ while(track) {
+ if(track->flag&TRACK_USE_2D_STAB) {
+ if(track->markersnr) {
+ sfra= MIN2(sfra, track->markers[0].framenr);
+ efra= MAX2(efra, track->markers[track->markersnr-1].framenr);
+ }
+ }
+
+ track= track->next;
+ }
+
+ for(cfra=sfra; cfra<=efra; cfra++) {
+ float median[2], d[2];
+
+ stabilization_median_point(tracking, cfra, median);
+
+ sub_v2_v2v2(d, firstmedian, median);
+ d[0]= fabsf(d[0]);
+ d[1]= fabsf(d[1]);
+
+ delta[0]= MAX2(delta[0], d[0]);
+ delta[1]= MAX2(delta[1], d[1]);
+
+ near[0]= MIN3(near[0], median[0], 1.f-median[0]);
+ near[1]= MIN3(near[1], median[1], 1.f-median[1]);
+ }
+
+ near[0]= MAX2(near[0], 0.05);
+ near[1]= MAX2(near[1], 0.05);
+
+ scalex= 1.f+delta[0]/near[0];
+ scaley= 1.f+delta[1]/near[1];
+
+ stab->scale= MAX2(scalex, scaley);
+ } else {
+ stab->scale= 1.f;
+ }
+
+ stab->ok= 1;
+
+ return stab->scale;
+}
+
+static void calculate_stabmat(MovieTrackingStabilization *stab, float width, float height,
+ float firstmedian[2], float curmedian[2], float mat[4][4])
+{
+ unit_m4(mat);
+
+ mat[0][0]= stab->scale;
+ mat[1][1]= stab->scale;
+ mat[3][0]= (firstmedian[0]-curmedian[0])*width*stab->scale;
+ mat[3][1]= (firstmedian[1]-curmedian[1])*height*stab->scale;
+
+ mat[3][0]-= (firstmedian[0]*stab->scale-firstmedian[0])*width;
+ mat[3][1]-= (firstmedian[1]*stab->scale-firstmedian[1])*height;
+ /*mat[3][0]-= (width*stab->scale-width)/2.0f;
+ mat[3][1]-= (height*stab->scale-height)/2.0f;*/
+
+}
+
+static int stabelize_need_recalc(MovieTracking *tracking, float width, float height,
+ float firstmedian[2], float curmedian[2], float mat[4][4])
+{
+ float stabmat[4][4];
+ MovieTrackingStabilization *stab= &tracking->stabilization;
+
+ if(!mat)
+ return 1;
+
+ if(stab->flag&TRACKING_AUTOSCALE)
+ stabilization_auto_scale_factor(tracking);
+
+ calculate_stabmat(stab, width, height, firstmedian, curmedian, stabmat);
+
+ return memcmp(mat, stabmat, sizeof(float)*16);
+}
+
+static ImBuf* stabelize_acquire_ibuf(ImBuf *cacheibuf, ImBuf *srcibuf, int fill)
+{
+ int flags;
+
+ if(cacheibuf && (cacheibuf->x != srcibuf->x || cacheibuf->y != srcibuf->y)) {
+ IMB_freeImBuf(cacheibuf);
+ cacheibuf= NULL;
+ }
+
+ flags= IB_rect;
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list