Commit: f4048ea8b16b647fee57d2ff15e99abd579e588a
Author: Tianwei Shen
Date:   Thu Jun 9 15:29:48 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rBf4048ea8b16b647fee57d2ff15e99abd579e588a

about to begin reconstruction in libmv

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

M       intern/libmv/intern/reconstructionN.cc
M       intern/libmv/intern/reconstructionN.h
M       source/blender/blenkernel/intern/tracking_correspondence.c
M       source/blender/editors/space_clip/tracking_ops_correspondence.c

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

diff --git a/intern/libmv/intern/reconstructionN.cc 
b/intern/libmv/intern/reconstructionN.cc
index 0e1e109..1c97654 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -40,10 +40,15 @@
 #include "libmv/autotrack/region.h"
 #include "libmv/autotrack/tracks.h"
 
+// TODO(tianwei): still rely on simple_pipeline/callback for now, will be 
removed
+#include "libmv/simple_pipeline/callbacks.h"
+
 using mv::Tracks;
+using mv::Marker;
 using mv::Reconstruction;
 
 using libmv::CameraIntrinsics;
+using libmv::ProgressUpdateCallback;
 
 struct libmv_ReconstructionN {
        mv::Reconstruction reconstruction;
@@ -56,37 +61,99 @@ struct libmv_ReconstructionN {
        bool is_valid;
 };
 
+namespace {
+class MultiviewReconstructUpdateCallback : public ProgressUpdateCallback {
+public:
+       MultiviewReconstructUpdateCallback(
+               multiview_reconstruct_progress_update_cb 
progress_update_callback,
+               void *callback_customdata) {
+               progress_update_callback_ = progress_update_callback;
+               callback_customdata_ = callback_customdata;
+       }
+
+       void invoke(double progress, const char* message) {
+               if (progress_update_callback_) {
+                       progress_update_callback_(callback_customdata_, 
progress, message);
+               }
+       }
+protected:
+       multiview_reconstruct_progress_update_cb progress_update_callback_;
+       void* callback_customdata_;
+};
+
+void mv_getNormalizedTracks(const Tracks &tracks,
+                            const CameraIntrinsics &camera_intrinsics,
+                            Tracks *normalized_tracks)
+{
+       libmv::vector<Marker> markers = tracks.markers();
+       for (int i = 0; i < markers.size(); ++i) {
+               Marker &marker = markers[i];
+               double normalized_x, normalized_y;
+               camera_intrinsics.InvertIntrinsics(marker.center[0], 
marker.center[1],
+                                                  &normalized_x, 
&normalized_y);
+               // TODO(tianwei): put the normalized value in marker instead? 
is this supposed to be like this?
+               marker.center[0] = normalized_x, marker.center[1] = 
normalized_y;
+               normalized_tracks->AddMarker(marker);
+       }
+}
+
+}      // end of anonymous namespace
+
+void libmv_reconstructionNDestroy(libmv_ReconstructionN* libmv_reconstructionN)
+{
+       LIBMV_OBJECT_DELETE(libmv_reconstructionN->intrinsics, 
CameraIntrinsics);
+       LIBMV_OBJECT_DELETE(libmv_reconstructionN, libmv_ReconstructionN);
+}
+
 libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
         const libmv_TracksN **all_libmv_tracks,
-        const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options,
+        const libmv_CameraIntrinsicsOptions 
*all_libmv_camera_intrinsics_options,
         libmv_MultiviewReconstructionOptions *libmv_reconstruction_options,
-        reconstruct_progress_update_cb progress_update_callback,
+        multiview_reconstruct_progress_update_cb progress_update_callback,
         void* callback_customdata)
 {
-       //libmv_ReconstructionN *libmv_reconstruction =
-       //        LIBMV_OBJECT_NEW(libmv_ReconstructionN);
-
-       //Tracks &tracks = *((Tracks *) libmv_tracks);
-       //EuclideanReconstruction &reconstruction =
-       //        libmv_reconstruction->reconstruction;
-
-       //ReconstructUpdateCallback update_callback =
-       //        ReconstructUpdateCallback(progress_update_callback,
-       //                                  callback_customdata);
-
-       ///* Retrieve reconstruction options from C-API to libmv API. */
-       //CameraIntrinsics *camera_intrinsics;
-       //camera_intrinsics = libmv_reconstruction->intrinsics =
-       //        
libmv_cameraIntrinsicsCreateFromOptions(libmv_camera_intrinsics_options);
-
-       ///* Invert the camera intrinsics/ */
-       //Tracks normalized_tracks;
-       //libmv_getNormalizedTracks(tracks, *camera_intrinsics, 
&normalized_tracks);
-
-       ///* keyframe selection. */
-       //int keyframe1 = libmv_reconstruction_options->keyframe1,
-       //        keyframe2 = libmv_reconstruction_options->keyframe2;
-
+       libmv_ReconstructionN **all_libmv_reconstruction = 
LIBMV_STRUCT_NEW(libmv_ReconstructionN*, clip_num);
+       libmv::vector<Marker> keyframe_markers;
+       int keyframe1, keyframe2;
+       for(int i = 0; i < clip_num; i++)
+       {
+               all_libmv_reconstruction[i] = 
LIBMV_OBJECT_NEW(libmv_ReconstructionN);
+               Tracks &tracks = *((Tracks *) all_libmv_tracks[i]);
+               Reconstruction &reconstruction = 
all_libmv_reconstruction[i]->reconstruction;
+
+               ///* Retrieve reconstruction options from C-API to libmv API. */
+               CameraIntrinsics *camera_intrinsics;
+               camera_intrinsics = all_libmv_reconstruction[i]->intrinsics =
+                       
libmv_cameraIntrinsicsCreateFromOptions(&all_libmv_camera_intrinsics_options[i]);
+               printf("camera %d size: %d, %d\n", i, 
camera_intrinsics->image_width(), camera_intrinsics->image_height());
+
+               ///* Invert the camera intrinsics/ */
+               Tracks normalized_tracks;
+               mv_getNormalizedTracks(tracks, *camera_intrinsics, 
&normalized_tracks);
+
+               if(i == 0)              // key frame from primary camera
+               {
+                       ///* keyframe selection. */
+                       keyframe1 = libmv_reconstruction_options->keyframe1, 
keyframe2 = libmv_reconstruction_options->keyframe2;
+                       normalized_tracks.GetMarkersForTracksInBothImages(i, 
keyframe1, i, keyframe2, &keyframe_markers);
+
+               }
+       }
+
+       printf("frames to init from: %d %d\n", keyframe1, keyframe2);
+       printf("number of markers for init: %d\n", keyframe_markers.size());
+       if (keyframe_markers.size() < 8) {
+               LG << "No enough markers to initialize from";
+               all_libmv_reconstruction[0]->is_valid = false;
+               return all_libmv_reconstruction;
+       }
+
+       // create multiview reconstruct update callback
+       MultiviewReconstructUpdateCallback update_callback =
+               MultiviewReconstructUpdateCallback(progress_update_callback,
+                                                  callback_customdata);
+
+       // TODO(tianwei): skip the automatic keyframe selection
        //if (libmv_reconstruction_options->select_keyframes) {
        //      LG << "Using automatic keyframe selection";
 
