diff options
Diffstat (limited to 'extern/libmv/intern')
-rw-r--r-- | extern/libmv/intern/autotrack.cc | 99 | ||||
-rw-r--r-- | extern/libmv/intern/autotrack.h | 71 | ||||
-rw-r--r-- | extern/libmv/intern/camera_intrinsics.cc | 3 | ||||
-rw-r--r-- | extern/libmv/intern/frame_accessor.cc | 164 | ||||
-rw-r--r-- | extern/libmv/intern/frame_accessor.h | 79 | ||||
-rw-r--r-- | extern/libmv/intern/image.cc | 6 | ||||
-rw-r--r-- | extern/libmv/intern/image.h | 2 | ||||
-rw-r--r-- | extern/libmv/intern/logging.cc | 18 | ||||
-rw-r--r-- | extern/libmv/intern/reconstruction.cc | 16 | ||||
-rw-r--r-- | extern/libmv/intern/reconstruction.h | 19 | ||||
-rw-r--r-- | extern/libmv/intern/stub.cc | 83 | ||||
-rw-r--r-- | extern/libmv/intern/track_region.h | 4 | ||||
-rw-r--r-- | extern/libmv/intern/tracksN.cc | 138 | ||||
-rw-r--r-- | extern/libmv/intern/tracksN.h | 129 |
14 files changed, 800 insertions, 31 deletions
diff --git a/extern/libmv/intern/autotrack.cc b/extern/libmv/intern/autotrack.cc new file mode 100644 index 00000000000..f0cbc68f11e --- /dev/null +++ b/extern/libmv/intern/autotrack.cc @@ -0,0 +1,99 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2014 Blender Foundation. + * All rights reserved. + * + * Contributor(s): Blender Foundation, + * Sergey Sharybin + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "intern/autotrack.h" +#include "intern/tracksN.h" +#include "intern/utildefines.h" +#include "libmv/autotrack/autotrack.h" + +using mv::AutoTrack; +using mv::FrameAccessor; +using mv::Marker; +using libmv::TrackRegionOptions; +using libmv::TrackRegionResult; + +libmv_AutoTrack* libmv_autoTrackNew(libmv_FrameAccessor *frame_accessor) { + return (libmv_AutoTrack*) LIBMV_OBJECT_NEW(AutoTrack, + (FrameAccessor*) frame_accessor); +} + +void libmv_autoTrackDestroy(libmv_AutoTrack* libmv_autotrack) { + LIBMV_OBJECT_DELETE(libmv_autotrack, AutoTrack); +} + +void libmv_autoTrackSetOptions(libmv_AutoTrack* libmv_autotrack, + const libmv_AutoTrackOptions* options) { + AutoTrack *autotrack = ((AutoTrack*) libmv_autotrack); + libmv_configureTrackRegionOptions(options->track_region, + &autotrack->options.track_region); + + autotrack->options.search_region.min(0) = options->search_region.min[0]; + autotrack->options.search_region.min(1) = options->search_region.min[1]; + autotrack->options.search_region.max(0) = options->search_region.max[0]; + autotrack->options.search_region.max(1) = options->search_region.max[1]; +} + +int libmv_autoTrackMarker(libmv_AutoTrack* libmv_autotrack, + const libmv_TrackRegionOptions* libmv_options, + libmv_Marker *libmv_tracked_marker, + libmv_TrackRegionResult* libmv_result) { + + Marker tracked_marker; + TrackRegionOptions options; + TrackRegionResult result; + libmv_apiMarkerToMarker(*libmv_tracked_marker, &tracked_marker); + libmv_configureTrackRegionOptions(*libmv_options, + &options); + (((AutoTrack*) libmv_autotrack)->TrackMarker(&tracked_marker, + &result, + &options)); + libmv_markerToApiMarker(tracked_marker, libmv_tracked_marker); + libmv_regionTrackergetResult(result, libmv_result); + return result.is_usable(); +} + +void libmv_autoTrackAddMarker(libmv_AutoTrack* libmv_autotrack, + const libmv_Marker* libmv_marker) { + Marker marker; + libmv_apiMarkerToMarker(*libmv_marker, &marker); + ((AutoTrack*) libmv_autotrack)->AddMarker(marker); +} + +int libmv_autoTrackGetMarker(libmv_AutoTrack* libmv_autotrack, + int clip, + int frame, + int track, + libmv_Marker *libmv_marker) { + Marker marker; + int ok = ((AutoTrack*) libmv_autotrack)->GetMarker(clip, + frame, + track, + &marker); + if (ok) { + libmv_markerToApiMarker(marker, libmv_marker); + } + return ok; +} diff --git a/extern/libmv/intern/autotrack.h b/extern/libmv/intern/autotrack.h new file mode 100644 index 00000000000..2a4a8f3c97f --- /dev/null +++ b/extern/libmv/intern/autotrack.h @@ -0,0 +1,71 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2014 Blender Foundation. + * All rights reserved. + * + * Contributor(s): Blender Foundation, + * Sergey Sharybin + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef LIBMV_C_API_AUTOTRACK_H_ +#define LIBMV_C_API_AUTOTRACK_H_ + +#include "intern/frame_accessor.h" +#include "intern/tracksN.h" +#include "intern/track_region.h" +#include "intern/region.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct libmv_AutoTrack libmv_AutoTrack; + +typedef struct libmv_AutoTrackOptions { + libmv_TrackRegionOptions track_region; + libmv_Region search_region; +} libmv_AutoTrackOptions; + +libmv_AutoTrack* libmv_autoTrackNew(libmv_FrameAccessor *frame_accessor); + +void libmv_autoTrackDestroy(libmv_AutoTrack* libmv_autotrack); + +void libmv_autoTrackSetOptions(libmv_AutoTrack* libmv_autotrack, + const libmv_AutoTrackOptions* options); + +int libmv_autoTrackMarker(libmv_AutoTrack* libmv_autotrack, + const libmv_TrackRegionOptions* libmv_options, + libmv_Marker *libmv_tracker_marker, + libmv_TrackRegionResult* libmv_result); + +void libmv_autoTrackAddMarker(libmv_AutoTrack* libmv_autotrack, + const libmv_Marker* libmv_marker); + +int libmv_autoTrackGetMarker(libmv_AutoTrack* libmv_autotrack, + int clip, + int frame, + int track, + libmv_Marker *libmv_marker); + +#ifdef __cplusplus +} +#endif + +#endif // LIBMV_C_API_TRACKS_H_ diff --git a/extern/libmv/intern/camera_intrinsics.cc b/extern/libmv/intern/camera_intrinsics.cc index e8b99970ff7..0ce757cc93b 100644 --- a/extern/libmv/intern/camera_intrinsics.cc +++ b/extern/libmv/intern/camera_intrinsics.cc @@ -349,6 +349,7 @@ CameraIntrinsics* libmv_cameraIntrinsicsCreateFromOptions( default: assert(!"Unknown distortion model"); } - libmv_cameraIntrinsicsFillFromOptions(camera_intrinsics_options, camera_intrinsics); + libmv_cameraIntrinsicsFillFromOptions(camera_intrinsics_options, + camera_intrinsics); return camera_intrinsics; } diff --git a/extern/libmv/intern/frame_accessor.cc b/extern/libmv/intern/frame_accessor.cc new file mode 100644 index 00000000000..8bf2cab914b --- /dev/null +++ b/extern/libmv/intern/frame_accessor.cc @@ -0,0 +1,164 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2014 Blender Foundation. + * All rights reserved. + * + * Contributor(s): Blender Foundation, + * Sergey Sharybin + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "intern/frame_accessor.h" +#include "intern/image.h" +#include "intern/utildefines.h" +#include "libmv/autotrack/frame_accessor.h" +#include "libmv/autotrack/region.h" +#include "libmv/image/image.h" + +namespace { + +using libmv::FloatImage; +using mv::FrameAccessor; +using mv::Region; + +struct LibmvFrameAccessor : public FrameAccessor { + LibmvFrameAccessor(libmv_FrameAccessorUserData* user_data, + libmv_GetImageCallback get_image_callback, + libmv_ReleaseImageCallback release_image_callback) + : user_data_(user_data), + get_image_callback_(get_image_callback), + release_image_callback_(release_image_callback) { } + + libmv_InputMode get_libmv_input_mode(InputMode input_mode) { + switch (input_mode) { +#define CHECK_INPUT_MODE(mode) \ + case mode: \ + return LIBMV_IMAGE_MODE_ ## mode; + CHECK_INPUT_MODE(MONO) + CHECK_INPUT_MODE(RGBA) +#undef CHECK_INPUT_MODE + } + assert(!"unknown input mode passed from Libmv."); + // TODO(sergey): Proper error handling here in the future. + return LIBMV_IMAGE_MODE_MONO; + } + + void get_libmv_region(const Region& region, + libmv_Region* libmv_region) { + libmv_region->min[0] = region.min(0); + libmv_region->min[1] = region.min(1); + libmv_region->max[0] = region.max(0); + libmv_region->max[1] = region.max(1); + } + + Key GetImage(int clip, + int frame, + InputMode input_mode, + int downscale, + const Region* region, + const Transform* transform, + FloatImage* destination) { + float *float_buffer; + int width, height, channels; + libmv_Region libmv_region; + if (region) { + get_libmv_region(*region, &libmv_region); + } + Key cache_key = get_image_callback_(user_data_, + clip, + frame, + get_libmv_input_mode(input_mode), + downscale, + region != NULL ? &libmv_region : NULL, + (libmv_FrameTransform*) transform, + &float_buffer, + &width, + &height, + &channels); + + // TODO(sergey): Dumb code for until we can set data directly. + FloatImage temp_image(float_buffer, + height, + width, + channels); + destination->CopyFrom(temp_image); + + return cache_key; + } + + void ReleaseImage(Key cache_key) { + release_image_callback_(cache_key); + } + + bool GetClipDimensions(int clip, int *width, int *height) { + return false; + } + + int NumClips() { + return 1; + } + + int NumFrames(int clip) { + return 0; + } + + libmv_FrameAccessorUserData* user_data_; + libmv_GetImageCallback get_image_callback_; + libmv_ReleaseImageCallback release_image_callback_; +}; + +} // namespace + +libmv_FrameAccessor* libmv_FrameAccessorNew( + libmv_FrameAccessorUserData* user_data, + libmv_GetImageCallback get_image_callback, + libmv_ReleaseImageCallback release_image_callback) { + return (libmv_FrameAccessor*) LIBMV_OBJECT_NEW(LibmvFrameAccessor, + user_data, + get_image_callback, + release_image_callback); +} + +void libmv_FrameAccessorDestroy(libmv_FrameAccessor* frame_accessor) { + LIBMV_OBJECT_DELETE(frame_accessor, LibmvFrameAccessor); +} + +int64_t libmv_frameAccessorgetTransformKey(const libmv_FrameTransform *transform) { + return ((FrameAccessor::Transform*) transform)->key(); +} + +void libmv_frameAccessorgetTransformRun(const libmv_FrameTransform *transform, + const libmv_FloatImage *input_image, + libmv_FloatImage *output_image) { + const FloatImage input(input_image->buffer, + input_image->height, + input_image->width, + input_image->channels); + + FloatImage output; + ((FrameAccessor::Transform*) transform)->run(input, + &output); + + int num_pixels = output.Width() *output.Height() * output.Depth(); + output_image->buffer = new float[num_pixels]; + memcpy(output_image->buffer, output.Data(), num_pixels * sizeof(float)); + output_image->width = output.Width(); + output_image->height = output.Height(); + output_image->channels = output.Depth(); +} diff --git a/extern/libmv/intern/frame_accessor.h b/extern/libmv/intern/frame_accessor.h new file mode 100644 index 00000000000..3e813fe7581 --- /dev/null +++ b/extern/libmv/intern/frame_accessor.h @@ -0,0 +1,79 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2014 Blender Foundation. + * All rights reserved. + * + * Contributor(s): Blender Foundation, + * Sergey Sharybin + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef LIBMV_C_API_FRAME_ACCESSOR_H_ +#define LIBMV_C_API_FRAME_ACCESSOR_H_ + +#include <stdint.h> + +#include "intern/image.h" +#include "intern/region.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct libmv_FrameAccessor libmv_FrameAccessor; +typedef struct libmv_FrameTransform libmv_FrameTransform; +typedef struct libmv_FrameAccessorUserData libmv_FrameAccessorUserData; +typedef void *libmv_CacheKey; + +typedef enum { + LIBMV_IMAGE_MODE_MONO, + LIBMV_IMAGE_MODE_RGBA, +} libmv_InputMode; + +typedef libmv_CacheKey (*libmv_GetImageCallback) ( + libmv_FrameAccessorUserData* user_data, + int clip, + int frame, + libmv_InputMode input_mode, + int downscale, + const libmv_Region* region, + const libmv_FrameTransform* transform, + float** destination, + int* width, + int* height, + int* channels); + +typedef void (*libmv_ReleaseImageCallback) (libmv_CacheKey cache_key); + +libmv_FrameAccessor* libmv_FrameAccessorNew( + libmv_FrameAccessorUserData* user_data, + libmv_GetImageCallback get_image_callback, + libmv_ReleaseImageCallback release_image_callback); +void libmv_FrameAccessorDestroy(libmv_FrameAccessor* frame_accessor); + +int64_t libmv_frameAccessorgetTransformKey(const libmv_FrameTransform *transform); + +void libmv_frameAccessorgetTransformRun(const libmv_FrameTransform *transform, + const libmv_FloatImage *input_image, + libmv_FloatImage *output_image); +#ifdef __cplusplus +} +#endif + +#endif // LIBMV_C_API_FRAME_ACCESSOR_H_ diff --git a/extern/libmv/intern/image.cc b/extern/libmv/intern/image.cc index 7e623bdbec7..5018caef5b1 100644 --- a/extern/libmv/intern/image.cc +++ b/extern/libmv/intern/image.cc @@ -34,7 +34,7 @@ using libmv::FloatImage; using libmv::SamplePlanarPatch; -void libmv_floatImaheDestroy(libmv_FloatImage *image) { +void libmv_floatImageDestroy(libmv_FloatImage *image) { delete [] image->buffer; } @@ -238,7 +238,7 @@ void libmv_samplePlanarPatchFloat(const float* image, libmv_floatImageToFloatBuffer(libmv_patch, patch); } - void libmv_samplePlanarPatchByte(const unsigned char* image, +void libmv_samplePlanarPatchByte(const unsigned char* image, int width, int height, int channels, @@ -268,5 +268,5 @@ void libmv_samplePlanarPatchFloat(const float* image, warped_position_x, warped_position_y); - libmv_floatImageToByteBuffer(libmv_patch, patch); + libmv_floatImageToByteBuffer(libmv_patch, patch); } diff --git a/extern/libmv/intern/image.h b/extern/libmv/intern/image.h index 9936e748b9d..1213943aac4 100644 --- a/extern/libmv/intern/image.h +++ b/extern/libmv/intern/image.h @@ -64,7 +64,7 @@ typedef struct libmv_FloatImage { int channels; } libmv_FloatImage; -void libmv_floatImaheDestroy(libmv_FloatImage *image); +void libmv_floatImageDestroy(libmv_FloatImage *image); void libmv_samplePlanarPatchFloat(const float* image, int width, diff --git a/extern/libmv/intern/logging.cc b/extern/libmv/intern/logging.cc index 4ab2d91c8b4..77b56ef4df3 100644 --- a/extern/libmv/intern/logging.cc +++ b/extern/libmv/intern/logging.cc @@ -35,21 +35,21 @@ void libmv_initLogging(const char* argv0) { google::GLOG_FATAL); google::InitGoogleLogging(argv0); - google::SetCommandLineOption("logtostderr", "1"); - google::SetCommandLineOption("v", "0"); - google::SetCommandLineOption("stderrthreshold", severity_fatal); - google::SetCommandLineOption("minloglevel", severity_fatal); + gflags::SetCommandLineOption("logtostderr", "1"); + gflags::SetCommandLineOption("v", "0"); + gflags::SetCommandLineOption("stderrthreshold", severity_fatal); + gflags::SetCommandLineOption("minloglevel", severity_fatal); } void libmv_startDebugLogging(void) { - google::SetCommandLineOption("logtostderr", "1"); - google::SetCommandLineOption("v", "2"); - google::SetCommandLineOption("stderrthreshold", "1"); - google::SetCommandLineOption("minloglevel", "0"); + gflags::SetCommandLineOption("logtostderr", "1"); + gflags::SetCommandLineOption("v", "2"); + gflags::SetCommandLineOption("stderrthreshold", "1"); + gflags::SetCommandLineOption("minloglevel", "0"); } void libmv_setLoggingVerbosity(int verbosity) { char val[10]; snprintf(val, sizeof(val), "%d", verbosity); - google::SetCommandLineOption("v", val); + gflags::SetCommandLineOption("v", val); } diff --git a/extern/libmv/intern/reconstruction.cc b/extern/libmv/intern/reconstruction.cc index eb3677fd206..046671e467f 100644 --- a/extern/libmv/intern/reconstruction.cc +++ b/extern/libmv/intern/reconstruction.cc @@ -61,6 +61,7 @@ struct libmv_Reconstruction { CameraIntrinsics *intrinsics; double error; + bool is_valid; }; namespace { @@ -220,8 +221,7 @@ Marker libmv_projectMarker(const EuclideanPoint& point, void libmv_getNormalizedTracks(const Tracks &tracks, const CameraIntrinsics &camera_intrinsics, - Tracks *normalized_tracks) -{ + Tracks *normalized_tracks) { libmv::vector<Marker> markers = tracks.AllMarkers(); for (int i = 0; i < markers.size(); ++i) { Marker &marker = markers[i]; @@ -290,6 +290,12 @@ libmv_Reconstruction *libmv_solveReconstruction( LG << "number of markers for init: " << keyframe_markers.size(); + if (keyframe_markers.size() < 8) { + LG << "No enough markers to initialize from"; + libmv_reconstruction->is_valid = false; + return libmv_reconstruction; + } + update_callback.invoke(0, "Initial reconstruction"); EuclideanReconstructTwoFrames(keyframe_markers, &reconstruction); @@ -320,6 +326,7 @@ libmv_Reconstruction *libmv_solveReconstruction( progress_update_callback, callback_customdata); + libmv_reconstruction->is_valid = true; return (libmv_Reconstruction *) libmv_reconstruction; } @@ -378,9 +385,14 @@ libmv_Reconstruction *libmv_solveModal( progress_update_callback, callback_customdata); + libmv_reconstruction->is_valid = true; return (libmv_Reconstruction *) libmv_reconstruction; } +int libmv_reconstructionIsValid(libmv_Reconstruction *libmv_reconstruction) { + return libmv_reconstruction->is_valid; +} + void libmv_reconstructionDestroy(libmv_Reconstruction *libmv_reconstruction) { LIBMV_OBJECT_DELETE(libmv_reconstruction->intrinsics, CameraIntrinsics); LIBMV_OBJECT_DELETE(libmv_reconstruction, libmv_Reconstruction); diff --git a/extern/libmv/intern/reconstruction.h b/extern/libmv/intern/reconstruction.h index 744f4bafb0b..8b6b34a6142 100644 --- a/extern/libmv/intern/reconstruction.h +++ b/extern/libmv/intern/reconstruction.h @@ -31,10 +31,11 @@ extern "C" { #endif -typedef struct libmv_CameraIntrinsics libmv_CameraIntrinsics; -typedef struct libmv_CameraIntrinsicsOptions libmv_CameraIntrinsicsOptions; +struct libmv_Tracks; +struct libmv_CameraIntrinsics; +struct libmv_CameraIntrinsicsOptions; + typedef struct libmv_Reconstruction libmv_Reconstruction; -typedef struct libmv_Tracks libmv_Tracks; enum { LIBMV_REFINE_FOCAL_LENGTH = (1 << 0), @@ -54,19 +55,21 @@ typedef void (*reconstruct_progress_update_cb) (void* customdata, const char* message); libmv_Reconstruction* libmv_solveReconstruction( - const libmv_Tracks* libmv_tracks, - const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options, + const struct libmv_Tracks* libmv_tracks, + const struct libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options, libmv_ReconstructionOptions* libmv_reconstruction_options, reconstruct_progress_update_cb progress_update_callback, void* callback_customdata); libmv_Reconstruction* libmv_solveModal( - const libmv_Tracks* libmv_tracks, - const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options, + const struct libmv_Tracks* libmv_tracks, + const struct libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options, const libmv_ReconstructionOptions* libmv_reconstruction_options, reconstruct_progress_update_cb progress_update_callback, void* callback_customdata); +int libmv_reconstructionIsValid(libmv_Reconstruction *libmv_reconstruction); + void libmv_reconstructionDestroy(libmv_Reconstruction* libmv_reconstruction); int libmv_reprojectionPointForTrack( @@ -89,7 +92,7 @@ int libmv_reprojectionCameraForImage( double libmv_reprojectionError(const libmv_Reconstruction* libmv_reconstruction); -libmv_CameraIntrinsics* libmv_reconstructionExtractIntrinsics( +struct libmv_CameraIntrinsics* libmv_reconstructionExtractIntrinsics( libmv_Reconstruction *libmv_Reconstruction); #ifdef __cplusplus diff --git a/extern/libmv/intern/stub.cc b/extern/libmv/intern/stub.cc index cd8bb8ab841..5d667baa880 100644 --- a/extern/libmv/intern/stub.cc +++ b/extern/libmv/intern/stub.cc @@ -97,6 +97,10 @@ void libmv_samplePlanarPatchByte(const unsigned char * /*image*/, /* TODO(sergey): implement */ } +void libmv_floatImageDestroy(libmv_FloatImage* /*image*/) +{ +} + /* ************ Tracks ************ */ libmv_Tracks *libmv_tracksNew(void) { @@ -134,6 +138,10 @@ libmv_Reconstruction *libmv_solveModal( return NULL; } +int libmv_reconstructionIsValid(libmv_Reconstruction * /*libmv_reconstruction*/) { + return 0; +} + int libmv_reprojectionPointForTrack( const libmv_Reconstruction * /*libmv_reconstruction*/, int /*track*/, @@ -171,20 +179,20 @@ void libmv_reconstructionDestroy( /* ************ Feature detector ************ */ -libmv_Features *libmv_detectFeaturesByte(const unsigned char */*image_buffer*/, +libmv_Features *libmv_detectFeaturesByte(const unsigned char * /*image_buffer*/, int /*width*/, int /*height*/, int /*channels*/, - libmv_DetectOptions */*options*/) { + libmv_DetectOptions * /*options*/) { return NULL; } struct libmv_Features *libmv_detectFeaturesFloat( - const float */*image_buffer*/, + const float * /*image_buffer*/, int /*width*/, int /*height*/, int /*channels*/, - libmv_DetectOptions */*options*/) { + libmv_DetectOptions * /*options*/) { return NULL; } @@ -239,7 +247,7 @@ void libmv_cameraIntrinsicsSetThreads( } void libmv_cameraIntrinsicsExtractOptions( - const libmv_CameraIntrinsics */*libmv_intrinsics*/, + const libmv_CameraIntrinsics * /*libmv_intrinsics*/, libmv_CameraIntrinsicsOptions *camera_intrinsics_options) { memset(camera_intrinsics_options, 0, sizeof(libmv_CameraIntrinsicsOptions)); camera_intrinsics_options->focal_length = 1.0; @@ -328,3 +336,68 @@ void libmv_homography2DFromCorrespondencesEuc(/* const */ double (*x1)[2], H[1][1] = 1.0f; H[2][2] = 1.0f; } + +/* ************ autotrack ************ */ + +libmv_AutoTrack* libmv_autoTrackNew(libmv_FrameAccessor* /*frame_accessor*/) +{ + return NULL; +} + +void libmv_autoTrackDestroy(libmv_AutoTrack* /*libmv_autotrack*/) +{ +} + +void libmv_autoTrackSetOptions(libmv_AutoTrack* /*libmv_autotrack*/, + const libmv_AutoTrackOptions* /*options*/) +{ +} + +int libmv_autoTrackMarker(libmv_AutoTrack* /*libmv_autotrack*/, + const libmv_TrackRegionOptions* /*libmv_options*/, + libmv_Marker * /*libmv_tracker_marker*/, + libmv_TrackRegionResult* /*libmv_result*/) +{ + return 0; +} + +void libmv_autoTrackAddMarker(libmv_AutoTrack* /*libmv_autotrack*/, + const libmv_Marker* /*libmv_marker*/) +{ +} + +int libmv_autoTrackGetMarker(libmv_AutoTrack* /*libmv_autotrack*/, + int /*clip*/, + int /*frame*/, + int /*track*/, + libmv_Marker* /*libmv_marker*/) +{ + return 0; +} + +/* ************ frame accessor ************ */ + +libmv_FrameAccessor* libmv_FrameAccessorNew( + libmv_FrameAccessorUserData* /*user_data**/, + libmv_GetImageCallback /*get_image_callback*/, + libmv_ReleaseImageCallback /*release_image_callback*/) +{ + return NULL; +} + +void libmv_FrameAccessorDestroy(libmv_FrameAccessor* /*frame_accessor*/) +{ +} + +int64_t libmv_frameAccessorgetTransformKey( + const libmv_FrameTransform * /*transform*/) +{ + return 0; +} + +void libmv_frameAccessorgetTransformRun(const libmv_FrameTransform* /*transform*/, + const libmv_FloatImage* /*input_image*/, + libmv_FloatImage* /*output_image*/) +{ +} + diff --git a/extern/libmv/intern/track_region.h b/extern/libmv/intern/track_region.h index 95ec124c3e1..7ed3e443e40 100644 --- a/extern/libmv/intern/track_region.h +++ b/extern/libmv/intern/track_region.h @@ -49,8 +49,8 @@ typedef struct libmv_TrackRegionResult { #ifdef __cplusplus namespace libmv { - class TrackRegionOptions; - class TrackRegionResult; + struct TrackRegionOptions; + struct TrackRegionResult; } void libmv_configureTrackRegionOptions( const libmv_TrackRegionOptions& options, diff --git a/extern/libmv/intern/tracksN.cc b/extern/libmv/intern/tracksN.cc new file mode 100644 index 00000000000..9e1da88ef10 --- /dev/null +++ b/extern/libmv/intern/tracksN.cc @@ -0,0 +1,138 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2011 Blender Foundation. + * All rights reserved. + * + * Contributor(s): Blender Foundation, + * Sergey Sharybin + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "intern/tracksN.h" +#include "intern/utildefines.h" +#include "libmv/autotrack/marker.h" +#include "libmv/autotrack/tracks.h" + +using mv::Marker; +using mv::Tracks; + +void libmv_apiMarkerToMarker(const libmv_Marker& libmv_marker, + Marker *marker) { + marker->clip = libmv_marker.clip; + marker->frame = libmv_marker.frame; + marker->track = libmv_marker.track; + marker->center(0) = libmv_marker.center[0]; + marker->center(1) = libmv_marker.center[1]; + for (int i = 0; i < 4; i++) { + marker->patch.coordinates(i, 0) = libmv_marker.patch[i][0]; + marker->patch.coordinates(i, 1) = libmv_marker.patch[i][1]; + } + marker->search_region.min(0) = libmv_marker.search_region_min[0]; + marker->search_region.min(1) = libmv_marker.search_region_min[1]; + marker->search_region.max(0) = libmv_marker.search_region_max[0]; + marker->search_region.max(1) = libmv_marker.search_region_max[1]; + marker->weight = libmv_marker.weight; + marker->source = (Marker::Source) libmv_marker.source; + marker->status = (Marker::Status) libmv_marker.status; + marker->reference_clip = libmv_marker.reference_clip; + marker->reference_frame = libmv_marker.reference_frame; + marker->model_type = (Marker::ModelType) libmv_marker.model_type; + marker->model_id = libmv_marker.model_id; + marker->disabled_channels = libmv_marker.disabled_channels; +} + +void libmv_markerToApiMarker(const Marker& marker, + libmv_Marker *libmv_marker) { + libmv_marker->clip = marker.clip; + libmv_marker->frame = marker.frame; + libmv_marker->track = marker.track; + libmv_marker->center[0] = marker.center(0); + libmv_marker->center[1] = marker.center(1); + for (int i = 0; i < 4; i++) { + libmv_marker->patch[i][0] = marker.patch.coordinates(i, 0); + libmv_marker->patch[i][1] = marker.patch.coordinates(i, 1); + } + libmv_marker->search_region_min[0] = marker.search_region.min(0); + libmv_marker->search_region_min[1] = marker.search_region.min(1); + libmv_marker->search_region_max[0] = marker.search_region.max(0); + libmv_marker->search_region_max[1] = marker.search_region.max(1); + libmv_marker->weight = marker.weight; + libmv_marker->source = (libmv_MarkerSource) marker.source; + libmv_marker->status = (libmv_MarkerStatus) marker.status; + libmv_marker->reference_clip = marker.reference_clip; + libmv_marker->reference_frame = marker.reference_frame; + libmv_marker->model_type = (libmv_MarkerModelType) marker.model_type; + libmv_marker->model_id = marker.model_id; + libmv_marker->disabled_channels = marker.disabled_channels; +} + +libmv_TracksN* libmv_tracksNewN(void) { + Tracks* tracks = LIBMV_OBJECT_NEW(Tracks); + + return (libmv_TracksN*) tracks; +} + +void libmv_tracksDestroyN(libmv_TracksN* libmv_tracks) { + LIBMV_OBJECT_DELETE(libmv_tracks, Tracks); +} + +void libmv_tracksAddMarkerN(libmv_TracksN* libmv_tracks, + const libmv_Marker* libmv_marker) { + Marker marker; + libmv_apiMarkerToMarker(*libmv_marker, &marker); + ((Tracks*) libmv_tracks)->AddMarker(marker); +} + +void libmv_tracksGetMarkerN(libmv_TracksN* libmv_tracks, + int clip, + int frame, + int track, + libmv_Marker* libmv_marker) { + Marker marker; + ((Tracks*) libmv_tracks)->GetMarker(clip, frame, track, &marker); + libmv_markerToApiMarker(marker, libmv_marker); +} + +void libmv_tracksRemoveMarkerN(libmv_TracksN* libmv_tracks, + int clip, + int frame, + int track) { + ((Tracks *) libmv_tracks)->RemoveMarker(clip, frame, track); +} + +void libmv_tracksRemoveMarkersForTrack(libmv_TracksN* libmv_tracks, + int track) { + ((Tracks *) libmv_tracks)->RemoveMarkersForTrack(track); +} + +int libmv_tracksMaxClipN(libmv_TracksN* libmv_tracks) { + return ((Tracks*) libmv_tracks)->MaxClip(); +} + +int libmv_tracksMaxFrameN(libmv_TracksN* libmv_tracks, int clip) { + return ((Tracks*) libmv_tracks)->MaxFrame(clip); +} + +int libmv_tracksMaxTrackN(libmv_TracksN* libmv_tracks) { + return ((Tracks*) libmv_tracks)->MaxTrack(); +} + +int libmv_tracksNumMarkersN(libmv_TracksN* libmv_tracks) { + return ((Tracks*) libmv_tracks)->NumMarkers(); +} diff --git a/extern/libmv/intern/tracksN.h b/extern/libmv/intern/tracksN.h new file mode 100644 index 00000000000..d0cb54e40bc --- /dev/null +++ b/extern/libmv/intern/tracksN.h @@ -0,0 +1,129 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2011 Blender Foundation. + * All rights reserved. + * + * Contributor(s): Blender Foundation, + * Sergey Sharybin + * + * ***** END GPL LICENSE BLOCK ***** + */ + +// TODO(serrgey): For the time being we're converting simple pipeline +// to an autotrack pipeline we call it tracks. +// Once we've done with porting we remove N. + +#ifndef LIBMV_C_API_TRACKSN_H_ +#define LIBMV_C_API_TRACKSN_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct libmv_TracksN libmv_TracksN; + +// Keep order in this enums exactly the same as in mv::Marker. +// Otherwise API wouldn't convert the values properly. +typedef enum libmv_MarkerSource { + LIBMV_MARKER_SOURCE_MANUAL, + LIBMV_MARKER_SOURCE_DETECTED, + LIBMV_MARKER_SOURCE_TRACKED, + LIBMV_MARKER_SOURCE_MATCHED, + LIBMV_MARKER_SOURCE_PREDICTED, +} libmv_MarkerSource; + +typedef enum libmv_MarkerStatus { + LIBMV_MARKER_STATUS_UNKNOWN, + LIBMV_MARKER_STATUS_INLIER, + LIBMV_MARKER_STATUS_OUTLIER, +} libmv_MarkerStatus; + +typedef enum libmv_MarkerModelType { + LIBMV_MARKER_MODEL_TYPE_POINT, + LIBMV_MARKER_MODEL_TYPE_PLANE, + LIBMV_MARKER_MODEL_TYPE_LINE, + LIBMV_MARKER_MODEL_TYPE_CUBE, +} libmv_MarkerModelType; + +enum libmv_MarkerChannel { + LIBMV_MARKER_CHANNEL_R = (1 << 0), + LIBMV_MARKER_CHANNEL_G = (1 << 1), + LIBMV_MARKER_CHANNEL_B = (1 << 2), +}; + +typedef struct libmv_Marker { + int clip; + int frame; + int track; + float center[2]; + float patch[4][2]; + float search_region_min[2]; + float search_region_max[2]; + float weight; + libmv_MarkerSource source; + libmv_MarkerStatus status; + int reference_clip; + int reference_frame; + libmv_MarkerModelType model_type; + int model_id; + int disabled_channels; +} libmv_Marker; + +#ifdef __cplusplus +namespace mv { + struct 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_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); + +#ifdef __cplusplus +} +#endif + +#endif // LIBMV_C_API_TRACKS_H_ |