[Bf-blender-cvs] [3017d0d] soc-2016-multiview: fix re-projection error bug
Tianwei Shen
noreply at git.blender.org
Thu Jul 7 16:22:30 CEST 2016
Commit: 3017d0d68c09dfeb46fb019186fabb24ed12fded
Author: Tianwei Shen
Date: Thu Jul 7 16:27:42 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB3017d0d68c09dfeb46fb019186fabb24ed12fded
fix re-projection error bug
- it is caused by using normalized tracks for intrinsics refinement
- remove all std::cout and change them to LG (glog) for logging purpose
===================================================================
M intern/libmv/intern/reconstructionN.cc
M intern/libmv/libmv/autotrack/pipeline.cc
M intern/libmv/libmv/autotrack/reconstruction.cc
M intern/libmv/libmv/autotrack/resect.cc
===================================================================
diff --git a/intern/libmv/intern/reconstructionN.cc b/intern/libmv/intern/reconstructionN.cc
index e40aeb5..e51f689 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -195,7 +195,7 @@ 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,
+ const libmv_CorrespondencesN *libmv_correspondences,
libmv_MultiviewReconstructionOptions *libmv_reconstruction_options,
multiview_reconstruct_progress_update_cb progress_update_callback,
void* callback_customdata)
@@ -204,11 +204,13 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
libmv::vector<Marker> keyframe_markers;
int keyframe1, keyframe2;
- Tracks all_normalized_tracks; // normalized tracks of all clips
+ Tracks all_tracks, all_normalized_tracks; // normalized tracks of all clips
+ all_tracks.SetClipNum(clip_num);
all_normalized_tracks.SetClipNum(clip_num);
for (int i = 0; i < clip_num; i++) {
all_libmv_reconstruction[i] = LIBMV_OBJECT_NEW(libmv_ReconstructionN);
Tracks &tracks = *((Tracks *) all_libmv_tracks[i]); // Tracks are just a bunch of markers
+ all_tracks.AddTracks(tracks);
///* Retrieve reconstruction options from C-API to libmv API. */
CameraIntrinsics *camera_intrinsics;
@@ -230,11 +232,12 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
// make reconstrution on the primary clip reconstruction
Reconstruction &reconstruction = all_libmv_reconstruction[0]->reconstruction;
- printf("frames to init from: %d %d\n", keyframe1, keyframe2);
- printf("number of markers for init: %d\n", keyframe_markers.size());
+ LG << "number of clips: " << clip_num << "\n";
+ LG << "frames to init from: " << keyframe1 << " " << keyframe2 << "\n";
+ LG << "number of markers for init: " << keyframe_markers.size() << "\n";
if (keyframe_markers.size() < 8) {
LG << "No enough markers to initialize from";
- for(int i = 0; i < clip_num; i++)
+ for (int i = 0; i < clip_num; i++)
all_libmv_reconstruction[i]->is_valid = false;
return all_libmv_reconstruction;
}
@@ -270,7 +273,7 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
ReconstructionUpdateFixedIntrinsics(all_libmv_reconstruction, &all_normalized_tracks, &reconstruction);
// reconstruct two views from the main clip
- if(!mv::ReconstructTwoFrames(keyframe_markers, 0, *(all_libmv_reconstruction[0]->intrinsics), &reconstruction)) {
+ if (!mv::ReconstructTwoFrames(keyframe_markers, 0, *(all_libmv_reconstruction[0]->intrinsics), &reconstruction)) {
LG << "mv::ReconstrucTwoFrames failed\n";
all_libmv_reconstruction[0]->is_valid = false;
return all_libmv_reconstruction;
@@ -282,18 +285,18 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
// all_libmv_reconstruction[0]->is_valid = false;
// return all_libmv_reconstruction;
//}
- if(!mv::EuclideanCompleteMultiviewReconstruction(all_normalized_tracks, &reconstruction, &update_callback)) {
+ if (!mv::EuclideanCompleteMultiviewReconstruction(all_normalized_tracks, &reconstruction, &update_callback)) {
LG << "mv::EuclideanReconstructionComplete failed\n";
all_libmv_reconstruction[0]->is_valid = false;
return all_libmv_reconstruction;
}
- std::cout << "[libmv_solveMultiviewReconstruction] Successfully do track intersection and camera resection\n";
+ LG << "[libmv_solveMultiviewReconstruction] Successfully do track intersection and camera resection\n";
/* Refinement/ */
//TODO(Tianwei): current api allows only one camera refine intrinsics
if (libmv_reconstruction_options->all_refine_intrinsics[0]) {
libmv_solveRefineIntrinsics(
- all_normalized_tracks,
+ all_tracks,
libmv_reconstruction_options->all_refine_intrinsics[0],
mv::BUNDLE_NO_CONSTRAINTS,
progress_update_callback,
@@ -307,14 +310,14 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
mv::EuclideanScaleToUnity(&reconstruction);
/* Finish reconstruction. */
- finishMultiviewReconstruction(all_normalized_tracks,
+ finishMultiviewReconstruction(all_tracks,
*(all_libmv_reconstruction[0]->intrinsics),
all_libmv_reconstruction[0],
progress_update_callback,
callback_customdata);
// a multi-view reconstruction is succesfuly iff all reconstruction falgs are set to true
- for(int i = 0; i < clip_num; i++)
+ for (int i = 0; i < clip_num; i++)
all_libmv_reconstruction[i]->is_valid = true;
return all_libmv_reconstruction;
diff --git a/intern/libmv/libmv/autotrack/pipeline.cc b/intern/libmv/libmv/autotrack/pipeline.cc
index 2f976fa..1545ebd 100644
--- a/intern/libmv/libmv/autotrack/pipeline.cc
+++ b/intern/libmv/libmv/autotrack/pipeline.cc
@@ -120,20 +120,20 @@ bool InternalCompleteReconstruction(
int num_resects = -1;
int num_intersects = -1;
int total_resects = 0;
- std::cout << "Max track: " << max_track << "\n";
- std::cout << "Number of total frames: " << num_frames << "\n";
- std::cout << "Number of markers: " << tracks.NumMarkers() << "\n";
+ LG << "Max track: " << max_track << "\n";
+ LG << "Number of total frames: " << num_frames << "\n";
+ LG << "Number of markers: " << tracks.NumMarkers() << "\n";
while (num_resects != 0 || num_intersects != 0) {
// Do all possible intersections.
num_intersects = 0;
for (int track = 0; track <= max_track; ++track) {
if (reconstruction->PointForTrack(track)) { // track has already been added
- std::cout << "Skipping point: " << track << "\n";
+ LG << "Skipping point: " << track << "\n";
continue;
}
vector<Marker> all_markers;
tracks.GetMarkersForTrack(track, &all_markers);
- std::cout << "Got " << all_markers.size() << " markers for track " << track << "\n";
+ LG << "Got " << all_markers.size() << " markers for track " << track << "\n";
vector<Marker> reconstructed_markers;
for (int i = 0; i < all_markers.size(); ++i) {
@@ -141,16 +141,16 @@ bool InternalCompleteReconstruction(
reconstructed_markers.push_back(all_markers[i]);
}
}
- std::cout << "Got " << reconstructed_markers.size() << " reconstructed markers for track " << track << "\n";
+ LG << "Got " << reconstructed_markers.size() << " reconstructed markers for track " << track << "\n";
if (reconstructed_markers.size() >= 2) {
CompleteReconstructionLogProgress(update_callback,
(double)total_resects/(num_frames));
if (PipelineRoutines::Intersect(reconstructed_markers,
reconstruction)) {
num_intersects++;
- std::cout << "Ran Intersect() for track " << track << "\n";
+ LG << "Ran Intersect() for track " << track << "\n";
} else {
- std::cout << "Failed Intersect() for track " << track << "\n";
+ LG << "Failed Intersect() for track " << track << "\n";
}
}
}
@@ -160,9 +160,9 @@ bool InternalCompleteReconstruction(
(double)total_resects/(num_frames),
"Bundling...");
PipelineRoutines::Bundle(tracks, reconstruction);
- std::cout << "Ran Bundle() after intersections.\n";
+ LG << "Ran Bundle() after intersections.";
}
- std::cout << "Did " << num_intersects << " intersects.\n";
+ LG << "Did " << num_intersects << " intersects.\n";
// Do all possible resections.
num_resects = 0;
@@ -175,7 +175,7 @@ bool InternalCompleteReconstruction(
}
vector<Marker> all_markers;
tracks.GetMarkersInFrame(clip, image, &all_markers);
- std::cout << "Got " << all_markers.size() << " markers for frame " << clip << ", " << image << "\n";
+ LG << "Got " << all_markers.size() << " markers for frame " << clip << ", " << image << "\n";
vector<Marker> reconstructed_markers;
for (int i = 0; i < all_markers.size(); ++i) {
@@ -183,7 +183,7 @@ bool InternalCompleteReconstruction(
reconstructed_markers.push_back(all_markers[i]);
}
}
- std::cout << "Got " << reconstructed_markers.size() << " reconstructed markers for frame "
+ LG << "Got " << reconstructed_markers.size() << " reconstructed markers for frame "
<< clip << " " << image << "\n";
if (reconstructed_markers.size() >= 5) {
CompleteReconstructionLogProgress(update_callback,
@@ -193,9 +193,9 @@ bool InternalCompleteReconstruction(
reconstruction->GetIntrinsicsMap(clip, image))) {
num_resects++;
total_resects++;
- std::cout << "Ran Resect() for frame (" << clip << ", " << image << ")\n";
+ LG << "Ran Resect() for frame (" << clip << ", " << image << ")\n";
} else {
- std::cout << "Failed Resect() for frame (" << clip << ", " << image << ")\n";
+ LG << "Failed Resect() for frame (" << clip << ", " << image << ")\n";
}
}
}
@@ -206,11 +206,11 @@ bool InternalCompleteReconstruction(
"Bundling...");
PipelineRoutines::Bundle(tracks, reconstruction);
}
- std::cout << "Did " << num_resects << " resects.\n";
+ LG << "Did " << num_resects << " resects.\n";
}
// One last pass...
- std::cout << "[InternalCompleteReconstruction] Ran last pass\n";
+ LG << "[InternalCompleteReconstruction] Ran last pass\n";
num_resects = 0;
for(int clip = 0; clip < clip_num; clip++) {
int max_image = tracks.MaxFrame(clip);
@@ -235,9 +235,9 @@ bool InternalCompleteReconstruction(
reconstruction, t
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list