[Bf-blender-cvs] [683febf] soc-2016-multiview: get corresondences into libmv

Tianwei Shen noreply at git.blender.org
Thu Jun 16 09:57:12 CEST 2016


Commit: 683febfbca6279c3b4c377bb966372c895fccb4c
Author: Tianwei Shen
Date:   Thu Jun 16 15:56:58 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB683febfbca6279c3b4c377bb966372c895fccb4c

get corresondences into libmv

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

M	intern/libmv/intern/reconstructionN.cc
M	intern/libmv/intern/reconstructionN.h
M	intern/libmv/intern/tracksN.cc
M	intern/libmv/intern/tracksN.h
M	intern/libmv/libmv/autotrack/reconstruction.cc
M	intern/libmv/libmv/autotrack/tracks.cc
M	intern/libmv/libmv/autotrack/tracks.h
M	source/blender/blenkernel/intern/tracking_correspondence.c

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

diff --git a/intern/libmv/intern/reconstructionN.cc b/intern/libmv/intern/reconstructionN.cc
index aa0512e..1960b13 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -47,6 +47,7 @@
 using mv::Tracks;
 using mv::Marker;
 using mv::Reconstruction;
+using mv::Correspondences;
 
 using libmv::CameraIntrinsics;
 using libmv::ProgressUpdateCallback;
@@ -106,9 +107,11 @@ void libmv_reconstructionNDestroy(libmv_ReconstructionN* libmv_reconstructionN)
 	LIBMV_OBJECT_DELETE(libmv_reconstructionN, libmv_ReconstructionN);
 }
 
-libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
+libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
+        const int clip_num,
         const libmv_TracksN **all_libmv_tracks,
         const libmv_CameraIntrinsicsOptions *all_libmv_camera_intrinsics_options,
+        const libmv_CorrespondencesN * libmv_correspondences,
         libmv_MultiviewReconstructionOptions *libmv_reconstruction_options,
         multiview_reconstruct_progress_update_cb progress_update_callback,
         void* callback_customdata)
