2 * ***** BEGIN GPL LICENSE BLOCK *****
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * The Original Code is Copyright (C) 2013 Blender Foundation.
19 * All rights reserved.
21 * Contributor(s): Blender Foundation,
24 * ***** END GPL LICENSE BLOCK *****
29 #include "libmv-capi.h"
34 /* ************ Logging ************ */
36 void libmv_initLogging(const char * /*argv0*/)
40 void libmv_startDebugLogging(void)
44 void libmv_setLoggingVerbosity(int /*verbosity*/)
48 /* ************ Planar tracker ************ */
50 /* TrackRegion (new planar tracker) */
51 int libmv_trackRegion(const libmv_TrackRegionOptions * /*options*/,
52 const float * /*image1*/, int /*image1_width*/, int /*image1_height*/,
53 const float * /*image2*/, int /*image2_width*/, int /*image2_height*/,
54 const double *x1, const double *y1,
55 libmv_TrackRegionResult *result,
56 double *x2, double *y2)
58 /* Convert to doubles for the libmv api. The four corners and the center. */
59 for (int i = 0; i < 5; ++i) {
64 result->termination = -1;
65 result->termination_reason = "Built without libmv support";
66 result->correlation = 0.0;
71 void libmv_samplePlanarPatch(const float *image, int width, int height,
72 int channels, const double *xs, const double *ys,
73 int num_samples_x, int num_samples_y,
74 const float *mask, float *patch,
75 double *warped_position_x, double *warped_position_y)
77 /* TODO(sergey): implement */
80 /* ************ Tracks ************ */
82 struct libmv_Tracks *libmv_tracksNew(void)
87 void libmv_tracksInsert(struct libmv_Tracks * /*libmv_tracks*/, int /*image*/,
88 int /*track*/, double /*x*/, double /*y*/, double /*weight*/)
92 void libmv_tracksDestroy(struct libmv_Tracks * /*libmv_tracks*/)
96 /* ************ Reconstruction solver ************ */
98 struct libmv_Reconstruction *libmv_solveReconstruction(const struct libmv_Tracks * /*libmv_tracks*/,
99 const libmv_CameraIntrinsicsOptions * /*libmv_camera_intrinsics_options*/,
100 libmv_ReconstructionOptions * /*libmv_reconstruction_options*/,
101 reconstruct_progress_update_cb /*progress_update_callback*/,
102 void * /*callback_customdata*/)
107 struct libmv_Reconstruction *libmv_solveModal(const struct libmv_Tracks * /*libmv_tracks*/,
108 const libmv_CameraIntrinsicsOptions * /*libmv_camera_intrinsics_options*/,
109 const libmv_ReconstructionOptions * /*libmv_reconstruction_options*/,
110 reconstruct_progress_update_cb /*progress_update_callback*/,
111 void * /*callback_customdata*/)
116 int libmv_reprojectionPointForTrack(const struct libmv_Reconstruction * /*libmv_reconstruction*/,
117 int /*track*/, double /*pos*/[3])
122 double libmv_reprojectionErrorForTrack(const struct libmv_Reconstruction * /*libmv_reconstruction*/, int /*track*/)
127 double libmv_reprojectionErrorForImage(const struct libmv_Reconstruction * /*libmv_reconstruction*/, int /*image*/)
132 int libmv_reprojectionCameraForImage(const struct libmv_Reconstruction * /*libmv_reconstruction*/, int /*image*/,
133 double /*mat*/[4][4])
138 double libmv_reprojectionError(const struct libmv_Reconstruction * /*libmv_reconstruction*/)
143 void libmv_reconstructionDestroy(struct libmv_Reconstruction * /*libmv_reconstruction*/)
147 /* ************ feature detector ************ */
149 struct libmv_Features *libmv_detectFeaturesFAST(const unsigned char * /*data*/, int /*width*/, int /*height*/,
150 int /*stride*/, int /*margin*/, int /*min_trackness*/,
151 int /*min_distance*/)
156 struct libmv_Features *libmv_detectFeaturesMORAVEC(const unsigned char * /*data*/, int /*width*/, int /*height*/,
157 int /*stride*/, int /*margin*/, int /*count*/, int /*min_distance*/)
162 int libmv_countFeatures(const struct libmv_Features * /*libmv_features*/)
167 void libmv_getFeature(const struct libmv_Features * /*libmv_features*/, int /*number*/,
168 double *x, double *y, double *score, double *size)
176 void libmv_featuresDestroy(struct libmv_Features * /*libmv_features*/)
180 /* ************ camera intrinsics ************ */
182 struct libmv_CameraIntrinsics *libmv_reconstructionExtractIntrinsics(
183 struct libmv_Reconstruction * /*libmv_reconstruction*/)
188 struct libmv_CameraIntrinsics *libmv_cameraIntrinsicsNewEmpty(void)
193 struct libmv_CameraIntrinsics *libmv_cameraIntrinsicsNew(
194 const libmv_CameraIntrinsicsOptions * /*libmv_camera_intrinsics_options*/)
199 struct libmv_CameraIntrinsics *libmv_cameraIntrinsicsCopy(const libmv_CameraIntrinsics * /*libmvIntrinsics*/)
204 void libmv_cameraIntrinsicsDestroy(struct libmv_CameraIntrinsics * /*libmvIntrinsics*/)
208 void libmv_cameraIntrinsicsUpdate(const libmv_CameraIntrinsicsOptions * /*libmv_camera_intrinsics_options*/,
209 struct libmv_CameraIntrinsics * /*libmv_intrinsics*/)
213 void libmv_cameraIntrinsicsSetThreads(struct libmv_CameraIntrinsics * /*libmv_intrinsics*/, int /*threads*/)
217 void libmv_cameraIntrinsicsExtract(const struct libmv_CameraIntrinsics * /*libmv_intrinsics*/, double * focal_length,
218 double * principal_x, double *principal_y, double *k1, double *k2, double *k3,
219 int *width, int *height)
230 void libmv_cameraIntrinsicsUndistortByte(const struct libmv_CameraIntrinsics * /*libmv_intrinsics*/,
231 unsigned char *src, unsigned char *dst, int width, int height,
232 float overscan, int channels)
234 memcpy(dst, src, channels * width * height * sizeof(unsigned char));
237 void libmv_cameraIntrinsicsUndistortFloat(const struct libmv_CameraIntrinsics * /*libmvIntrinsics*/,
238 float *src, float *dst, int width, int height, float overscan, int channels)
240 memcpy(dst, src, channels * width * height * sizeof(float));
243 void libmv_cameraIntrinsicsDistortByte(const struct libmv_CameraIntrinsics *libmvIntrinsics,
244 unsigned char *src, unsigned char *dst, int width, int height,
245 float overscan, int channels)
247 memcpy(dst, src, channels * width * height * sizeof(unsigned char));
250 void libmv_cameraIntrinsicsDistortFloat(const struct libmv_CameraIntrinsics *libmvIntrinsics,
251 float *src, float *dst, int width, int height, float overscan, int channels)
253 memcpy(dst, src, channels * width * height * sizeof(float));
256 /* ************ utils ************ */
258 void libmv_cameraIntrinsicsApply(const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options,
259 double x, double y, double *x1, double *y1)
261 double focal_length = libmv_camera_intrinsics_options->focal_length;
262 double principal_x = libmv_camera_intrinsics_options->principal_point_x;
263 double principal_y = libmv_camera_intrinsics_options->principal_point_y;
265 *x1 = x * focal_length + principal_x;
266 *y1 = y * focal_length + principal_y;
269 void libmv_cameraIntrinsicsInvert(const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options,
270 double x, double y, double *x1, double *y1)
272 double focal_length = libmv_camera_intrinsics_options->focal_length;
273 double principal_x = libmv_camera_intrinsics_options->principal_point_x;
274 double principal_y = libmv_camera_intrinsics_options->principal_point_y;
276 *x1 = (x - principal_x) / focal_length;
277 *y1 = (y - principal_y) / focal_length;
280 void libmv_homography2DFromCorrespondencesEuc(double (* /* x1 */)[2], double (* /* x2 */)[2], int /* num_points */,
283 memset(H, 0, sizeof(double[3][3]));
289 #endif // ifndef WITH_LIBMV