From 8d2f2653c8a9f7101dbd4c0727beccaa48c98634 Mon Sep 17 00:00:00 2001
From: Tino Hager <tino.hager@nager.at>
Date: Sat, 23 Jun 2018 09:06:43 +0000
Subject: [PATCH] .NET/C# support integration

---
 src/yolo_v2_class.cpp |   45 +++++++++++++++++++++++++++++++++++++++++++++
 src/yolo_v2_class.hpp |   11 +++++++++++
 2 files changed, 56 insertions(+), 0 deletions(-)

diff --git a/src/yolo_v2_class.cpp b/src/yolo_v2_class.cpp
index faaf8d1..6147e3c 100644
--- a/src/yolo_v2_class.cpp
+++ b/src/yolo_v2_class.cpp
@@ -22,6 +22,51 @@
 
 #define FRAMES 3
 
+int max_objects() { return C_SHARP_MAX_OBJECTS; }
+
+static Detector* detector;
+//static std::unique_ptr<Detector> detector;
+
+int init(const char *configurationFilename, const char *weightsFilename, int gpu) {
+    std::string configurationFilenameString;
+    configurationFilenameString = configurationFilename;
+    std::string weightsFilenameString;
+    weightsFilenameString = weightsFilename;
+
+    detector = new Detector(configurationFilenameString, weightsFilenameString, gpu);
+    return 1;
+}
+
+int detect_image(const char *filename, bbox_t_container &container) {
+    std::string filenameString;
+    filenameString = filename;
+
+    std::vector<bbox_t> detection = detector->detect(filenameString);
+    for (size_t i = 0; i < detection.size() && i < C_SHARP_MAX_OBJECTS; ++i)
+        container.candidates[i] = detection[i];
+    return detection.size();
+}
+
+int detect_image2(const uint8_t* data, const size_t data_length, bbox_t_container &container) {
+#ifdef OPENCV
+    std::vector<char> vdata(data, data + data_length);
+    cv::Mat image = imdecode(cv::Mat(vdata), 1);
+
+    std::vector<bbox_t> detection = detector->detect(image);
+    for (size_t i = 0; i < detection.size() && i < C_SHARP_MAX_OBJECTS; ++i)
+        container.candidates[i] = detection[i];
+    return detection.size();
+#else
+    return -1;
+#endif	// OPENCV
+}
+
+int dispose() {
+    detector->~Detector();
+    //detector.reset();
+    return 1;
+}
+
 #ifdef GPU
 void check_cuda(cudaError_t status) {
 	if (status != cudaSuccess) {
diff --git a/src/yolo_v2_class.hpp b/src/yolo_v2_class.hpp
index fd00dc0..2416050 100644
--- a/src/yolo_v2_class.hpp
+++ b/src/yolo_v2_class.hpp
@@ -28,6 +28,11 @@
 	float *data;				// pointer to the image data
 };
 
+#define C_SHARP_MAX_OBJECTS 1000
+struct bbox_t_container {
+    bbox_t candidates[C_SHARP_MAX_OBJECTS];
+};
+
 #ifdef __cplusplus
 #include <memory>
 #include <vector>
@@ -40,6 +45,12 @@
 #include "opencv2/imgproc/imgproc_c.h"	// C
 #endif	// OPENCV
 
+extern "C" __declspec(dllexport) int max_objects();
+extern "C" __declspec(dllexport) int init(const char *configurationFilename, const char *weightsFilename, int gpu);
+extern "C" __declspec(dllexport) int detect_image(const char *filename, bbox_t_container &container);
+extern "C" __declspec(dllexport) int detect_image2(const uint8_t* data, const size_t data_length, bbox_t_container &container);
+extern "C" __declspec(dllexport) int dispose();
+
 class Detector {
 	std::shared_ptr<void> detector_gpu_ptr;
 	std::deque<std::vector<bbox_t>> prev_bbox_vec_deque;

--
Gitblit v1.10.0