@@ -180,6 +183,8 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(const int clip_num,
 	update_callback.invoke(0, "Initial reconstruction");
 
 	///* TODO(tianwei): chain the tracks and correspondences */
+	Correspondences &correspondences = *((Correspondences*) libmv_correspondences);
+	printf("corrs in the libmv %d\n", correspondences.GetCorrNum());
 
 	// reconstruct two views from the main clip
 	if(!mv::ReconstructTwoFrames(keyframe_markers, 0, *(all_libmv_reconstruction[0]->intrinsics), &reconstruction))
diff --git a/intern/libmv/intern/reconstructionN.h b/intern/libmv/intern/reconstructionN.h
index a9acaae..d265e3f 100644
--- a/intern/libmv/intern/reconstructionN.h
+++ b/intern/libmv/intern/reconstructionN.h
@@ -34,6 +34,7 @@ extern "C" {
 #endif
 
 typedef struct libmv_ReconstructionN libmv_ReconstructionN;
+typedef struct libmv_CorrespondencesN libmv_CorrespondencesN;
 
 typedef struct libmv_MultiviewReconstructionOptions {
 	int select_keyframes;
@@ -50,6 +51,7 @@ 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 *all_libmv_camera_intrinsics_options,
+        const libmv_CorrespondencesN *libmv_correspondences,
         libmv_MultiviewReconstructionOptions* libmv_reconstruction_options,
         multiview_reconstruct_progress_update_cb progress_update_callback,
         void* callback_customdata);
diff --git a/intern/libmv/intern/tracksN.cc b/intern/libmv/intern/tracksN.cc
index 9e1da88..ecb549c 100644
--- a/intern/libmv/intern/tracksN.cc
+++ b/intern/libmv/intern/tracksN.cc
@@ -31,6 +31,7 @@
 
 using mv::Marker;
 using mv::Tracks;
+using mv::Correspondences;
 
 void libmv_apiMarkerToMarker(const libmv_Marker& libmv_marker,
                              Marker *marker) {
@@ -136,3 +137,18 @@ int libmv_tracksMaxTrackN(libmv_TracksN* libmv_tracks) {
 int libmv_tracksNumMarkersN(libmv_TracksN* libmv_tracks) {
   return ((Tracks*) libmv_tracks)->NumMarkers();
 }
+
+/* --------  	libmv_CorrespondencesN 	------------------- */
+libmv_CorrespondencesN* libmv_correspondencesNewN(void) {
+	Correspondences* corrs = LIBMV_OBJECT_NEW(Correspondences);
+	return (libmv_CorrespondencesN*) corrs;
+}
+
+void libmv_CorrespondencesDestroyN(libmv_CorrespondencesN* libmv_correspondences) {
+	LIBMV_OBJECT_DELETE(libmv_correspondences, Correspondences);
+}
+
+void libmv_AddCorrespondenceN(libmv_CorrespondencesN* libmv_correspondences,
+                              int clip1, int clip2, int track1, int track2) {
+	((Correspondences*) libmv_correspondences)->AddCorrespondence(clip1, clip2, track1, track2);
+}
diff --git a/intern/libmv/intern/tracksN.h b/intern/libmv/intern/tracksN.h
index d0cb54e..0366da3 100644
--- a/intern/libmv/intern/tracksN.h
+++ b/intern/libmv/intern/tracksN.h
@@ -36,6 +36,7 @@ extern "C" {
 #endif
 
 typedef struct libmv_TracksN libmv_TracksN;
+typedef struct libmv_CorrespondencesN libmv_CorrespondencesN;
 
 // Keep order in this enums exactly the same as in mv::Marker.
 // Otherwise API wouldn't convert the values properly.
@@ -88,40 +89,41 @@ typedef struct libmv_Marker {
 namespace mv {
   struct Marker;
 }
+
+/* --------  	libmv_Marker 	------------------- */
 void libmv_apiMarkerToMarker(const libmv_Marker& libmv_marker,
                              mv::Marker *marker);
-
 void libmv_markerToApiMarker(const mv::Marker& marker,
                              libmv_Marker *libmv_marker);
 #endif
 
+/* --------  	libmv_Tracks 	------------------- */
 libmv_TracksN* libmv_tracksNewN(void);
-
 void libmv_tracksDestroyN(libmv_TracksN* libmv_tracks);
-
-
 void libmv_tracksAddMarkerN(libmv_TracksN* libmv_tracks,
                             const libmv_Marker* libmv_marker);
-
 void libmv_tracksGetMarkerN(libmv_TracksN* libmv_tracks,
                             int clip,
                             int frame,
                             int track,
                             libmv_Marker* libmv_marker);
-
 void libmv_tracksRemoveMarkerN(libmv_TracksN* libmv_tracks,
                                int clip,
                                int frame,
                                int track);
-
 void libmv_tracksRemoveMarkersForTrack(libmv_TracksN* libmv_tracks,
                                        int track);
-
 int libmv_tracksMaxClipN(libmv_TracksN* libmv_tracks);
 int libmv_tracksMaxFrameN(libmv_TracksN* libmv_tracks, int clip);
 int libmv_tracksMaxTrackN(libmv_TracksN* libmv_tracks);
 int libmv_tracksNumMarkersN(libmv_TracksN* libmv_tracks);
 
+/* --------  	libmv_CorrespondencesN 	------------------- */
+libmv_CorrespondencesN* libmv_correspondencesNewN(void);
+void libmv_CorrespondencesDestroyN(libmv_CorrespondencesN* libmv_correspondences);
+void libmv_AddCorrespondenceN(libmv_CorrespondencesN* libmv_correspondences,
+                              int clip1, int clip2, int track1, int track2);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/intern/libmv/libmv/autotrack/reconstruction.cc b/intern/libmv/libmv/autotrack/reconstruction.cc
index 748ef53..1873369 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.cc
+++ b/intern/libmv/libmv/autotrack/reconstruction.cc
@@ -107,8 +107,6 @@ bool ReconstructTwoFrames(const vector<Marker> &markers,
 		return false;
 	}
 
-	printf("%d, %d, %d\n", cam_intrinsics.image_width(), cam_intrinsics.image_height(), cam_intrinsics.focal_length());
-
 	// frame 1 gets the reference frame, frame 2 gets the relative motion.
 	int cam_intrinsic_index = reconstruction->AddCameraIntrinsics(&cam_intrinsics);
 	CameraPose pose1(clip, frame1, cam_intrinsic_index, Mat3::Identity(), Vec3::Zero());
diff --git a/intern/libmv/libmv/autotrack/tracks.cc b/intern/libmv/libmv/autotrack/tracks.cc
index a15e87c..38fa6b2 100644
--- a/intern/libmv/libmv/autotrack/tracks.cc
+++ b/intern/libmv/libmv/autotrack/tracks.cc
@@ -203,4 +203,16 @@ int Tracks::NumMarkers() const {
   return markers_.size();
 }
 
+void Correspondences::AddCorrespondence(int clip1, int clip2, int track1, int track2) {
+	Correspondence corr(clip1, clip2, track1, track2);
+	corrs.push_back(corr);
+}
+
+void Correspondences::AddCorrespondence(const Correspondence &corr) {
+	corrs.push_back(corr);
+}
+
+int Correspondences::GetCorrNum() const {
+	return corrs.size();
+}
 }  // namespace mv
diff --git a/intern/libmv/libmv/autotrack/tracks.h b/intern/libmv/libmv/autotrack/tracks.h
index 38e41df..39d6181 100644
--- a/intern/libmv/libmv/autotrack/tracks.h
+++ b/intern/libmv/libmv/autotrack/tracks.h
@@ -82,6 +82,22 @@ class Tracks {
   // linear lookup penalties for the accessors.
 };
 
+struct Correspondence {
+	Correspondence(int clip1_, int clip2_, int track1_, int track2_):
+	    clip1(clip1_), clip2(clip2_), track1(track1_), track2(track2_) {}
+	int clip1, clip2;		/* clip id is indexed by the order of clips when constructing context */
+	int track1, track2;		/* track id is the per clip id */
+};
+
+class Correspondences {
+public:
+	void AddCorrespondence(const Correspondence &corr);
+	void AddCorrespondence(int clip1, int clip2, int track1, int track2);
+	int GetCorrNum() const;
+private:
+	vector<Correspondence> corrs;
+};
+
 }  // namespace mv
 
 #endif  // LIBMV_AUTOTRACK_TRACKS_H_
diff --git a/source/blender/blenkernel/intern/tracking_correspondence.c b/source/blender/blenkernel/intern/tracking_correspondence.c
index 6723c26..3bc7bf5 100644
--- a/source/blender/blenkernel/intern/tracking_correspondence.c
+++ b/source/blender/blenkernel/intern/tracking_correspondence.c
@@ -65,7 +65,7 @@ typedef struct MovieMultiviewReconstructContext {
 	TracksMap **all_tracks_map;				/* tracks_map of each clip */
 	int *all_sfra, *all_efra;				/* start and end frame of each clip */
 	int *all_refine_flags;				/* refine flags of each clip */
-	ListBase *corr_base;			/* a set of correspondence across clips */
+	struct libmv_CorrespondencesN *correspondences;			/* libmv correspondence api*/
 
 	bool select_keyframes;
 	int keyframe1, keyframe2;		/* the key frames selected from the primary camera */
@@ -184,6 +184,67 @@ static struct libmv_TracksN *libmv_multiview_tracks_new(MovieClip *clip, int cli
 	return tracks;
 }
 
+/* get correspondences from blender tracking to libmv correspondences
+ * return the number of correspondences converted
+ */
+static int libmv_CorrespondencesFromTracking(ListBase *tracking_correspondences,
+                                             MovieClip **clips,
+                                             const int clip_num,
+                                             struct libmv_CorrespondencesN *libmv_correspondences)
+{
+	int num_valid_corrs = 0;
+	MovieTrackingCorrespondence *corr;
+	corr = tracking_correspondences->first;
+	while(corr)
+	{
+		int clip1 = -1, clip2 = -1, track1 = -1, track2 = -1;
+		MovieClip *self_clip = corr->self_clip;
+		MovieClip *other_clip = corr->other_clip;
+		// iterate through all the clips to get the local clip id
+		for(int i = 0; i < clip_num; i++) {
+			if(self_clip == c

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list