[Bf-blender-cvs] [be6643b] master: Followup to the previous commit

Sergey Sharybin noreply at git.blender.org
Tue Jan 28 13:02:28 CET 2014


Commit: be6643b5ec01c8f64a1065762c38ce8803b717c0
Author: Sergey Sharybin
Date:   Tue Jan 28 18:01:03 2014 +0600
https://developer.blender.org/rBbe6643b5ec01c8f64a1065762c38ce8803b717c0

Followup to the previous commit

Need to take weight into account when drawing per-frame track
reprojection curve and when computing per-track average error.

===================================================================

M	extern/libmv/libmv-capi.cc
M	source/blender/blenkernel/BKE_tracking.h
M	source/blender/blenkernel/intern/tracking.c
M	source/blender/editors/space_clip/clip_graph_draw.c

===================================================================

diff --git a/extern/libmv/libmv-capi.cc b/extern/libmv/libmv-capi.cc
index 9a536f7..5bc159c 100644
--- a/extern/libmv/libmv-capi.cc
+++ b/extern/libmv/libmv-capi.cc
@@ -760,18 +760,19 @@ double libmv_reprojectionErrorForTrack(const struct libmv_Reconstruction *libmv_
 	double total_error = 0.0;
 
 	for (int i = 0; i < markers.size(); ++i) {
+		double weight = markers[i].weight;
 		const libmv::EuclideanCamera *camera = reconstruction->CameraForImage(markers[i].image);
 		const libmv::EuclideanPoint *point = reconstruction->PointForTrack(markers[i].track);
 
-		if (!camera || !point) {
+		if (!camera || !point || weight == 0.0) {
 			continue;
 		}
 
 		num_reprojected++;
 
 		libmv::Marker reprojected_marker = ProjectMarker(*point, *camera, *intrinsics);
-		double ex = reprojected_marker.x - markers[i].x;
-		double ey = reprojected_marker.y - markers[i].y;
+		double ex = (reprojected_marker.x - markers[i].x) * weight;
+		double ey = (reprojected_marker.y - markers[i].y) * weight;
 
 		total_error += sqrt(ex * ex + ey * ey);
 	}
diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h
index 62149bb..081547f 100644
--- a/source/blender/blenkernel/BKE_tracking.h
+++ b/source/blender/blenkernel/BKE_tracking.h
@@ -98,6 +98,8 @@ struct MovieTrackingTrack *BKE_tracking_track_get_active(struct MovieTracking *t
 float *BKE_tracking_track_get_mask(int frame_width, int frame_height, struct MovieTrackingTrack *track,
                                    struct MovieTrackingMarker *marker);
 
+float BKE_tracking_track_get_weight_for_marker(struct MovieClip *clip, struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker);
+
 /* selection */
 void BKE_tracking_track_select(struct ListBase *tracksbase, struct MovieTrackingTrack *track, int area, bool extend);
 void BKE_tracking_track_deselect(struct MovieTrackingTrack *track, int area);
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index e019093..ab314d8 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -864,6 +864,23 @@ float *BKE_tracking_track_get_mask(int frame_width, int frame_height,
 	return mask;
 }
 
+float BKE_tracking_track_get_weight_for_marker(MovieClip *clip, MovieTrackingTrack *track, MovieTrackingMarker *marker)
+{
+	FCurve *weight_fcurve;
+	float weight = track->weight;
+
+	weight_fcurve = id_data_find_fcurve(&clip->id, track, &RNA_MovieTrackingTrack,
+	                                    "weight", 0, NULL);
+
+	if (weight_fcurve) {
+		int scene_framenr =
+			BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr);
+		weight = evaluate_fcurve(weight_fcurve, scene_framenr);
+	}
+
+	return weight;
+}
+
 /* area - which part of marker should be selected. see TRACK_AREA_* constants */
 void BKE_tracking_track_select(ListBase *tracksbase, MovieTrackingTrack *track, int area, bool extend)
 {
diff --git a/source/blender/editors/space_clip/clip_graph_draw.c b/source/blender/editors/space_clip/clip_graph_draw.c
index 16845bb..67c8bd8 100644
--- a/source/blender/editors/space_clip/clip_graph_draw.c
+++ b/source/blender/editors/space_clip/clip_graph_draw.c
@@ -192,6 +192,7 @@ static void draw_tracks_motion_curves(View2D *v2d, SpaceClip *sc)
 }
 
 typedef struct TrackErrorCurveUserData {
+	MovieClip *clip;
 	MovieTracking *tracking;
 	MovieTrackingObject *tracking_object;
 	MovieTrackingTrack *active_track;
@@ -210,6 +211,7 @@ static void tracking_error_segment_point_cb(void *userdata,
 		TrackErrorCurveUserData *data = (TrackErrorCurveUserData *) userdata;
 		float reprojected_position[4], bundle_position[4], marker_position[2], delta[2];
 		float reprojection_error;
+		float weight = BKE_tracking_track_get_weight_for_marker(data->clip, track, marker);
 
 		if (!data->matrix_initialized || data->matrix_frame != scene_framenr) {
 			BKE_tracking_get_projection_matrix(data->tracking, data->tracking_object,
@@ -232,7 +234,7 @@ static void tracking_error_segment_point_cb(void *userdata,
 		marker_position[1] = (marker->pos[1] + track->offset[1]) * data->height * data->aspy;
 
 		sub_v2_v2v2(delta, reprojected_position, marker_position);
-		reprojection_error = len_v2(delta);
+		reprojection_error = len_v2(delta) * track->weight;
 
 		glVertex2f(scene_framenr, reprojection_error);
 	}
@@ -273,6 +275,7 @@ static void draw_tracks_error_curves(SpaceClip *sc)
 	MovieTracking *tracking = &clip->tracking;
 	TrackErrorCurveUserData data;
 
+	data.clip = clip;
 	data.tracking = tracking;
 	data.tracking_object = BKE_tracking_object_get_active(tracking);
 	data.active_track = BKE_tracking_track_get_active(tracking);




More information about the Bf-blender-cvs mailing list