[Bf-blender-cvs] [5d05af2] soc-2016-multiview: set-up intrinsics map, proceed to resection
Tianwei Shen
noreply at git.blender.org
Wed Jun 29 11:29:50 CEST 2016
Commit: 5d05af20b2e99418a212c0f84a60ebcd8b7078ef
Author: Tianwei Shen
Date: Wed Jun 29 15:05:45 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB5d05af20b2e99418a212c0f84a60ebcd8b7078ef
set-up intrinsics map, proceed to resection
===================================================================
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/reconstruction.h
M intern/libmv/libmv/autotrack/resect.cc
M intern/libmv/libmv/autotrack/resect.h
M release/datafiles/locale
M release/scripts/addons
M release/scripts/addons_contrib
M source/blender/blenkernel/intern/tracking_correspondence.c
===================================================================
diff --git a/intern/libmv/intern/reconstructionN.cc b/intern/libmv/intern/reconstructionN.cc
index ef19d8a..9d62f57 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -101,6 +101,24 @@ void mv_getNormalizedTracks(const Tracks &tracks,
}
}
+// Each clip has a fix camera intrinsics, set frames of a clip to that fixed intrinsics
+bool ReconstructionUpdateFixedIntrinsics(libmv_ReconstructionN **all_libmv_reconstruction,
+ Tracks *tracks,
+ 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);
+
+ return true;
+}
+
void libmv_solveRefineIntrinsics(
const Tracks &tracks,
const int refine_intrinsics,
@@ -232,6 +250,11 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
///* Actual reconstruction. */
update_callback.invoke(0, "Initial reconstruction");
+ // update intrinsics mapping from (clip, frame) -> intrinsics
+ // TODO(tianwei): in the future we may support varing focal length,
+ // thus each (clip, frame) should have a unique intrinsics index
+ 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)) {
printf("mv::ReconstrucTwoFrames failed\n");
diff --git a/intern/libmv/libmv/autotrack/pipeline.cc b/intern/libmv/libmv/autotrack/pipeline.cc
index a8ac232..eb095d5 100644
--- a/intern/libmv/libmv/autotrack/pipeline.cc
+++ b/intern/libmv/libmv/autotrack/pipeline.cc
@@ -52,8 +52,10 @@ struct EuclideanPipelineRoutines {
}
static bool Resect(const vector<Marker> &markers,
- Reconstruction *reconstruction, bool final_pass) {
- return EuclideanResect(markers, reconstruction, final_pass);
+ Reconstruction *reconstruction,
+ bool final_pass,
+ int intrinsics_index) {
+ return EuclideanResect(markers, reconstruction, final_pass, intrinsics_index);
}
static bool Intersect(const vector<Marker> &markers,
@@ -169,31 +171,32 @@ bool InternalCompleteReconstruction(
const int max_image = tracks.MaxFrame(clip);
for (int image = 0; image <= max_image; ++image) {
if (reconstruction->CameraPoseForFrame(clip, image)) { // this camera pose has been added
- std::cout << "Skipping frame: " << clip << " " << image << "\n";
+ LG << "Skipping frame: " << clip << " " << image << "\n";
continue;
}
vector<Marker> all_markers;
tracks.GetMarkersInFrame(clip, image, &all_markers);
- std::cout << "Got " << all_markers.size() << " markers for image " << image << "\n";
+ std::cout << "Got " << all_markers.size() << " markers for frame " << clip << ", " << image << "\n";
vector<Marker> reconstructed_markers;
for (int i = 0; i < all_markers.size(); ++i) {
- if (reconstruction->PointForTrack(all_markers[i].track)) {
+ if (reconstruction->PointForTrack(all_markers[i].track)) { // 3d points have been added
reconstructed_markers.push_back(all_markers[i]);
}
}
- std::cout << "Got " << reconstructed_markers.size() << " reconstructed markers for image "
+ std::cout << "Got " << reconstructed_markers.size() << " reconstructed markers for frame "
<< clip << " " << image << "\n";
if (reconstructed_markers.size() >= 5) {
CompleteReconstructionLogProgress(update_callback,
(double)total_resects/(num_frames));
if (PipelineRoutines::Resect(reconstructed_markers,
- reconstruction, false)) {
+ reconstruction, false,
+ reconstruction->GetIntrinsicsMap(clip, image))) {
num_resects++;
total_resects++;
- std::cout << "Ran Resect() for image (" << clip << ", " << image << ")\n";
+ std::cout << "Ran Resect() for frame (" << clip << ", " << image << ")\n";
} else {
- std::cout << "Failed Resect() for image (" << clip << ", " << image << ")\n";
+ std::cout << "Failed Resect() for frame (" << clip << ", " << image << ")\n";
}
}
}
@@ -213,7 +216,7 @@ bool InternalCompleteReconstruction(
int max_image = tracks.MaxFrame(clip);
for (int image = 0; image <= max_image; ++image) {
if (reconstruction->CameraPoseForFrame(clip, image)) {
- LG << "Skipping frame: " << image;
+ LG << "Skipping frame: " << clip << " " << image << "\n";
continue;
}
vector<Marker> all_markers;
@@ -229,7 +232,8 @@ bool InternalCompleteReconstruction(
CompleteReconstructionLogProgress(update_callback,
(double)total_resects/(max_image));
if (PipelineRoutines::Resect(reconstructed_markers,
- reconstruction, true)) {
+ reconstruction, true,
+ reconstruction->GetIntrinsicsMap(clip, image))) {
num_resects++;
std::cout << "Ran final Resect() for image " << image;
} else {
diff --git a/intern/libmv/libmv/autotrack/reconstruction.cc b/intern/libmv/libmv/autotrack/reconstruction.cc
index 14a1aaa..d67606e 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.cc
+++ b/intern/libmv/libmv/autotrack/reconstruction.cc
@@ -109,9 +109,8 @@ bool ReconstructTwoFrames(const vector<Marker> &markers,
}
// 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());
- CameraPose pose2(clip, frame2, cam_intrinsic_index, R, t);
+ CameraPose pose1(clip, frame1, reconstruction->GetIntrinsicsMap(clip, frame1), Mat3::Identity(), Vec3::Zero());
+ CameraPose pose2(clip, frame2, reconstruction->GetIntrinsicsMap(clip, frame2), R, t);
reconstruction->AddCameraPose(pose1);
reconstruction->AddCameraPose(pose2);
@@ -185,7 +184,14 @@ Point* Reconstruction::PointForTrack(int track) {
}
const Point* Reconstruction::PointForTrack(int track) const {
- return const_cast<Point *>(static_cast<const Reconstruction *>(this)->PointForTrack(track));
+ if (track < 0 || track >= points_.size()) {
+ return NULL;
+ }
+ const Point *point = &points_[track];
+ if (point->track == -1) { // initialized but not set, return NULL
+ return NULL;
+ }
+ return point;
}
int Reconstruction::AddPoint(const Point& point) {
@@ -217,4 +223,43 @@ int Reconstruction::GetReconstructedCameraNum() const {
return reconstructed_num;
}
+void Reconstruction::InitIntrinsicsMap(Tracks &tracks) {
+ int clip_num = tracks.GetClipNum();
+ intrinsics_map.resize(clip_num);
+ for(int i = 0; i < clip_num; i++) {
+ intrinsics_map.resize(tracks.MaxFrame(i)+1);
+ for(int j = 0; j < intrinsics_map.size(); j++) {
+ intrinsics_map[i][j] = -1;
+ }
+ }
+}
+
+void Reconstruction::InitIntrinsicsMapFixed(Tracks &tracks) {
+ int clip_num = tracks.GetClipNum();
+ intrinsics_map.resize(clip_num);
+ for(int i = 0; i < clip_num; i++) {
+ intrinsics_map[i].resize(tracks.MaxFrame(i)+1);
+ for(int j = 0; j < intrinsics_map[i].size(); j++) {
+ intrinsics_map[i][j] = i;
+ }
+ }
+}
+
+bool Reconstruction::SetIntrinsicsMap(int clip, int frame, int intrinsics) {
+ if(intrinsics_map.size() <= clip)
+ return false;
+ if(intrinsics_map[clip].size() <= frame)
+ return false;
+ intrinsics_map[clip][frame] = intrinsics;
+ return true;
+}
+
+int Reconstruction::GetIntrinsicsMap(int clip, int frame) const {
+ if(intrinsics_map.size() <= clip)
+ return -1;
+ if(intrinsics_map[clip].size() <= frame)
+ return -1;
+ return intrinsics_map[clip][frame];
+}
+
} // namespace mv
diff --git a/intern/libmv/libmv/autotrack/reconstruction.h b/intern/libmv/libmv/autotrack/reconstruction.h
index af04871..d123992 100644
--- a/intern/libmv/libmv/autotrack/reconstruction.h
+++ b/intern/libmv/libmv/autotrack/reconstruction.h
@@ -69,7 +69,7 @@ public:
// All methods copy their input reference or take ownership of the pointer.
void AddCameraPose(const CameraPose& pose);
int AddCameraIntrinsics(CameraIntrinsics* intrinsics_ptr);
- int AddPoint(const Point& point);
+ int AddPoint(const Point& point);
int AddModel(Model* model);
// Returns the corresponding pose or point or NULL if missing.
@@ -85,6 +85,15 @@ public:
int GetAllPoseNum() const;
int GetReconstructedCameraNum() const;
+ // initialize all intrinsics map to -1
+ void InitIntrinsicsMap(Tracks &tracks);
+ // initialize intrinsics of clip i to i(CameraPose::intrinsics)
+ void InitIntrinsicsMapFixed(Tracks &tracks);
+ // set CameraPose::intrinsics for frame (clip, frame)
+ bool SetIntrinsicsMap(int clip, int frame, int intrinsics);
+ // return CameraPose::intrinsics if (clip, frame) is intrinsics_map, otherwise return -1
+ int GetIntrinsicsMap(int clip, int frame) const;
+
private:
// Indexed by CameraPose::intrinsics. Owns the intrinsics objects.
vector<CameraIntrinsics*> camera_intrinsics_;
@@ -97,6 +106,9 @@ private:
// Indexed by Marker::model_id. Owns model objects.
vector<Model*> models_;
+
+ // Indexed by Marker::clip then by Marker::frame.
+ vector<vector<int> > intrinsics_map;
};
// Reconstruct two frames from the same clip, used as the initial reconstruction
diff --git a/intern/libmv/libmv/autotrack/resect.cc b/intern/libmv/libmv/autotrack/resect.cc
index cadcf2c..7aa8270 100644
--- a/intern/libmv/libmv/autotrack/resect.cc
+++ b/intern/libmv/libmv/autotrack/resect.cc
@@ -99,7 +99,9 @@ struct EuclideanResectCostFunction {
} // namespace
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list