[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