[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46621] branches/soc-2011-tomato/source/ blender: Start migrating away from pat_min and pat_max for markers

Keir Mierle mierle at gmail.com
Mon May 14 12:47:26 CEST 2012


Revision: 46621
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46621
Author:   keir
Date:     2012-05-14 10:47:25 +0000 (Mon, 14 May 2012)
Log Message:
-----------
Start migrating away from pat_min and pat_max for markers

This starts converting markers in the movie clip editor / 2D
tracker from using pat_min and pat_max notation to using the
a more general, 4-corner representation. There is still
considerable porting work to do; in particular:

- The preview widget does not respect the new
  representation
- The corners cannot yet be edited individually.
- The clamping does not do the right thing for general
  corners; e.g. detecting a convex quad.
- The tracking code in Blender does not actually invoke the
  corner tracking version of libmv's tracking API.

Next steps:

- Convert libmv's legacy ESM tracker and brute tracker to
  work under the new TrackRegion() API.
- Make Blender use the new TrackRegion() API; this will
  allow real planar tracking tests.
- Everything else (UI, etc).

This patch is mostly the work of Sergey Sharybin.

Modified Paths:
--------------
    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/blenloader/intern/readfile.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/clip_buttons.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.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/transform/transform_conversions.c
    branches/soc-2011-tomato/source/blender/makesdna/DNA_tracking_types.h

Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2012-05-13 23:29:49 UTC (rev 46620)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2012-05-14 10:47:25 UTC (rev 46621)
@@ -57,6 +57,7 @@
                                                        struct MovieTrackingMarker *marker);
 void BKE_tracking_delete_marker(struct MovieTrackingTrack *track, int framenr);
 