@@ -104,20 +171,7 @@ libmv_ReconstructionN** 
libmv_solveMultiviewReconstruction(const int clip_num,
        //}
 
        ///* Actual reconstruction. */
-       //LG << "frames to init from: " << keyframe1 << " " << keyframe2;
-
-       //libmv::vector<Marker> keyframe_markers =
-       //        normalized_tracks.MarkersForTracksInBothImages(keyframe1, 
keyframe2);
-
-       //LG << "number of markers for init: " << keyframe_markers.size();
-
-       //if (keyframe_markers.size() < 8) {
-       //      LG << "No enough markers to initialize from";
-       //      libmv_reconstruction->is_valid = false;
-       //      return libmv_reconstruction;
-       //}
-
-       //update_callback.invoke(0, "Initial reconstruction");
+       update_callback.invoke(0, "Initial reconstruction");
 
        //EuclideanReconstructTwoFrames(keyframe_markers, &reconstruction);
        //EuclideanBundle(normalized_tracks, &reconstruction);
@@ -149,6 +203,5 @@ libmv_ReconstructionN** 
libmv_solveMultiviewReconstruction(const int clip_num,
 
        //libmv_reconstruction->is_valid = true;
 
-       //return (libmv_Reconstruction *) libmv_reconstruction;
-       return (libmv_ReconstructionN**) NULL;
+       return all_libmv_reconstruction;
 }
