[Bf-blender-cvs] [eaf30b2] soc-2016-multiview: complete multiview_reconstruction_finish
Tianwei Shen
noreply at git.blender.org
Mon Jul 4 11:31:49 CEST 2016
Commit: eaf30b24fc7b2358e5b1855b1146513bde806b55
Author: Tianwei Shen
Date: Mon Jul 4 17:31:31 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rBeaf30b24fc7b2358e5b1855b1146513bde806b55
complete multiview_reconstruction_finish
===================================================================
M intern/libmv/intern/reconstructionN.cc
M intern/libmv/intern/reconstructionN.h
M source/blender/blenkernel/intern/tracking_correspondence.c
===================================================================
diff --git a/intern/libmv/intern/reconstructionN.cc b/intern/libmv/intern/reconstructionN.cc
index 2e13927..2267221 100644
--- a/intern/libmv/intern/reconstructionN.cc
+++ b/intern/libmv/intern/reconstructionN.cc
@@ -41,9 +41,6 @@
#include "libmv/autotrack/reconstruction.h"
#include "libmv/autotrack/region.h"
#include "libmv/autotrack/tracks.h"
-
-// TODO(tianwei): still rely on simple_pipeline/callback for now, will be removed
-#include "libmv/simple_pipeline/callbacks.h"
#include "libmv/simple_pipeline/callbacks.h"
using mv::Tracks;
@@ -67,37 +64,39 @@ struct libmv_ReconstructionN {
namespace {
class MultiviewReconstructUpdateCallback : public ProgressUpdateCallback {
public:
- MultiviewReconstructUpdateCallback(
- multiview_reconstruct_progress_update_cb progress_update_callback,
- void *callback_customdata) {
- progress_update_callback_ = progress_update_callback;
- callback_customdata_ = callback_customdata;
- }
-
- void invoke(double progress, const char* message) {
- if (progress_update_callback_) {
- progress_update_callback_(callback_customdata_, progress, message);
- }
- }
+ MultiviewReconstructUpdateCallback(
+ multiview_reconstruct_progress_update_cb progress_update_callback,
+ void *callback_customdata) {
+ progress_update_callback_ = progress_update_callback;
+ callback_customdata_ = callback_customdata;
+ }
+
+ void invoke(double progress, const char* message) {
+ if (progress_update_callback_) {
+ progress_update_callback_(callback_customdata_, progress, message);
+ }
+ }
protected:
- multiview_reconstruct_progress_update_cb progress_update_callback_;
- void* callback_customdata_;
+ multiview_reconstruct_progress_update_cb progress_update_callback_;
+ void* callback_customdata_;
};
void mv_getNormalizedTracks(const Tracks &tracks,
const CameraIntrinsics &camera_intrinsics,
Tracks *normalized_tracks)
{
- libmv::vector<Marker> markers = tracks.markers();
- for (int i = 0; i < markers.size(); ++i) {
- Marker &marker = markers[i];
- double normalized_x, normalized_y;
- camera_intrinsics.InvertIntrinsics(marker.center[0], marker.center[1],
- &normalized_x, &normalized_y);
- // TODO(tianwei): put the normalized value in marker instead? is this supposed to be like this?
- marker.center[0] = normalized_x, marker.center[1] = normalized_y;
- normalized_tracks->AddMarker(marker);
- }
+ libmv::vector<Marker> markers = tracks.markers();
+ for (int i = 0; i < markers.size(); ++i) {
+ Marker &marker = markers[i];
+
+ // act in a calibrated fashion
+ double normalized_x, normalized_y;
+ camera_intrinsics.InvertIntrinsics(marker.center[0], marker.center[1],
+ &normalized_x, &normalized_y);
+ marker.center[0] = normalized_x, marker.center[1] = normalized_y;
+
+ normalized_tracks->AddMarker(marker);
+ }
}
// Each clip has a fix camera intrinsics, set frames of a clip to that fixed intrinsics
@@ -105,15 +104,15 @@ bool ReconstructionUpdateFixedIntrinsics(libmv_ReconstructionN **all_libmv_recon
Tracks *tracks,
Reconstruction *reconstruction)
{
- int clip_num = tracks->GetClipNum();
- for(int i = 0; i < clip_num; i++) {
- CameraIntrinsics *camera_intrinsics = all_libmv_reconstruction[i]->intrinsics;
- int cam_intrinsic_index = reconstruction->AddCameraIntrinsics(camera_intrinsics);
- assert(cam_intrinsic_index == i);
- }
- reconstruction->InitIntrinsicsMapFixed(*tracks);
-
- return true;
+ int clip_num = tracks->GetClipNum();
+ for(int i = 0; i < clip_num; i++) {
+ CameraIntrinsics *camera_intrinsics = all_libmv_reconstruction[i]->intrinsics;
+ int cam_intrinsic_index = reconstruction->AddCameraIntrinsics(camera_intrinsics);
+ assert(cam_intrinsic_index == i);
+ }
+ reconstruction->InitIntrinsicsMapFixed(*tracks);
+
+ return true;
}
void libmv_solveRefineIntrinsics(
@@ -149,28 +148,47 @@ void libmv_solveRefineIntrinsics(
intrinsics);
}
-void finishReconstruction(
+void finishMultiviewReconstruction(
const Tracks &tracks,
const CameraIntrinsics &camera_intrinsics,
libmv_ReconstructionN *libmv_reconstruction,
reconstruct_progress_update_cb progress_update_callback,
void *callback_customdata) {
- Reconstruction &reconstruction = libmv_reconstruction->reconstruction;
-
- /* Reprojection error calculation. */
- progress_update_callback(callback_customdata, 1.0, "Finishing solution");
- libmv_reconstruction->tracks = tracks;
- libmv_reconstruction->error = mv::EuclideanReprojectionError(tracks,
- reconstruction,
- camera_intrinsics);
+ Reconstruction &reconstruction = libmv_reconstruction->reconstruction;
+
+ /* Reprojection error calculation. */
+ progress_update_callback(callback_customdata, 1.0, "Finishing solution");
+ libmv_reconstruction->tracks = tracks;
+ libmv_reconstruction->error = mv::EuclideanReprojectionError(tracks,
+ reconstruction,
+ camera_intrinsics);
}
+// re-apply camera intrinsics on the normalized 2d points
+Marker libmv_projectMarker(const mv::Point& point,
+ const mv::CameraPose& camera,
+ const CameraIntrinsics& intrinsics) {
+ libmv::Vec3 projected = camera.R * point.X + camera.t;
+ projected /= projected(2);
+
+ mv::Marker reprojected_marker;
+ double origin_x, origin_y;
+ intrinsics.ApplyIntrinsics(projected(0), projected(1),
+ &origin_x, &origin_y);
+ reprojected_marker.center[0] = origin_x;
+ reprojected_marker.center[1] = origin_y;
+
+ reprojected_marker.clip = camera.clip;
+ reprojected_marker.frame = camera.frame;
+ reprojected_marker.track = point.track;
+ return reprojected_marker;
+}
} // end of anonymous namespace
void libmv_reconstructionNDestroy(libmv_ReconstructionN* libmv_reconstructionN)
{
- LIBMV_OBJECT_DELETE(libmv_reconstructionN->intrinsics, CameraIntrinsics);
- LIBMV_OBJECT_DELETE(libmv_reconstructionN, libmv_ReconstructionN);
+ LIBMV_OBJECT_DELETE(libmv_reconstructionN->intrinsics, CameraIntrinsics);
+ LIBMV_OBJECT_DELETE(libmv_reconstructionN, libmv_ReconstructionN);
}
libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
@@ -182,148 +200,271 @@ libmv_ReconstructionN** libmv_solveMultiviewReconstruction(
multiview_reconstruct_progress_update_cb progress_update_callback,
void* callback_customdata)
{
- libmv_ReconstructionN **all_libmv_reconstruction = LIBMV_STRUCT_NEW(libmv_ReconstructionN*, clip_num);
- libmv::vector<Marker> keyframe_markers;
- int keyframe1, keyframe2;
-
- Tracks all_normalized_tracks; // normalized tracks of all clips
- 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
-
- ///* Retrieve reconstruction options from C-API to libmv API. */
- CameraIntrinsics *camera_intrinsics;
- camera_intrinsics = all_libmv_reconstruction[i]->intrinsics =
- libmv_cameraIntrinsicsCreateFromOptions(&all_libmv_camera_intrinsics_options[i]);
-
- ///* Invert the camera intrinsics/ */
- Tracks normalized_tracks;
- mv_getNormalizedTracks(tracks, *camera_intrinsics, &normalized_tracks);
- all_normalized_tracks.AddTracks(normalized_tracks);
-
- if(i == 0) // key frame from primary camera
- {
- ///* keyframe selection. */
- keyframe1 = libmv_reconstruction_options->keyframe1, keyframe2 = libmv_reconstruction_options->keyframe2;
- normalized_tracks.GetMarkersForTracksInBothImages(i, keyframe1, i, keyframe2, &keyframe_markers);
- }
- }
- // 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());
- if (keyframe_markers.size() < 8) {
- LG << "No enough markers to initialize from";
- for(int i = 0; i < clip_num; i++)
- all_libmv_reconstruction[i]->is_valid = false;
- return all_libmv_reconstruction;
- }
-
- // create multiview reconstruct update callback
- MultiviewReconstructUpdateCallback update_callback =
- MultiviewReconstructUpdateCallback(progress_update_callback,
- callback_customdata);
-
- // TODO(tianwei): skip the automatic keyframe selection for now
- //if (libmv_reconstruction_options->select_keyframes) {
- // LG << "Using automatic keyframe selection";
-
- // update_callback.invoke(0, "Selecting keyframes");
-
- // selectTwoKeyframesBasedOnGRICAndVariance(tracks,
- // normalized_tracks,
- // *camera_intrinsics,
- // keyframe1,
- // keyframe2);
-
- // /* so keyframes in the interface would be updated */
- // libmv_reconstruction_options->keyframe1 = keyframe1;
- // libmv_reconstruction_options->keyframe2 = keyframe2;
- //}
-
- ///* 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)) {
- LG << "mv::ReconstrucTwoFrames failed\n";
- all_libmv_reconstruction[0]->is_valid = false;
- return a
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list