+void BKE_tracking_marker_pattern_minmax(struct MovieTrackingMarker *marker, float min[2], float max[2]);
 struct MovieTrackingMarker *BKE_tracking_get_marker(struct MovieTrackingTrack *track, int framenr);
 struct MovieTrackingMarker *BKE_tracking_ensure_marker(struct MovieTrackingTrack *track, int framenr);
 struct MovieTrackingMarker *BKE_tracking_exact_marker(struct MovieTrackingTrack *track, int framenr);

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/movieclip.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/movieclip.c	2012-05-13 23:29:49 UTC (rev 46620)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/movieclip.c	2012-05-14 10:47:25 UTC (rev 46621)
@@ -1076,10 +1076,18 @@
 			}
 
 			if ((track->flag & TRACK_LOCKED) == 0) {
+				float pat_min[2], pat_max[2];
+
 				scopes->marker = marker;
 				scopes->track = track;
-				scopes->slide_scale[0] = track->pat_max[0] - track->pat_min[0];
-				scopes->slide_scale[1] = track->pat_max[1] - track->pat_min[1];
+
+				/* XXX: would work fine with non-transformed patterns, but would likely fail
+				 *      with transformed patterns, but that would be easier to debug when
+				 *      we'll have real pattern sampling (at least to test) */
+				BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max);
+
+				scopes->slide_scale[0] = pat_max[0] - pat_min[0];
+				scopes->slide_scale[1] = pat_max[1] - pat_min[1];
 			}
 		}
 	}

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2012-05-13 23:29:49 UTC (rev 46620)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2012-05-14 10:47:25 UTC (rev 46621)
@@ -102,59 +102,67 @@
 void BKE_tracking_clamp_track(MovieTrackingTrack *track, int event)
 {
 	int a;
-	float pat_min[2];
-	float pat_max[2];
+	float pat_min[2], pat_max[2];
+	float eff_pat_min[2], eff_pat_max[2];
 	float max_pyramid_level_factor = 1.0;
 
 	if (track->tracker == TRACKER_KLT) {
 		max_pyramid_level_factor = 1 << (track->pyramid_levels - 1);
 	}
 
-	/* sort */
-	for (a = 0; a < 2; a++) {
-		if (track->pat_min[a] > track->pat_max[a])
-			SWAP(float, track->pat_min[a], track->pat_max[a]);
+	/* XXX: currently search area is global, pattern size is per-marker, so we'll need to
+	 *      find maximal size of pattern to clamp search size nicely */
+	INIT_MINMAX2(pat_min, pat_max);
 
-		if (track->search_min[a] > track->search_max[a])
-			SWAP(float, track->search_min[a], track->search_max[a]);
+	for (a = 0; a < track->markersnr; a++) {
+		float cur_pat_min[2], cur_pat_max[2];
+
+		BKE_tracking_marker_pattern_minmax(&track->markers[a], cur_pat_min, cur_pat_max);
+
+		DO_MINMAX2(cur_pat_min, pat_min, pat_max);
+		DO_MINMAX2(cur_pat_max, pat_min, pat_max);
 	}
 
 	/* compute the effective pattern size, which differs from the fine resolution
 	 * pattern size for the pyramid KLT tracker */
 	for (a = 0; a < 2; a++) {
-		pat_min[a] = max_pyramid_level_factor * track->pat_min[a];
-		pat_max[a] = max_pyramid_level_factor * track->pat_max[a];
+		eff_pat_min[a] = max_pyramid_level_factor * pat_min[a];
+		eff_pat_max[a] = max_pyramid_level_factor * pat_max[a];
 	}
 
 	if (event == CLAMP_PAT_DIM) {
 		for (a = 0; a < 2; a++) {
 			/* search shouldn't be resized smaller than pattern */
-			track->search_min[a] = MIN2(pat_min[a], track->search_min[a]);
-			track->search_max[a] = MAX2(pat_max[a], track->search_max[a]);
+			track->search_min[a] = MIN2(eff_pat_min[a], track->search_min[a]);
+			track->search_max[a] = MAX2(eff_pat_max[a], track->search_max[a]);
 		}
 	}
 	else if (event == CLAMP_PAT_POS) {
 		float dim[2];
 
-		sub_v2_v2v2(dim, track->pat_max, track->pat_min);
+		sub_v2_v2v2(dim, pat_max, pat_min);
 
+#if 0
+		/* XXX: needs porting, but we need to know marker here, will be ported after a bit
+		 *      more global refactoring */
 		for (a = 0; a < 2; a++) {
 			/* pattern shouldn't be moved outside of search */
-			if (pat_min[a] < track->search_min[a]) {
-				track->pat_min[a] = track->search_min[a] - (pat_min[a] - track->pat_min[a]);
+			if (eff_pat_min[a] < track->search_min[a]) {
+				track->pat_min[a] = track->search_min[a] - (eff_pat_min[a] - pat_min[a]);
 				track->pat_max[a] = track->pat_min[a] + dim[a];
 			}
-			if (track->pat_max[a] > track->search_max[a]) {
-				track->pat_max[a] = track->search_max[a] - (pat_max[a] - track->pat_max[a]);
+			if (eff_pat_max[a] > track->search_max[a]) {
+				track->pat_max[a] = track->search_max[a] - (eff_pat_max[a] - pat_max[a]);
 				track->pat_min[a] = track->pat_max[a] - dim[a];
 			}
 		}
+#endif
 	}
 	else if (event == CLAMP_SEARCH_DIM) {
 		for (a = 0; a < 2; a++) {
 			/* search shouldn't be resized smaller than pattern */
-			track->search_min[a] = MIN2(pat_min[a], track->search_min[a]);
-			track->search_max[a] = MAX2(pat_max[a], track->search_max[a]);
+			track->search_min[a] = MIN2(eff_pat_min[a], track->search_min[a]);
+			track->search_max[a] = MAX2(eff_pat_max[a], track->search_max[a]);
 		}
 	}
 	else if (event == CLAMP_SEARCH_POS) {
@@ -164,42 +172,30 @@
 
 		for (a = 0; a < 2; a++) {
 			/* search shouldn't be moved inside pattern */
-			if (track->search_min[a] > pat_min[a]) {
-				track->search_min[a] = pat_min[a];
+			if (track->search_min[a] > eff_pat_min[a]) {
+				track->search_min[a] = eff_pat_min[a];
 				track->search_max[a] = track->search_min[a] + dim[a];
 			}
-			if (track->search_max[a] < pat_max[a]) {
-				track->search_max[a] = pat_max[a];
+			if (track->search_max[a] < eff_pat_max[a]) {
+				track->search_max[a] = eff_pat_max[a];
 				track->search_min[a] = track->search_max[a] - dim[a];
 			}
 		}
 	}
 	else if (event == CLAMP_PYRAMID_LEVELS || (event == CLAMP_SEARCH_DIM && track->tracker == TRACKER_KLT)) {
 		float dim[2];
-		sub_v2_v2v2(dim, track->pat_max, track->pat_min);
+		sub_v2_v2v2(dim, pat_max, pat_min);
 		{
 			float search_ratio = 2.3f * max_pyramid_level_factor;
 
 			/* resize the search area to something sensible based
 			 * on the number of pyramid levels */
 			for (a = 0; a < 2; a++) {
-				track->search_min[a] = search_ratio * track->pat_min[a];
-				track->search_max[a] = search_ratio * track->pat_max[a];
+				track->search_min[a] = search_ratio * pat_min[a];
+				track->search_max[a] = search_ratio * pat_max[a];
 			}
 		}
 	}
-
-	/* marker's center should be in center of pattern */
-	if (event == CLAMP_PAT_DIM || event == CLAMP_PAT_POS) {
-		float dim[2];
-
-		sub_v2_v2v2(dim, track->pat_max, track->pat_min);
-
-		for (a = 0; a < 2; a++) {
-			track->pat_min[a] = -dim[a] / 2.0f;
-			track->pat_max[a] = dim[a] / 2.0f;
-		}
-	}
 }
 
 void BKE_tracking_track_flag(MovieTrackingTrack *track, int area, int flag, int clear)
@@ -258,9 +254,15 @@
 	marker.pos[1] = y;
 	marker.framenr = framenr;
 
-	copy_v2_v2(track->pat_max, pat);
-	negate_v2_v2(track->pat_min, pat);
+	marker.pattern_corners[0][0] = -pat[0];
+	marker.pattern_corners[0][1] = -pat[1];
 
+	marker.pattern_corners[1][0] = pat[0];
+	marker.pattern_corners[1][1] = -pat[1];
+
+	negate_v2_v2(marker.pattern_corners[2], marker.pattern_corners[0]);
+	negate_v2_v2(marker.pattern_corners[3], marker.pattern_corners[1]);
+
 	copy_v2_v2(track->search_max, search);
 	negate_v2_v2(track->search_min, search);
 
@@ -337,6 +339,16 @@
 	}
 }
 
+void BKE_tracking_marker_pattern_minmax(MovieTrackingMarker *marker, float min[2], float max[2])
+{
+	INIT_MINMAX2(min, max);
+
+	DO_MINMAX2(marker->pattern_corners[0], min, max);
+	DO_MINMAX2(marker->pattern_corners[1], min, max);
+	DO_MINMAX2(marker->pattern_corners[2], min, max);
+	DO_MINMAX2(marker->pattern_corners[3], min, max);
+}
+
 MovieTrackingMarker *BKE_tracking_get_marker(MovieTrackingTrack *track, int framenr)
 {
 	int a = track->markersnr - 1;
@@ -1002,29 +1014,39 @@
 
 #ifdef WITH_LIBMV
 					{
-						float patx = (int)((track->pat_max[0] - track->pat_min[0]) * width),
-						      paty = (int)((track->pat_max[1] - track->pat_min[1]) * height);
+						float search_size_x, search_size_y;
+						float pattern_size_x, pattern_size_y;
+						float pat_min[2], pat_max[2], patx, paty;
+						float search_to_pattern_ratio, log2_search_to_pattern_ratio;
+						int wndx, wndy, half_wnd, max_pyramid_levels, level;
 
-						float search_size_x = (track->search_max[0] - track->search_min[0]) * width;
-						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_y = (track->pat_max[1] - track->pat_min[1]) * height;
-						int wndx = (int)patx / 2, wndy = (int)paty / 2;
-						int half_wnd = MAX2(wndx, wndy);
+						struct libmv_RegionTracker *region_tracker;
 
-							/* compute the maximum pyramid size */
-						float search_to_pattern_ratio = MIN2(search_size_x,  search_size_y)
-							/ MAX2(pattern_size_x, pattern_size_y);
-						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);
+						/* XXX: use boundbox of marker's pattern for now
+						 *      no idea how it should behave with non-affine tracking */
+						BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max);
 
+						patx = (int)((pat_max[0] - pat_min[0]) * width);
+						paty = (int)((pat_max[1] - pat_min[1]) * height);
+						wndx = (int)patx / 2;
+						wndy = (int)paty / 2;
+						half_wnd = MAX2(wndx, wndy);
+
+						search_size_x = (track->search_max[0] - track->search_min[0]) * width;
+						search_size_y = (track->search_max[1] - track->search_min[1]) * height;
+						pattern_size_x = (pat_max[0] - pat_min[0]) * width;
+						pattern_size_y = (pat_max[1] - pat_min[1]) * height;
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list