diff --git a/intern/libmv/intern/reconstructionN.h 
b/intern/libmv/intern/reconstructionN.h
index 727b387..9165302 100644
--- a/intern/libmv/intern/reconstructionN.h
+++ b/intern/libmv/intern/reconstructionN.h
@@ -41,12 +41,17 @@ typedef struct libmv_MultiviewReconstructionOptions {
        int *all_refine_intrinsics;             /* this should be an array 
since each clip has its own refine_flags */
 } libmv_MultiviewReconstructionOptions;
 
-libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
-        const int clip_num,
+typedef void (*multiview_reconstruct_progress_update_cb) (void* customdata,
+                                                          double progress,
+                                                          const char* message);
+
+void libmv_reconstructionNDestroy(libmv_ReconstructionN* 
libmv_reconstructionN);
+
+libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
         const struct libmv_TracksN **all_libmv_tracks,
-        const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options,
+        const libmv_CameraIntrinsicsOptions 
*all_libmv_camera_intrinsics_options,
         libmv_MultiviewReconstructionOptions* libmv_reconstruction_options,
-        reconstruct_progress_update_cb progress_update_callback,
+        multiview_reconstruct_progress_update_cb progress_update_callback,
         void* callback_customdata);
 
 #ifdef __cplusplus
diff --git a/source/blender/blenkernel/intern/tracking_correspondence.c 
b/source/blender/blenkernel/intern/tracking_correspondence.c
index 9919e66..6c85133 100644
--- a/source/blender/blenkernel/intern/tracking_correspondence.c
+++ b/source/blender/blenkernel/intern/tracking_correspondence.c
@@ -110,11 +110,11 @@ static int 
multiview_refine_intrinsics_get_flags(MovieTracking *tracking, MovieT
 }
 
 /* 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)
+static struct libmv_TracksN *libmv_multiview_tracks_new(MovieClip *clip, int 
clip_id, ListBase *tracksbase, int width, int height)
 {
        int tracknr = 0;
        MovieTrackingTrack *track;
-       struct libmv_Tracks *tracks = libmv_tracksNew();
+       struct libmv_TracksN *tracks = libmv_tracksNewN();
 
        track = tracksbase->first;
        while (track) {
@@ -136,10 +136,44 @@ static struct libmv_Tracks 
*libmv_multiview_tracks_new(MovieClip *clip, ListBase
                                        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);
+                               libmv_Marker libmv_marker;
+                               libmv_marker.clip = clip_id;
+                               libmv_marker.frame = marker->framenr;
+                               libmv_marker.track = tracknr;
+                               libmv_marker.center[0] = (marker->pos[0] + 
track->offset[0]) * width;
+                               libmv_marker.center[1] = (marker->pos[1] + 
track->offset[1]) * height;
+                               for(int i = 0; i < 4; i++)
+                               {
+                                       libmv_marker.patch[i][0] = 
marker->pattern_corners[i][0];
+                                       libmv_marker.patch[i][1] = 
marker->pattern_corners[i][1];
+                               }
+                               for(int i = 0; i < 2; i++)
+                               {

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to