[Bf-blender-cvs] [889bbb0] soc-2016-multiview: make an independent multiview reconstruction pipeline for multiview
Tianwei Shen
noreply at git.blender.org
Wed Jun 1 18:05:39 CEST 2016
Commit: 889bbb03c42afb3a733a3a2a0f536e6b15612eeb
Author: Tianwei Shen
Date: Thu Jun 2 00:05:20 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB889bbb03c42afb3a733a3a2a0f536e6b15612eeb
make an independent multiview reconstruction pipeline for multiview
===================================================================
M source/blender/blenkernel/BKE_tracking.h
M source/blender/blenkernel/intern/tracking_correspondence.c
M source/blender/editors/space_clip/tracking_ops_correspondence.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h
index 36b4a81..6548d95 100644
--- a/source/blender/blenkernel/BKE_tracking.h
+++ b/source/blender/blenkernel/BKE_tracking.h
@@ -36,6 +36,7 @@ struct bGPDlayer;
struct ImBuf;
struct ListBase;
struct MovieReconstructContext;
+struct MovieMultiviewReconstructContext;
struct MovieTrackingTrack;
struct MovieTrackingCorrespondence;
struct MovieTrackingMarker;
diff --git a/source/blender/blenkernel/intern/tracking_correspondence.c b/source/blender/blenkernel/intern/tracking_correspondence.c
index b1c4e3c..290f9a9 100644
--- a/source/blender/blenkernel/intern/tracking_correspondence.c
+++ b/source/blender/blenkernel/intern/tracking_correspondence.c
@@ -30,14 +30,272 @@
* This file contains blender-side correspondence functions for witness camera support
*/
+#include <limits.h>
+
+#include "MEM_guardedalloc.h"
#include "DNA_movieclip_types.h"
#include "DNA_object_types.h" /* SELECT */
+#include "DNA_anim_types.h"
#include "BLI_utildefines.h"
+#include "BLI_listbase.h"
+#include "BLI_string.h"
+#include "BLI_math.h"
#include "BKE_tracking.h"
+#include "BKE_fcurve.h"
+#include "BKE_movieclip.h"
+
+#include "RNA_access.h"
#include "IMB_imbuf_types.h"
#include "libmv-capi.h"
+#include "tracking_private.h"
+
+struct ReconstructProgressData;
+
+typedef struct MovieMultiviewReconstructContext {
+ struct libmv_Tracks *tracks;
+ bool select_keyframes;
+ int keyframe1, keyframe2;
+ int refine_flags;
+
+ struct libmv_Reconstruction *reconstruction;
+
+ char object_name[MAX_NAME];
+ bool is_camera;
+ short motion_flag;
+
+ libmv_CameraIntrinsicsOptions camera_intrinsics_options;
+
+ float reprojection_error;
+
+ TracksMap *tracks_map;
+
+ int sfra, efra;
+} MovieMultiviewReconstructContext;
+
+typedef struct MultiviewReconstructProgressData {
+ short *stop;
+ short *do_update;
+ float *progress;
+ char *stats_message;
+ int message_size;
+} MultiviewReconstructProgressData;
+
+/* Convert blender's multiview refinement flags to libmv's.
+ * These refined flags would be the same as the single view version
+ */
+static int multiview_refine_intrinsics_get_flags(MovieTracking *tracking, MovieTrackingObject *object)
+{
+ int refine = tracking->settings.refine_camera_intrinsics;
+ int flags = 0;
+
+ if ((object->flag & TRACKING_OBJECT_CAMERA) == 0)
+ return 0;
+
+ if (refine & REFINE_FOCAL_LENGTH)
+ flags |= LIBMV_REFINE_FOCAL_LENGTH;
+
+ if (refine & REFINE_PRINCIPAL_POINT)
+ flags |= LIBMV_REFINE_PRINCIPAL_POINT;
+
+ if (refine & REFINE_RADIAL_DISTORTION_K1)
+ flags |= LIBMV_REFINE_RADIAL_DISTORTION_K1;
+
+ if (refine & REFINE_RADIAL_DISTORTION_K2)
+ flags |= LIBMV_REFINE_RADIAL_DISTORTION_K2;
+
+ return flags;
+}
+
+/* Create new libmv Tracks structure from blender's tracks list. */
+static struct libmv_Tracks *libmv_multiview_tracks_new(MovieClip *clip, ListBase *tracksbase, int width, int height)
+{
+ int tracknr = 0;
+ MovieTrackingTrack *track;
+ struct libmv_Tracks *tracks = libmv_tracksNew();
+
+ track = tracksbase->first;
+ while (track) {
+ FCurve *weight_fcurve;
+ int a = 0;
+
+ weight_fcurve = id_data_find_fcurve(&clip->id, track, &RNA_MovieTrackingTrack,
+ "weight", 0, NULL);
+
+ for (a = 0; a < track->markersnr; a++) {
+ MovieTrackingMarker *marker = &track->markers[a];
+
+ if ((marker->flag & MARKER_DISABLED) == 0) {
+ float weight = track->weight;
+
+ if (weight_fcurve) {
+ int scene_framenr =
+ BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr);
+ weight = evaluate_fcurve(weight_fcurve, scene_framenr);
+ }
+
+ libmv_tracksInsert(tracks, marker->framenr, tracknr,
+ (marker->pos[0] + track->offset[0]) * width,
+ (marker->pos[1] + track->offset[1]) * height,
+ weight);
+ }
+ }
+
+ track = track->next;
+ tracknr++;
+ }
+
+ return tracks;
+}
+
+
+/* Create context for camera/object motion reconstruction.
+ * Copies all data needed for reconstruction from movie
+ * clip datablock, so editing this clip is safe during
+ * reconstruction job is in progress.
+ */
+MovieMultiviewReconstructContext *
+BKE_tracking_multiview_reconstruction_context_new(MovieClip *clip,
+ MovieTrackingObject *object,
+ int keyframe1, int keyframe2,
+ int width, int height)
+{
+ MovieTracking *tracking = &clip->tracking;
+ MovieMultiviewReconstructContext *context = MEM_callocN(sizeof(MovieMultiviewReconstructContext),
+ "MovieMultiviewReconstructContext data");
+ ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object);
+ float aspy = 1.0f / tracking->camera.pixel_aspect;
+ int num_tracks = BLI_listbase_count(tracksbase);
+ int sfra = INT_MAX, efra = INT_MIN;
+ MovieTrackingTrack *track;
+
+ BLI_strncpy(context->object_name, object->name, sizeof(context->object_name));
+ context->is_camera = object->flag & TRACKING_OBJECT_CAMERA;
+ context->motion_flag = tracking->settings.motion_flag;
+
+ context->select_keyframes =
+ (tracking->settings.reconstruction_flag & TRACKING_USE_KEYFRAME_SELECTION) != 0;
+
+ tracking_cameraIntrinscisOptionsFromTracking(tracking,
+ width, height,
+ &context->camera_intrinsics_options);
+
+ context->tracks_map = tracks_map_new(context->object_name, context->is_camera, num_tracks, 0);
+
+ track = tracksbase->first;
+ while (track) {
+ int first = 0, last = track->markersnr - 1;
+ MovieTrackingMarker *first_marker = &track->markers[0];
+ MovieTrackingMarker *last_marker = &track->markers[track->markersnr - 1];
+
+ /* find first not-disabled marker */
+ while (first <= track->markersnr - 1 && first_marker->flag & MARKER_DISABLED) {
+ first++;
+ first_marker++;
+ }
+
+ /* find last not-disabled marker */
+ while (last >= 0 && last_marker->flag & MARKER_DISABLED) {
+ last--;
+ last_marker--;
+ }
+
+ if (first <= track->markersnr - 1)
+ sfra = min_ii(sfra, first_marker->framenr);
+
+ if (last >= 0)
+ efra = max_ii(efra, last_marker->framenr);
+
+ tracks_map_insert(context->tracks_map, track, NULL);
+
+ track = track->next;
+ }
+
+ context->sfra = sfra;
+ context->efra = efra;
+
+ context->tracks = libmv_multiview_tracks_new(clip, tracksbase, width, height * aspy);
+ context->keyframe1 = keyframe1;
+ context->keyframe2 = keyframe2;
+ context->refine_flags = multiview_refine_intrinsics_get_flags(tracking, object);
+
+ return context;
+}
+
+/* Fill in multiview reconstruction options structure from reconstruction context. */
+static void reconstructionOptionsFromContext(libmv_ReconstructionOptions *reconstruction_options,
+ MovieMultiviewReconstructContext *context)
+{
+ reconstruction_options->select_keyframes = context->select_keyframes;
+
+ reconstruction_options->keyframe1 = context->keyframe1;
+ reconstruction_options->keyframe2 = context->keyframe2;
+
+ reconstruction_options->refine_intrinsics = context->refine_flags;
+}
+
+/* Callback which is called from libmv side to update progress in the interface. */
+static void multiview_reconstruct_update_solve_cb(void *customdata, double progress, const char *message)
+{
+ MultiviewReconstructProgressData *progressdata = customdata;
+
+ if (progressdata->progress) {
+ *progressdata->progress = progress;
+ *progressdata->do_update = true;
+ }
+
+ BLI_snprintf(progressdata->stats_message, progressdata->message_size, "Solving cameras | %s", message);
+}
+
+/* Solve camera/object motion and reconstruct 3D markers position
+ * from a prepared reconstruction context from multiple views.
+ *
+ * stop is not actually used at this moment, so reconstruction
+ * job could not be stopped.
+ *
+ * do_update, progress and stat_message are set by reconstruction
+ * callback in libmv side and passing to an interface.
+ */
+void BKE_tracking_multiview_reconstruction_solve(MovieMultiviewReconstructContext *context, short *stop, short *do_update,
+ float *progress, char *stats_message, int message_size)
+{
+ float error;
+
+ MultiviewReconstructProgressData progressdata;
+
+ libmv_ReconstructionOptions reconstruction_options;
+
+ progressdata.stop = stop;
+ progressdata.do_update = do_update;
+ progressdata.progress = progress;
+ progressdata.stats_message = stats_message;
+ progressdata.message_size = message_size;
+
+ reconstructionOptionsFromContext(&reconstruction_options, context);
+
+ if (context->motion_flag & TRACKING_MOTION_MODAL) {
+ context->reconstruction = libmv_solveModal(context->tracks,
+ &context->camera_intrinsics_options,
+ &reconstruction_options,
+ multiview_reconstruct_update_solve_cb, &progressdata);
+ }
+ else {
+ context->reconstruction = libmv_solveReconstruction(context->tracks,
+ &context->camera_intrinsics_options,
+ &reconstruction_options,
+ multiview_reconstruct_update_solve_cb, &progressdata);
+
+ if (context->select_keyframes) {
+ /* store actual keyframes used for reconstruction to update them in the interface later */
+ context->keyframe1 = reconstruction_options.keyframe1;
+ context->keyframe2 = reconstruction_options.keyframe2;
+ }
+ }
+
+ error = libmv_reprojectionError(context->reconstruction);
+ context->reprojection_error = error;
+}
diff --git a/source/blender/editors/space_clip/tracking_ops_correspondence.c b/source/blender/editors/space_clip/tracking_ops_correspondence.c
index 9506f54..820f0be 100644
--- a/source/blender/editors/space_clip/tracking_ops_correspondence.c
+++ b/source/blender/editors/space_clip/tracking_ops_correspondence.c
@@ -231,6 +231,7 @@ void CLIP_OT_delete_correspondence(wmOpera
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list