From 48bf06c1cadadcfb93faa8df63db71e59b534f55 Mon Sep 17 00:00:00 2001
From: xuepengqiang <506321815@qq.com>
Date: 星期二, 26 五月 2020 19:24:41 +0800
Subject: [PATCH] add m

---
 src/switcher_util.cpp   |   92 +++++++
 main.cpp                |  152 +++++++++++
 src/coord_interface.h   |   26 ++
 src/homography_util.cpp |   92 +++++++
 CMakeLists.txt          |   24 +
 src/json_util.h         |   13 +
 src/math_util.h         |   30 ++
 src/json_util.cpp       |   25 +
 src/homography_util.h   |   28 ++
 src/con_target.h        |   78 ++++++
 src/switcher_util.h     |   48 +++
 src/coord_interface.cpp |  135 ++++++++++
 src/math_util.cpp       |   37 ++
 13 files changed, 780 insertions(+), 0 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..6b28e2b
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,24 @@
+cmake_minimum_required(VERSION 3.15)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -W")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -std=c++11 -W")  #
+project(sw)
+set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build)
+
+set(CMAKE_CXX_STANDARD 11)
+
+add_compile_options(-fPIC -g -Wall -Wshadow -Wno-sign-compare -w)
+
+
+
+file(GLOB_RECURSE current_headers
+        ./src/*.h
+        )
+file(GLOB sources ./*.cpp ./src/*.cpp)
+
+source_group("Include" FILES ${current_headers})
+source_group("Source" FILES ${sources})
+
+add_executable(${PROJECT_NAME} main.cpp ${sources})
+
+target_link_libraries(${PROJECT_NAME}
+        )
diff --git a/main.cpp b/main.cpp
new file mode 100644
index 0000000..eeebf28
--- /dev/null
+++ b/main.cpp
@@ -0,0 +1,152 @@
+#include <iostream>
+#include "./src/coord_interface.h"
+#include "src/con_target.h"
+#include "./src/math_util.h"
+
+int main() {
+    std::cout << "Hello, World!" << std::endl;
+//    float Ax = 30.0f, Ay = 110.0f, Bx = 326.36f, By = 64.45f;
+//    const char* config_str = "{\"leftCam\":{ \"A1x\": 30.0, \"A1y\":110.0 ,\"A2x\": 120.0,\"A2y\":200.0, ,\"A3x\": 80.0,\"A3y\":400.0, ,\"A4x\": 20.0,\"A4y\":287.0},"
+//                                "rightCam\":{ \"B1x\": 30.0, \"B1y\":110.0 ,\"B2x\": 120.0,\"B2y\":200.0, ,\"B3x\": 80.0,\"B3y\":400.0, ,\"B4x\": 20.0,\"B4y\":287.0}"
+//                                "}";
+
+//    CoordManager CM(config_str);
+
+    // ---- 鍒濆鍖栬祴鍊� ---
+    CamVec *CV_Reg = (CamVec*)malloc(sizeof(CamVec));
+    CV_Reg->count = 3; //琛ㄧず鏈�3涓憚鍍忔満鐩镐簰鍏宠仈
+    int reg_point_size = 4; // 鍏宠仈鍖哄煙鐨勫潗鏍囩偣鏁�
+    CV_Reg->regInfo = (RegInfo*)malloc(sizeof(RegInfo)*CV_Reg->count);
+
+    SPoint2f *regA_point = (SPoint2f*)malloc(sizeof(SPoint2f)*reg_point_size);
+    regA_point[0] = SPoint2f(100.0f, 100.0f);
+    regA_point[1] = SPoint2f(120.0f, 200.0f);
+    regA_point[2] = SPoint2f(80.0f, 400.0f);
+    regA_point[3] = SPoint2f(20.0f, 287.0f);
+    CV_Reg->regInfo[0].count = reg_point_size;
+    CV_Reg->regInfo[0].point = regA_point;
+
+    SPoint2f* regB_point = (SPoint2f*)malloc(sizeof(SPoint2f)*reg_point_size);
+    regB_point[0] = SPoint2f(326.36f, 64.45f);
+    regB_point[1] = SPoint2f(339.16f, 128.24f);
+    regB_point[2] = SPoint2f(313.73f, 255.86f);
+    regB_point[3] = SPoint2f(275.41f, 183.80f);
+    CV_Reg->regInfo[1].count = reg_point_size;
+    CV_Reg->regInfo[1].point = regB_point;
+
+    SPoint2f* regC_point = (SPoint2f*)malloc(sizeof(SPoint2f)*reg_point_size);
+    regC_point[0] = SPoint2f(326.36f, 64.45f);
+    regC_point[1] = SPoint2f(339.16f, 128.24f);
+    regC_point[2] = SPoint2f(313.73f, 255.86f);
+    regC_point[3] = SPoint2f(275.41f, 183.80f);
+    CV_Reg->regInfo[2].count = reg_point_size;
+    CV_Reg->regInfo[2].point = regC_point;
+
+    CoordManager CM(CV_Reg); //鍒濆鍖栧尯鍩熶俊鎭�
+
+
+    // 鑾峰彇寰呭尮閰嶇殑鐐逛俊鎭�
+    MulCam* mulCam = (MulCam*)malloc(sizeof(MulCam));
+    mulCam->cam_count = CV_Reg->count;
+    mulCam->matchHuman = (MatchHuman*)malloc(sizeof(MatchHuman)*mulCam->cam_count);
+
+
+//    MatchHuman * A_Human = (MatchHuman*)malloc(sizeof(MatchHuman));
+    int A_hcount = 3;
+    mulCam->matchHuman[0].humanInfo = (HumanInfo*)malloc(sizeof(HumanInfo)*A_hcount);
+    mulCam->matchHuman[0].humanInfo[0].human_id = 10000;
+    mulCam->matchHuman[0].humanInfo[0].point = SPoint2f(100.0f, 100.0f);
+    mulCam->matchHuman[0].humanInfo[1].human_id = 1002;
+    mulCam->matchHuman[0].humanInfo[1].point = SPoint2f(30.0f, 110.0f);
+    mulCam->matchHuman[0].humanInfo[2].human_id = 1003;
+    mulCam->matchHuman[0].humanInfo[2].point = SPoint2f(35.0f, 100.0f);
+    mulCam->matchHuman[0].count = A_hcount;
+//    mulCam->matchHuman[0].humanInfo = A_Human;
+
+//    MatchHuman * B_Human = (MatchHuman*)malloc(sizeof(MatchHuman));
+    int B_hcount = 2;
+    mulCam->matchHuman[1].humanInfo = (HumanInfo*)malloc(sizeof(HumanInfo)*B_hcount);
+    mulCam->matchHuman[1].humanInfo[0].human_id = 2001;
+    mulCam->matchHuman[1].humanInfo[0].point = SPoint2f(326.36f, 64.45f);
+    mulCam->matchHuman[1].humanInfo[1].human_id = 2003;
+    mulCam->matchHuman[1].humanInfo[1].point = SPoint2f(280.9f, 60.49f);
+    mulCam->matchHuman[1].count = B_hcount;
+//    mulCam->matchHuman[1] = B_Human;
+
+//    MatchHuman * C_Human = (MatchHuman*)malloc(sizeof(MatchHuman));
+    int C_hcount = 1;
+    mulCam->matchHuman[2].humanInfo = (HumanInfo*)malloc(sizeof(HumanInfo)*B_hcount);
+    mulCam->matchHuman[2].humanInfo[0].human_id = 30001;
+    mulCam->matchHuman[2].humanInfo[0].point = SPoint2f(284.9f, 64.49f);
+    mulCam->matchHuman[2].count = C_hcount;
+//    mulCam->matchHuman[2] = C_Human;
+
+
+
+
+    MulCam* lastmulCam = (MulCam*)malloc(sizeof(MulCam));
+    lastmulCam->cam_count = CV_Reg->count;
+    lastmulCam->matchHuman = (MatchHuman*)malloc(sizeof(MatchHuman)*mulCam->cam_count);
+
+
+//    MatchHuman * A_Human = (MatchHuman*)malloc(sizeof(MatchHuman));
+    int lA_hcount = 3;
+    lastmulCam->matchHuman[0].humanInfo = (HumanInfo*)malloc(sizeof(HumanInfo)*A_hcount);
+    lastmulCam->matchHuman[0].humanInfo[0].human_id = 1;
+    lastmulCam->matchHuman[0].humanInfo[0].point = SPoint2f(100.0f, 100.0f);
+    lastmulCam->matchHuman[0].humanInfo[1].human_id = 2;
+    lastmulCam->matchHuman[0].humanInfo[1].point = SPoint2f(30.0f, 110.0f);
+    lastmulCam->matchHuman[0].humanInfo[2].human_id = 3;
+    lastmulCam->matchHuman[0].humanInfo[2].point = SPoint2f(35.0f, 100.0f);
+    lastmulCam->matchHuman[0].count = lA_hcount;
+//    mulCam->matchHuman[0].humanInfo = A_Human;
+
+//    MatchHuman * B_Human = (MatchHuman*)malloc(sizeof(MatchHuman));
+    int lB_hcount = 2;
+    lastmulCam->matchHuman[1].humanInfo = (HumanInfo*)malloc(sizeof(HumanInfo)*B_hcount);
+    lastmulCam->matchHuman[1].humanInfo[0].human_id = 3;
+    lastmulCam->matchHuman[1].humanInfo[0].point = SPoint2f(326.36f, 64.45f);
+    lastmulCam->matchHuman[1].humanInfo[1].human_id = 5;
+    lastmulCam->matchHuman[1].humanInfo[1].point = SPoint2f(284.9f, 64.49f);
+    lastmulCam->matchHuman[1].count = lB_hcount;
+//    mulCam->matchHuman[1] = B_Human;
+
+//    MatchHuman * C_Human = (MatchHuman*)malloc(sizeof(MatchHuman));
+    int lC_hcount = 1;
+    lastmulCam->matchHuman[2].humanInfo = (HumanInfo*)malloc(sizeof(HumanInfo)*B_hcount);
+    lastmulCam->matchHuman[2].humanInfo[1].human_id = 5;
+    lastmulCam->matchHuman[2].humanInfo[1].point = SPoint2f(284.9f, 64.49f);
+    lastmulCam->matchHuman[2].count = lC_hcount;
+
+
+
+    char * result="";
+
+
+    result = CM.get_result(mulCam, lastmulCam);// 鎵归噺鍖归厤鍖哄煙涓殑浜�
+
+    std::cout<< " ----------   " <<  std::endl;
+    std::cout<< result <<  std::endl;
+//    //閬嶅巻缁撴灉
+//    for (int i = 0; i < mulCam->cam_count-1; ++i) {
+//        map<string,float>::iterator iter;
+//        for (iter=target->camResult[i].confidence_map.begin() ;iter!=target->camResult[i].confidence_map.end();iter++) {
+//            std::cout<< iter->first << "  confidence   " << iter->second << std::endl;
+//        }
+//    }
+//
+//    std::cout<< " ----------   " <<  std::endl;
+//    map<int,int>::iterator direction_iter;
+//    for (direction_iter=target->direction_map.begin();direction_iter!=target->direction_map.end();direction_iter++) {
+//        std::cout<< direction_iter->first << "  direction   " << direction_iter->second << std::endl;
+//    }
+
+//    map<string,float>::iterator iter;
+//    for (iter=confidence_map.begin() ;iter!=confidence_map.end();iter++) {
+//        std::cout<< iter->first << "  confidence   " << iter->second << std::endl;
+//    }
+
+
+    std::cout << "--over" << std::endl;
+    return 0;
+}
\ No newline at end of file
diff --git a/src/con_target.h b/src/con_target.h
new file mode 100644
index 0000000..030c06b
--- /dev/null
+++ b/src/con_target.h
@@ -0,0 +1,78 @@
+//
+// Created by Scheaven on 2020/5/20.
+//
+
+#ifndef INC_01_COORDINATE_TRANSFORMATION_CON_TARGET_H
+#define INC_01_COORDINATE_TRANSFORMATION_CON_TARGET_H
+
+#include <vector>
+#include <map>
+#include <string>
+
+using namespace std;
+
+#include <stdint.h>
+#include <math.h>
+#include <stdint.h>
+#include <iostream>
+#include <vector>
+#include <fstream>
+#include <algorithm>
+#include "stdio.h"
+#include "stdlib.h"
+
+#include "math_util.h"
+
+// 鍒濆鍖栨椂鍖哄煙缁撴瀯
+typedef struct _PInfo
+{
+    SPoint2f* point;
+    int count;
+}RegInfo;
+
+typedef struct _CamVec
+{
+    RegInfo *regInfo;
+    int count;
+}CamVec;
+
+
+// 浼犺緭鐨勪汉浣撶珯绔嬬殑鐐逛綅淇℃伅
+typedef struct _HumanInfo
+{
+    int human_id;
+    SPoint2f point;
+//    float * feature;
+}HumanInfo;
+
+typedef struct _MatchHuman
+{
+    HumanInfo* humanInfo;
+    int count;      //涓�鍏卞灏戜釜浜虹殑鍧愭爣鐐�
+}MatchHuman;
+
+typedef struct _mulCam
+{
+    MatchHuman* matchHuman;
+    int cam_count;
+}MulCam;
+
+
+// 鑾峰彇鏈�缁堢殑缁撴灉淇℃伅
+typedef struct _CamResult
+{
+    map<string,float> confidence_map;
+    string cam_pair;  //鏄摢涓や釜鎽勫儚澶寸浉鍏�
+}CamResult;
+
+
+typedef struct _STarget
+{
+    CamResult *camResult;
+    map<int, int> direction_map; // 鐩镐簰鍏宠仈鐨勬憚鍍忓ご
+}STarget;
+
+//typedef std::vector<Target> FIRST_VEC;
+
+
+#endif //INC_01_COORDINATE_TRANSFORMATION_CON_TARGET_H
diff --git a/src/coord_interface.cpp b/src/coord_interface.cpp
new file mode 100644
index 0000000..41b5bfa
--- /dev/null
+++ b/src/coord_interface.cpp
@@ -0,0 +1,135 @@
+//
+// Created by Scheaven on 2020/5/20.
+//
+
+#include "coord_interface.h"
+#include "switcher_util.h"
+#include "json_util.h"
+
+CoordSwitcher switcher;
+CoordManager::CoordManager(const char *json_document)
+{
+
+}
+
+CoordManager::CoordManager(CamVec *CV_Reg)
+{
+    this->CV_Reg = CV_Reg;
+    switcher.initHomography(CV_Reg);
+//    this->init_flag = false;
+//    CoordSwitcher switcher(CV_Reg);
+
+}
+
+CoordManager::~CoordManager() {}
+
+float confidence =0.0;
+
+
+char* CoordManager::get_result(MulCam* curr_Human, MulCam* last_Human)
+{
+    // 鍒涘缓鑾峰彇缁撴灉鐨勭粨鏋勪綋
+    STarget* target = new STarget();
+//    stemtarget->temcamResult = (TemCamResult*)malloc(sizeof(TemCamResult)*(mulCam->cam_count-1));
+    target->camResult = new CamResult[curr_Human->cam_count-1];
+    group_compare(curr_Human, last_Human , target);// 鎵归噺鍖归厤鍖哄煙涓殑浜�
+
+
+//    //    //閬嶅巻缁撴灉
+//    for (int i = 0; i < curr_Human->cam_count-1; ++i) {
+//        map<string,float>::iterator iter;
+//        for (iter=target->camResult[i].confidence_map.begin() ;iter!=target->camResult[i].confidence_map.end();iter++) {
+//            std::cout<< iter->first << "  confidence   " << iter->second << std::endl;
+//        }
+//    }
+//
+//    std::cout<< " ----------   " <<  std::endl;
+//    map<int,int>::iterator direction_iter;
+//    for (direction_iter=target->direction_map.begin();direction_iter!=target->direction_map.end();direction_iter++) {
+//        std::cout<< direction_iter->first << "  direction   " << direction_iter->second << std::endl;
+//    }
+
+
+    string result_json = "{\"confidence\":\n\t{";
+    for (int i = 0; i < curr_Human->cam_count-1; ++i) {
+        string c_json = map_json(target->camResult[i].confidence_map);
+        result_json += "\t\"" + target->camResult[i].cam_pair + "\":[" + c_json.substr(0,c_json.length()-1) + "],\n";
+    }
+    result_json = result_json.substr(0,result_json.length()-2)+"\n\t},\n";
+    result_json += "\"direction\":[";
+    string d_json = map_json(target->direction_map);
+    result_json += d_json.substr(0,d_json.length()-1) + "]\n}\n";
+
+
+//    string json = to_json_string(target);
+    char *result = (char*)result_json.c_str();
+//    cout << result << endl;
+    return result;
+
+
+
+}
+
+
+void CoordManager::group_compare(MulCam* curr_Human, MulCam* last_Human, STarget* target)
+{
+
+    map<int,float> global_min_points_map; 
+
+    for (int k = 1; k < curr_Human->cam_count; ++k) {
+        for (int i = 0; i < curr_Human->matchHuman[0].count; ++i) {
+            int curr_direction = -1;
+            float local_min_distance = 100000.0;
+
+            target->camResult[k-1].cam_pair = to_string(1)+":"+to_string(k+1);
+
+            for (int j = 0; j < curr_Human->matchHuman[k].count; ++j) {
+                confidence = switcher.compare(curr_Human->matchHuman[0].humanInfo[i].point, curr_Human->matchHuman[k].humanInfo[j].point, k - 1);
+                if(local_min_distance>confidence){
+                    local_min_distance = confidence;
+                }
+                target->camResult[k-1].confidence_map.insert(pair<string,float >(to_string(curr_Human->matchHuman[0].humanInfo[i].human_id)+ ":" +to_string( curr_Human->matchHuman[k].humanInfo[j].human_id), confidence));
+            }
+
+            if(global_min_points_map.count(curr_Human->matchHuman[0].humanInfo[i].human_id)>0)
+            {
+                if (global_min_points_map[curr_Human->matchHuman[0].humanInfo[i].human_id]>local_min_distance)
+                {
+                    global_min_points_map[curr_Human->matchHuman[0].humanInfo[i].human_id] = local_min_distance; //鏇存柊鏂瑰悜
+                    curr_direction = k+1;
+                }
+            }else
+            {
+                curr_direction = k+1;
+                global_min_points_map.insert(pair<int, float>(curr_Human->matchHuman[0].humanInfo[i].human_id, local_min_distance)); // 棣栨娣诲姞鏂瑰悜
+            }
+
+
+            if(target->direction_map.count(curr_Human->matchHuman[0].humanInfo[i].human_id)>0)
+            {
+                if (curr_direction!=-1)
+                    target->direction_map[curr_Human->matchHuman[0].humanInfo[i].human_id] =curr_direction; //鏇存柊鏂瑰悜
+            }else
+            {
+                target->direction_map.insert(pair<int, int>(curr_Human->matchHuman[0].humanInfo[i].human_id,  curr_direction)); // 棣栨娣诲姞鏂瑰悜
+            }
+
+        }
+    }
+
+
+//    map<string,float> confidence_map;
+//    for (int i = 0; i < A_Human->count; ++i) {
+//        for (int j = 0; j < B_Human->count; ++j) {
+//            confidence = switcher.compare(A_Human->humanInfo[i].point, B_Human->humanInfo[j].point);
+//            confidence_map.insert(pair<string,float >(to_string(A_Human->humanInfo[i].human_id)+ ":" +to_string(B_Human->humanInfo[j].human_id), confidence));
+//        }
+//    }
+//    return confidence_map;
+}
+
+void CoordManager::init_Target(STarget *target)
+{
+    target->direction_map[0] = 10000;
+    target->camResult = nullptr;
+}
\ No newline at end of file
diff --git a/src/coord_interface.h b/src/coord_interface.h
new file mode 100644
index 0000000..cb66e51
--- /dev/null
+++ b/src/coord_interface.h
@@ -0,0 +1,26 @@
+//
+// Created by Scheaven on 2020/5/20.
+//
+
+#ifndef INC_01_COORDINATE_TRANSFORMATION_COORD_INTERFACE_H
+#define INC_01_COORDINATE_TRANSFORMATION_COORD_INTERFACE_H
+
+#include "con_target.h"
+
+class CoordManager
+{
+private:
+    CamVec *CV_Reg;
+    bool init_flag;
+
+public:
+    CoordManager(const char* json_document);
+    CoordManager(CamVec *CV_Reg);
+    ~CoordManager();
+    void init_Target(STarget *target);
+    void group_compare(MulCam* curr_Human, MulCam* last_Human, STarget* target);
+    char * get_result(MulCam* curr_Human, MulCam* last_Human);
+};
+
+
+#endif //INC_01_COORDINATE_TRANSFORMATION_COORD_INTERFACE_H
diff --git a/src/homography_util.cpp b/src/homography_util.cpp
new file mode 100644
index 0000000..96ea6f5
--- /dev/null
+++ b/src/homography_util.cpp
@@ -0,0 +1,92 @@
+//
+// Created by Scheaven on 2020/5/22.
+//
+
+#include "homography_util.h"
+
+static void gaussian_elimination(float *input, int n)
+{
+    float * A = input;
+    int i = 0;
+    int j = 0;
+    //m = 8 rows, n = 9 cols
+    int m = n-1;
+    while (i < m && j < n)
+    {
+        int maxi = i;
+        for(int k = i+1; k < m; k++)
+        {
+            if(fabs(A[k * n + j]) > fabs(A[maxi * n + j]))
+            {
+                maxi = k;
+            }
+        }
+        if (A[maxi * n + j] != 0)
+        {
+            if(i != maxi)
+                for(int k = 0; k < n; k++)
+                {
+                    float aux = A[i * n + k];
+                    A[i * n + k] = A[maxi * n + k];
+                    A[maxi * n + k] = aux;
+                }
+            float A_ij = A[i * n + j];
+            for(int k = 0; k < n; k++)
+            {
+                A[i * n + k] /= A_ij;
+            }
+            for(int u = i+1; u< m; u++)
+            {
+                float A_uj = A[u * n + j];
+                for(int k = 0; k <n; k++)
+                {
+                    A[u * n + k] -= A_uj * A[i * n + k];
+                }
+            }
+            i++;
+        }
+        j++;
+    }
+
+    for(int i = m-2; i >= 0; i--)
+    {
+        for(int j = i+1; j < n-1; j++)
+        {
+            A[i * n + m] -= A[i * n + j] * A[j * n + m];
+        }
+    }
+
+}
+
+// 鍒涘缓鍗曞簲鎬х煩闃�
+void creatHomography(vector<SPoint2f> src, vector<SPoint2f> dst,SHomogtaphy *SH_pointer,int j_index)
+{
+       float P[8][9]=
+            {
+                    {-src[0].x, -src[0].y, -1,   0,   0,  0, src[0].x * dst[0].x, src[0].y * dst[0].x, -dst[0].x }, // h11
+                    {  0,   0,  0, -src[0].x, -src[0].y, -1, src[0].x * dst[0].y, src[0].y * dst[0].y, -dst[0].y }, // h12
+
+                    {-src[1].x, -src[1].y, -1,   0,   0,  0, src[1].x * dst[1].x, src[1].y * dst[1].x, -dst[1].x }, // h13
+                    {  0,   0,  0, -src[1].x, -src[1].y, -1, src[1].x * dst[1].y, src[1].y * dst[1].y, -dst[1].y }, // h21
+
+                    {-src[2].x, -src[2].y, -1,   0,   0,  0, src[2].x * dst[2].x, src[2].y * dst[2].x, -dst[2].x }, // h22
+                    {  0,   0,  0, -src[2].x, -src[2].y, -1, src[2].x * dst[2].y, src[2].y * dst[2].y, -dst[2].y }, // h23
+
+                    {-src[3].x, -src[3].y, -1,   0,   0,  0, src[3].x * dst[3].x, src[3].y * dst[3].x, -dst[3].x }, // h31
+                    {  0,   0,  0, -src[3].x, -src[3].y, -1, src[3].x * dst[3].y, src[3].y * dst[3].y, -dst[3].y }, // h32
+            };
+
+    gaussian_elimination(&P[0][0], 9);
+    float aux_H[]={ P[0][8], P[1][8], P[2][8],	// h11  h21 0 h31
+                    P[3][8], P[4][8], P[5][8],	// h12  h22 0 h32
+                    P[6][8], P[7][8], 1};		// h13  h23 0 h33
+
+    for(int i = 0; i < 3; i++)
+    {
+        for(int j = 0; j < 3; j++)
+        {
+//            homography[i * 3 + j] = aux_H[i * 3 + j];
+            SH_pointer->matrix[j_index].homography[i][j] = aux_H[i * 3 + j];
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/homography_util.h b/src/homography_util.h
new file mode 100644
index 0000000..67232fd
--- /dev/null
+++ b/src/homography_util.h
@@ -0,0 +1,28 @@
+//
+// Created by Scheaven on 2020/5/22.
+//
+
+#ifndef INC_02_COORDINATE_TRANSFORMATION_HOMOGRAPHY_UTIL_H
+#define INC_02_COORDINATE_TRANSFORMATION_HOMOGRAPHY_UTIL_H
+
+#include <vector>
+#include "math_util.h"
+
+typedef struct _Matrix
+{
+    float homography[3][3];
+}SMatrix;
+
+typedef struct _Homography
+{
+    SMatrix* matrix;
+    int count;
+}SHomogtaphy;
+
+static void gaussian_elimination(float *input, int n);
+void creatHomography();
+//void creatHomography(vector<SPoint2f> src, vector<SPoint2f> dst,SMatrix* matrix);
+void creatHomography(vector<SPoint2f> src, vector<SPoint2f> dst,SHomogtaphy *SH_pointer ,int j_index);
+
+
+#endif //INC_02_COORDINATE_TRANSFORMATION_HOMOGRAPHY_UTIL_H
diff --git a/src/json_util.cpp b/src/json_util.cpp
new file mode 100644
index 0000000..3460f2e
--- /dev/null
+++ b/src/json_util.cpp
@@ -0,0 +1,25 @@
+//
+// Created by Scheaven on 2020/5/26.
+//
+
+#include "json_util.h"
+
+string map_json(map<string,float> s_map)
+{
+    string json = "";
+    map<string,float>::iterator iter;
+    for (iter= s_map.begin(); iter!= s_map.end();iter++ ) {
+        json += "{\"" + iter->first + "\":" + "" +to_string(iter->second) + "},";
+    }
+    return json;
+}
+
+string map_json(map<int,int> s_map)
+{
+    string json = "";
+    map<int,int>::iterator iter;
+    for (iter= s_map.begin(); iter!= s_map.end();iter++ ) {
+        json += "{\""+ to_string(iter->first) + "\":" + to_string(iter->second) + "},";
+    }
+    return json;
+}
diff --git a/src/json_util.h b/src/json_util.h
new file mode 100644
index 0000000..9f1f764
--- /dev/null
+++ b/src/json_util.h
@@ -0,0 +1,13 @@
+//
+// Created by Scheaven on 2020/5/26.
+//
+
+#ifndef INC_01_COORDINATE_TRANSFORMATION_JSON_UTIL_H
+#define INC_01_COORDINATE_TRANSFORMATION_JSON_UTIL_H
+
+#include "./con_target.h"
+
+string map_json(map<string,float> s_map);
+string map_json(map<int,int> s_map);
+
+#endif //INC_01_COORDINATE_TRANSFORMATION_JSON_UTIL_H
diff --git a/src/math_util.cpp b/src/math_util.cpp
new file mode 100644
index 0000000..02b941a
--- /dev/null
+++ b/src/math_util.cpp
@@ -0,0 +1,37 @@
+//
+// Created by Scheaven on 2020/5/21.
+//
+
+#include "math_util.h"
+
+SPoint2f::_Point(float x, float y)
+{
+    this->x = x;
+    this->y = y;
+}
+
+SPoint2f::_Point()
+{
+
+}
+
+float calDistance(SPoint2f A, SPoint2f B)
+{
+    float x_d , y_d;
+    x_d = A.x - B.x;
+    y_d = A.y - B.y;
+    float lea = sqrt(x_d*x_d + y_d*y_d);
+    return lea;
+}
+
+
+//int main()
+//{
+//    SPoint2f A(100.0f, 100.0f);
+//    SPoint2f B(10.0f, 10.0f) ;
+//    float confidence = calDistance(A, B);
+//    std::cout << confidence <<"-=-=-=-" << std::endl;
+//    SPoint2f *regA_point = (SPoint2f*)malloc(sizeof(SPoint2f)*4);
+//    std::cout << confidence <<"-=-=-=-" << std::endl;
+//
+//}
\ No newline at end of file
diff --git a/src/math_util.h b/src/math_util.h
new file mode 100644
index 0000000..229b1f6
--- /dev/null
+++ b/src/math_util.h
@@ -0,0 +1,30 @@
+//
+// Created by Scheaven on 2020/5/21.
+//
+
+#ifndef INC_01_COORDINATE_TRANSFORMATION_MATH_UTIL_H
+#define INC_01_COORDINATE_TRANSFORMATION_MATH_UTIL_H
+#include <math.h>
+#include <stdint.h>
+#include <iostream>
+#include <vector>
+#include <fstream>
+#include <algorithm>
+#include "stdio.h"
+#include "stdlib.h"
+
+using namespace std;
+
+typedef struct _Point
+{
+public:
+    float x;
+    float y;
+public:
+    _Point(float x, float y);
+    _Point();
+}SPoint2f;
+
+float calDistance(SPoint2f A, SPoint2f B);
+
+#endif //INC_01_COORDINATE_TRANSFORMATION_MATH_UTIL_H
diff --git a/src/switcher_util.cpp b/src/switcher_util.cpp
new file mode 100644
index 0000000..3b914e1
--- /dev/null
+++ b/src/switcher_util.cpp
@@ -0,0 +1,92 @@
+//
+// Created by Scheaven on 2020/5/20.
+//
+
+#include "switcher_util.h"
+
+
+CoordSwitcher* CoordSwitcher::instance = NULL;
+SHomogtaphy* CoordSwitcher::SHomogtaphy_pointer = (SHomogtaphy*)malloc(sizeof(SHomogtaphy));
+
+CoordSwitcher* CoordSwitcher::getInstance(CamVec *CV_Reg)
+{
+    if(instance==NULL)
+    {
+        instance = new CoordSwitcher();
+//        std::cout << "....---.loading Coord....." << std::endl;
+    }
+    return instance;
+}
+
+CoordSwitcher::CoordSwitcher()
+{
+
+//    initHomography(CV_Reg);
+}
+
+
+CoordSwitcher::~CoordSwitcher()
+{
+
+}
+
+void CoordSwitcher::initHomography(CamVec *CV_Reg)
+{
+    vector<SPoint2f> reg_points;
+    for (int k = 0; k < CV_Reg->count; ++k) {
+        for (int i = 0; i < CV_Reg->regInfo[k].count; ++i) {
+            reg_points.push_back(CV_Reg->regInfo[k].point[i]);
+        }
+        reg_points_vec.push_back(reg_points);
+        reg_points.clear();
+    }
+
+    float reprojThresh = 4.0;
+
+    SHomogtaphy_pointer->count = CV_Reg->count-1;
+    SHomogtaphy_pointer->matrix = (SMatrix*)malloc(sizeof(SMatrix)*SHomogtaphy_pointer->count);
+
+    for (int j_index = 1; j_index < CV_Reg->count; ++j_index) {
+        creatHomography(reg_points_vec[0], reg_points_vec[j_index], SHomogtaphy_pointer, j_index-1);
+    }
+
+//    for (int l = 0; l < 3; ++l) {
+//        for (int m = 0; m < 3; ++m) {
+//            std::cout <<   SHomogtaphy_pointer->matrix[0].homography[l][m] <<  "---" << std::endl;
+//            this->s_homography[l][m] = SHomogtaphy_pointer->matrix[0].homography[l][m];
+//        }
+//    }
+//
+
+}
+
+float CoordSwitcher::compare(SPoint2f A, SPoint2f B, int h_index)
+{
+    SPoint2f rightPoint = A;
+    SPoint2f leftPoint;
+    leftPoint = getTransPoint(rightPoint, SHomogtaphy_pointer->matrix[h_index]);
+
+    float distance = calDistance(leftPoint, B);
+
+    return distance;
+}
+
+SPoint2f CoordSwitcher::getTransPoint(const SPoint2f rightPoint, SMatrix& matrix)
+{
+    float rightP[3][1], leftP[3][1];
+    rightP[0][0] = rightPoint.x;
+    rightP[1][0] = rightPoint.y;
+    rightP[2][0] = 1.0;
+    for(int i=0;i<3;++i){
+        for(int j=0;j<1;++j){
+            leftP[i][j]=0;
+            for(int k=0;k<3;++k){
+                leftP[i][j]+=matrix.homography[i][k]*rightP[k][j];
+            }
+        }
+    }
+
+    float x = leftP[0][0] / leftP[2][0];
+    float y = leftP[1][0] / leftP[2][0];
+    return SPoint2f(x, y);
+}
diff --git a/src/switcher_util.h b/src/switcher_util.h
new file mode 100644
index 0000000..ab01b22
--- /dev/null
+++ b/src/switcher_util.h
@@ -0,0 +1,48 @@
+//
+// Created by Scheaven on 2020/5/20.
+//
+
+#ifndef INC_01_COORDINATE_TRANSFORMATION_SWITCHER_UTIL_H
+#define INC_01_COORDINATE_TRANSFORMATION_SWITCHER_UTIL_H
+
+#include "opencv2/opencv.hpp"
+#pragma comment(lib, "opencv_core249.lib")
+
+#include <iostream>
+#include <vector>
+#include <fstream>
+#include <algorithm>
+#include <math.h>
+#include "stdio.h"
+#include "stdlib.h"
+#include "con_target.h"
+#include "homography_util.h"
+
+using namespace std;
+
+class CoordSwitcher
+{
+private:
+    vector<uchar> inliers;
+    vector<vector<SPoint2f>> reg_points_vec;
+    float s_homography[3][3];
+//    vector<float[3][3]> homography_vec;
+    static SHomogtaphy* SHomogtaphy_pointer;
+    static CoordSwitcher* instance;
+public:
+    void initHomography(CamVec *CV_Reg); 
+    static CoordSwitcher* getInstance(CamVec *CV_Reg);
+    CoordSwitcher(); 
+    CoordSwitcher(CamVec *CV_Reg); 
+    ~CoordSwitcher();
+
+    // 杞崲鍧愭爣
+    SPoint2f getTransPoint(const SPoint2f rightPoint, SMatrix& matrix);
+
+    float compare(SPoint2f A, SPoint2f B, int h_index);
+    float compare(float Ax, float Ay, float Bx, float By);
+};
+
+
+
+#endif //INC_01_COORDINATE_TRANSFORMATION_SWITCHER_UTIL_H

--
Gitblit v1.8.0