[Bf-blender-cvs] [4c6399f] soc-2016-multiview: fix bug in EuclideanScaleToUnity
Tianwei Shen
noreply at git.blender.org
Wed Jun 29 11:29:51 CEST 2016
Commit: 4c6399fe4a321a93dfbda2f9dedb1d8cae1191ef
Author: Tianwei Shen
Date: Wed Jun 29 16:05:13 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB4c6399fe4a321a93dfbda2f9dedb1d8cae1191ef
fix bug in EuclideanScaleToUnity
===================================================================
M intern/libmv/intern/reconstructionN.cc
M intern/libmv/libmv/autotrack/intersect.cc
M intern/libmv/libmv/autotrack/pipeline.cc
M intern/libmv/libmv/autotrack/resect.cc
===================================================================
diff --git a/intern/libmv/intern/reconstructionN.cc b/intern/libmv/intern/reconstructionN.cc
index 9d62f57..aa59552 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -107,11 +107,9 @@ bool ReconstructionUpdateFixedIntrinsics(libmv_ReconstructionN **all_libmv_recon
Reconstruction *reconstruction)
{
int clip_num = tracks->GetClipNum();
- std::cout << "[ReconstructionUpdateFixedIntrinsics] " << clip_num << std::endl;
for(int i = 0; i < clip_num; i++) {
CameraIntrinsics *camera_intrinsics = all_libmv_reconstruction[i]->intrinsics;
int cam_intrinsic_index = reconstruction->AddCameraIntrinsics(camera_intrinsics);
- std::cout << "[ReconstructionUpdateFixedIntrinsics]" << i << std::endl;
assert(cam_intrinsic_index == i);
}
reconstruction->InitIntrinsicsMapFixed(*tracks);
@@ -257,13 +255,10 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
// reconstruct two views from the main clip
if(!mv::ReconstructTwoFrames(keyframe_markers, 0, *(all_libmv_reconstruction[0]->intrinsics), &reconstruction)) {
- printf("mv::ReconstrucTwoFrames failed\n");
+ LG << "mv::ReconstrucTwoFrames failed\n";
all_libmv_reconstruction[0]->is_valid = false;
return all_libmv_reconstruction;
}
- std::cout << "[libmv_solveMultiviewReconstruction] reconstruct "
- << reconstruction.GetReconstructedCameraNum()
- << " cameras after ReconstructTwoFrames" << std::endl;
// bundle the two-view initial reconstruction
// (it is redundant for now since now 3d point is added at this stage)
//if(!mv::EuclideanBundleAll(all_normalized_tracks, &reconstruction)) {
@@ -272,13 +267,14 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
// return all_libmv_reconstruction;
//}
if(!mv::EuclideanCompleteMultiviewReconstruction(all_normalized_tracks, &reconstruction, &update_callback)) {
- printf("mv::EuclideanReconstructionComplete failed\n");
+ 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";
/* Refinement/ */
- //TODO(Tianwei): current api allows only one camera intrinsics
+ //TODO(Tianwei): current api allows only one camera refine intrinsics
if (libmv_reconstruction_options->all_refine_intrinsics[0]) {
libmv_solveRefineIntrinsics(
all_normalized_tracks,
@@ -289,6 +285,7 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
&reconstruction,
all_libmv_reconstruction[0]->intrinsics);
}
+ std::cout << "[libmv_solveMultiviewReconstruction] Successfully refine camera intrinsics\n";
///* Set reconstruction scale to unity. */
mv::EuclideanScaleToUnity(&reconstruction);
diff --git a/intern/libmv/libmv/autotrack/intersect.cc b/intern/libmv/libmv/autotrack/intersect.cc
index 614eec9..b2e2a4a 100644
--- a/intern/libmv/libmv/autotrack/intersect.cc
+++ b/intern/libmv/libmv/autotrack/intersect.cc
@@ -86,7 +86,7 @@ bool EuclideanIntersect(const vector<Marker> &markers,
vector<Mat34> cameras;
Mat34 P;
for (int i = 0; i < markers.size(); ++i) {
- std::cout << "[Intersect] marker clip frame: " << markers[i].clip << " " << markers[i].frame << std::endl;
+ LG << "[Intersect] marker clip frame: " << markers[i].clip << " " << markers[i].frame << std::endl;
CameraPose *camera = reconstruction->CameraPoseForFrame(markers[i].clip, markers[i].frame);
libmv::P_From_KRt(K, camera->R, camera->t, &P);
cameras.push_back(P);
diff --git a/intern/libmv/libmv/autotrack/pipeline.cc b/intern/libmv/libmv/autotrack/pipeline.cc
index eb095d5..fb79570 100644
--- a/intern/libmv/libmv/autotrack/pipeline.cc
+++ b/intern/libmv/libmv/autotrack/pipeline.cc
@@ -211,6 +211,7 @@ bool InternalCompleteReconstruction(
}
// One last pass...
+ std::cout << "[InternalCompleteReconstruction] Ran last pass\n";
num_resects = 0;
for(int clip = 0; clip < clip_num; clip++) {
int max_image = tracks.MaxFrame(clip);
@@ -341,18 +342,22 @@ void EuclideanScaleToUnity(Reconstruction *reconstruction) {
const vector<vector<CameraPose> >& all_cameras = reconstruction->camera_poses();
// Calculate center of the mass of all cameras.
+ int total_valid_cameras = 0;
Vec3 cameras_mass_center = Vec3::Zero();
for(int i = 0; i < clip_num; i++) {
- for (int j = 0; j < all_cameras.size(); ++j) {
- cameras_mass_center += all_cameras[i][j].t;
+ for (int j = 0; j < all_cameras[i].size(); ++j) {
+ if(all_cameras[i][j].clip > 0 && all_cameras[i][j].frame > 0) {
+ cameras_mass_center += all_cameras[i][j].t;
+ total_valid_cameras++;
+ }
}
}
- cameras_mass_center /= all_cameras.size();
+ cameras_mass_center /= total_valid_cameras;
// Find the most distant camera from the mass center.
double max_distance = 0.0;
for(int i = 0; i < clip_num; i++) {
- for (int j = 0; j < all_cameras.size(); ++j) {
+ for (int j = 0; j < all_cameras[i].size(); ++j) {
double distance = (all_cameras[i][j].t - cameras_mass_center).squaredNorm();
if (distance > max_distance) {
max_distance = distance;
@@ -369,7 +374,7 @@ void EuclideanScaleToUnity(Reconstruction *reconstruction) {
// Rescale cameras positions.
for(int i = 0; i < clip_num; i++) {
- for (int j = 0; j < all_cameras.size(); ++j) {
+ for (int j = 0; j < all_cameras[i].size(); ++j) {
int image = all_cameras[i][j].frame;
CameraPose *camera = reconstruction->CameraPoseForFrame(i, image);
camera->t = camera->t * scale_factor;
diff --git a/intern/libmv/libmv/autotrack/resect.cc b/intern/libmv/libmv/autotrack/resect.cc
index 7aa8270..9bcb616 100644
--- a/intern/libmv/libmv/autotrack/resect.cc
+++ b/intern/libmv/libmv/autotrack/resect.cc
@@ -177,8 +177,8 @@ bool EuclideanResect(const vector<Marker> &markers,
R = libmv::RotationFromEulerVector(dRt.head<3>()) * R;
t = dRt.tail<3>();
- std::cout << "Resection for frame " << markers[0].clip << " " << markers[0].frame
- << " got:\n" << "R:\n" << R << "\nt:\n" << t;
+ LG << "Resection for frame " << markers[0].clip << " " << markers[0].frame
+ << " got:\n" << "R:\n" << R << "\nt:\n" << t << "\n";
CameraPose pose(markers[0].clip, markers[0].frame, intrinsics, R, t);
reconstruction->AddCameraPose(pose);
return true;
More information about the Bf-blender-cvs
mailing list