Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'extern/libmv/intern/detector.cc')
-rw-r--r--extern/libmv/intern/detector.cc148
1 files changed, 148 insertions, 0 deletions
diff --git a/extern/libmv/intern/detector.cc b/extern/libmv/intern/detector.cc
new file mode 100644
index 00000000000..8abc9014115
--- /dev/null
+++ b/extern/libmv/intern/detector.cc
@@ -0,0 +1,148 @@
+/*
+ * ***** 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/detector.h"
+#include "intern/image.h"
+#include "intern/utildefines.h"
+#include "libmv/simple_pipeline/detect.h"
+
+using libmv::Detect;
+using libmv::DetectOptions;
+using libmv::Feature;
+using libmv::FloatImage;
+
+struct libmv_Features {
+ int count;
+ Feature* features;
+};
+
+namespace {
+
+libmv_Features *libmv_featuresFromVector(
+ const libmv::vector<Feature>& features) {
+ libmv_Features* libmv_features = LIBMV_STRUCT_NEW(libmv_Features, 1);
+ int count = features.size();
+ if (count) {
+ libmv_features->features = LIBMV_STRUCT_NEW(Feature, count);
+ for (int i = 0; i < count; i++) {
+ libmv_features->features[i] = features.at(i);
+ }
+ } else {
+ libmv_features->features = NULL;
+ }
+ libmv_features->count = count;
+ return libmv_features;
+}
+
+void libmv_convertDetectorOptions(libmv_DetectOptions *options,
+ DetectOptions *detector_options) {
+ switch (options->detector) {
+#define LIBMV_CONVERT(the_detector) \
+ case LIBMV_DETECTOR_ ## the_detector: \
+ detector_options->type = DetectOptions::the_detector; \
+ break;
+ LIBMV_CONVERT(FAST)
+ LIBMV_CONVERT(MORAVEC)
+ LIBMV_CONVERT(HARRIS)
+#undef LIBMV_CONVERT
+ }
+ detector_options->margin = options->margin;
+ detector_options->min_distance = options->min_distance;
+ detector_options->fast_min_trackness = options->fast_min_trackness;
+ detector_options->moravec_max_count = options->moravec_max_count;
+ detector_options->moravec_pattern = options->moravec_pattern;
+ detector_options->harris_threshold = options->harris_threshold;
+}
+
+} // namespace
+
+libmv_Features *libmv_detectFeaturesByte(const unsigned char* image_buffer,
+ int width,
+ int height,
+ int channels,
+ libmv_DetectOptions* options) {
+ // Prepare the image.
+ FloatImage image;
+ libmv_byteBufferToFloatImage(image_buffer, width, height, channels, &image);
+
+ // Configure detector.
+ DetectOptions detector_options;
+ libmv_convertDetectorOptions(options, &detector_options);
+
+ // Run the detector.
+ libmv::vector<Feature> detected_features;
+ Detect(image, detector_options, &detected_features);
+
+ // Convert result to C-API.
+ libmv_Features* result = libmv_featuresFromVector(detected_features);
+ return result;
+}
+
+libmv_Features* libmv_detectFeaturesFloat(const float* image_buffer,
+ int width,
+ int height,
+ int channels,
+ libmv_DetectOptions* options) {
+ // Prepare the image.
+ FloatImage image;
+ libmv_floatBufferToFloatImage(image_buffer, width, height, channels, &image);
+
+ // Configure detector.
+ DetectOptions detector_options;
+ libmv_convertDetectorOptions(options, &detector_options);
+
+ // Run the detector.
+ libmv::vector<Feature> detected_features;
+ Detect(image, detector_options, &detected_features);
+
+ // Convert result to C-API.
+ libmv_Features* result = libmv_featuresFromVector(detected_features);
+ return result;
+}
+
+void libmv_featuresDestroy(libmv_Features* libmv_features) {
+ if (libmv_features->features) {
+ LIBMV_STRUCT_DELETE(libmv_features->features);
+ }
+ LIBMV_STRUCT_DELETE(libmv_features);
+}
+
+int libmv_countFeatures(const libmv_Features* libmv_features) {
+ return libmv_features->count;
+}
+
+void libmv_getFeature(const libmv_Features* libmv_features,
+ int number,
+ double* x,
+ double* y,
+ double* score,
+ double* size) {
+ Feature &feature = libmv_features->features[number];
+ *x = feature.x;
+ *y = feature.y;
+ *score = feature.score;
+ *size = feature.size;
+}