From 025429cbd5dd3dc6f130b8de07664665b0c4b55a Mon Sep 17 00:00:00 2001
From: xuepengqiang <506321815@qq.com>
Date: 星期四, 26 十二月 2019 14:47:47 +0800
Subject: [PATCH] first push

---
 linear.h           |   34 +++
 math_utils.h       |   16 +
 human_velocity.h   |   26 ++
 vector_utils.h     |   13 +
 camera_config.h    |   24 ++
 human_runing.h     |   26 ++
 human_runing.cpp   |   64 +++++
 human_velocity.cpp |   59 +++++
 vector_utils.cpp   |   85 +++++++
 README.md          |    3 
 camera_config.cpp  |   50 ++++
 linear.cpp         |  123 +++++++++++
 03_runing.cpp      |   42 +++
 math_utils.cpp     |   44 ++++
 14 files changed, 609 insertions(+), 0 deletions(-)

diff --git a/03_runing.cpp b/03_runing.cpp
new file mode 100644
index 0000000..65a59e9
--- /dev/null
+++ b/03_runing.cpp
@@ -0,0 +1,42 @@
+锘�// 03_runing.cpp : 姝ゆ枃浠跺寘鍚� "main" 鍑芥暟銆傜▼搴忔墽琛屽皢鍦ㄦ澶勫紑濮嬪苟缁撴潫銆�
+//
+#include <iostream>
+#include "human_runing.h"
+using namespace std;
+
+int main()
+{
+    int rps = 10;
+	int human_id = 1;
+    //box鐨勪袱涓偣鍧愭爣
+	int x1 = 100;
+	int y1 = 100;
+	int x2 = 150;
+	int y2 = 300;
+    //鎽勫儚鏈烘爣璇� 
+	char cam_id = 'A';
+    // 姣忎竴涓浉鏈洪兘闇�瑕佸父瑙佽缁欐娴嬬被锛屽苟涓旀湁瀵瑰簲鐨勭浉鏈哄弬鏁版枃浠�
+	Human_Run CamA_HR(cam_id); //鍒濆鍖栨憚鍍忓ご淇℃伅
+	cout << "Asd" << endl;
+	double human_velocity;
+    for (int i = 0; i < 40; ++i)
+    {
+        human_velocity = CamA_HR.get_human_velocity(rps, human_id, x1, y1, x2, y2);
+        cout << "\nhuman_velocity::" <<human_velocity << endl;
+        if(i<20)
+        {
+            x1++;
+            x2++;
+        }else{
+            x1--;
+            x2++;
+        }
+    }
+//	Human_Run human(human_id,  x1, y1, x2, y2);
+
+
+//    std::cout << human_A;
+//    cout<<"Area="<<c.Area()<<endl;
+    return 1;
+}
+
diff --git a/README.md b/README.md
index 764ee2a..67f34dc 100644
--- a/README.md
+++ b/README.md
@@ -2,3 +2,6 @@
 
 濂旇窇绠楁硶
 
+mian鏂规硶鍦�03_runing.cpp涓�
+
+鍒濆鍖栭渶瑕佺浉鏈轰俊鎭殑閰嶇疆鏂囦欢
\ No newline at end of file
diff --git a/camera_config.cpp b/camera_config.cpp
new file mode 100644
index 0000000..398d607
--- /dev/null
+++ b/camera_config.cpp
@@ -0,0 +1,50 @@
+#include "camera_config.h"
+
+
+
+CameraInfo::CameraInfo()
+{
+    this->bottom_distance = 295;
+    int p1x = 587, p1y = 396;
+    int p2x = 309, p2y = 402;
+    int p3x = 378, p3y = 190;
+    int p4x = 522, p4y = 181;
+
+
+    vector<int> vec1;
+    vector<int> vec2;
+    vector<int> vec3;
+    vector<int> vec4;
+	vec1.push_back(p1x);
+	vec1.push_back(p1y);
+    vec2.push_back(p2x);
+    vec2.push_back(p2y);
+    vec3.push_back(p3x);
+    vec3.push_back(p3y);
+    vec4.push_back(p4x);
+    vec4.push_back(p4y);
+
+    this->vec_ray.push_back(vec1);
+    this->vec_ray.push_back(vec2);
+    this->vec_ray.push_back(vec3);
+    this->vec_ray.push_back(vec4);
+
+}
+
+vector<vector<int>> CameraInfo::get_vec_ray()
+{
+    return this->vec_ray;
+}
+
+int get_BASE_DISTANCE()
+{
+    return BASE_LENGTH;
+}
+int get_BASE_LENGTH()
+{
+    return BASE_DISTANCE;
+}
+int get_ANGLE()
+{
+    return ANGLE;
+}
diff --git a/camera_config.h b/camera_config.h
new file mode 100644
index 0000000..587afba
--- /dev/null
+++ b/camera_config.h
@@ -0,0 +1,24 @@
+#ifndef CAMERA_CONFIG_H
+#define CAMERA_CONFIG_H
+#include<iostream>
+#include <vector>
+const int BASE_DISTANCE = 610; 
+const int BASE_LENGTH = 300; 
+const int ANGLE = 10; 
+
+using namespace std;
+class CameraInfo
+{
+public:
+	int bottom_distance;
+	vector<vector<int>> vec_ray;
+
+public:
+	CameraInfo();
+	vector<vector<int>> get_vec_ray();
+	int get_BASE_DISTANCE();
+	int get_BASE_LENGTH();
+	int get_ANGLE();
+
+};
+#endif
\ No newline at end of file
diff --git a/human_runing.cpp b/human_runing.cpp
new file mode 100644
index 0000000..90cd758
--- /dev/null
+++ b/human_runing.cpp
@@ -0,0 +1,64 @@
+#include "human_runing.h"
+#include "linear.h"
+#include <iostream>
+#include "vector_utils.h"
+#include "human_velocity.h"
+
+
+Human_Run::Human_Run(char cam_id)
+{
+	this->cam_id = cam_id;
+//	cout << this->cam_id << endl;
+
+    CameraInfo cf;
+    this->cam_vec_ray = cf.get_vec_ray();
+    this->base_distance = BASE_DISTANCE;
+    this->base_length = BASE_LENGTH;
+    this->angle = ANGLE;
+    this->bottom_distance = cf.bottom_distance;
+
+
+    //    for(int i=0;i< this->cam_vec_ray.size();i++)
+    //    {
+    //        std::cout << cam_vec_ray[i].size() << endl;
+    //        for (int j = 0; j < this->cam_vec_ray[i].size() ; j++) {
+    //            cout << this->cam_vec_ray[i][j]<<endl;
+    //        }
+    //    }
+
+}
+
+
+double Human_Run::get_human_velocity(int rps, int human_id, int x1, int y1, int x2, int y2)
+{
+    int center_pointx = (int)(x1+x2)/2;
+	int center_pointy = (int)(y2-(y2-y1)/10);
+	cout << "runing" << endl;
+
+	Linear linear(this->cam_vec_ray, center_pointx, center_pointy);
+    double center_distance = linear.cal_distance();
+
+//    cout << typeid(center_distance).name() << endl;
+//    cout << center_distance << endl;
+
+    double deep_distance = linear.adjust_distance(this->base_distance,this->bottom_distance, center_distance,this->angle);
+    printf("deep_distance::%f",deep_distance);
+
+
+    VectorUtils VU;
+    if(VU.is_element_in_vector(this->human_vec,human_id))
+    {
+        
+        double frame_presrate = center_distance/this->bottom_distance;
+        this->human_velocity_map[human_id].add_next_point(center_pointx, center_pointy, deep_distance, frame_presrate);
+    } else{
+        this->human_vec.push_back(human_id);
+        HumanVelocity HV(this->bottom_distance, this->base_distance);
+        this->human_velocity_map[human_id] = HV;
+    }
+//    printf("%d",this->human_velocity_map[human_id]);
+    double human_velocity = this->human_velocity_map[human_id].cal_human_velocity(rps);
+	return human_velocity;
+
+}
+
diff --git a/human_runing.h b/human_runing.h
new file mode 100644
index 0000000..9d657de
--- /dev/null
+++ b/human_runing.h
@@ -0,0 +1,26 @@
+#ifndef HUMAN_RUNING_H
+#define HUMAN_RUNING_H
+#include <iostream>
+#include "camera_config.h"
+#include "human_velocity.h"
+#include <map>
+using namespace std;
+class Human_Run{
+	public:
+		char cam_id; //鐩告満缂栧彿
+        vector<vector<int>> cam_vec_ray; //鍖哄煙淇℃伅
+		int base_distance; //鐩告満鍩虹嚎璺濈
+		int base_length; //鐩告満鍩虹嚎闀垮害
+		int angle; //鐩告満瑙掑害
+		int frame_presrate;
+		int bottom_distance;
+
+		vector<int> human_vec;
+        map<int, HumanVelocity> human_velocity_map;
+
+	public:
+        Human_Run(char cam_id);
+        double get_human_velocity(int rps,int human_id, int x1, int y1, int x2, int y2);
+
+};
+#endif
\ No newline at end of file
diff --git a/human_velocity.cpp b/human_velocity.cpp
new file mode 100644
index 0000000..ef08944
--- /dev/null
+++ b/human_velocity.cpp
@@ -0,0 +1,59 @@
+#include "human_velocity.h"
+#include <iomanip>
+#include "math_utils.h"
+HumanVelocity::HumanVelocity()
+{
+    printf("34343333333333");
+}
+HumanVelocity::HumanVelocity(int bottom_distance, int base_distance)
+{
+    this->MAX_SIZE = 10;
+    for (int i = 0; i <this->MAX_SIZE ; ++i) {
+        this->coords_structure.push_back({0,0,0});
+        this->move_dist.push_back(0);
+    }
+    this->RPS = 25;
+    this->total_distance = 0.0;
+    this->store_pointer = 0;
+    this->init_size = 0;
+    this->real_world_rate = base_distance/bottom_distance;
+    MathUtils mu;
+    this->math_utils = mu;
+
+}
+
+void HumanVelocity::add_next_point(int point_x, int point_y, double point_z, double pers_rate)
+{
+    printf("add_next_point");
+	this->coords_structure[this->store_pointer][0] = point_x;
+	this->coords_structure[this->store_pointer][1] = point_y;
+	this->coords_structure[this->store_pointer][2] = point_z; 
+	this->store_pointer = (this->store_pointer + 1)%this->MAX_SIZE;
+    this->init_size ++;
+    if(this->init_size>1)
+    {
+//        printf("coords::::", this->coords_structure[(this->store_pointer -2 + this->MAX_SIZE)%this->MAX_SIZE]);
+        double pers_distance = this->math_utils.cal_distance(this->coords_structure[(this->store_pointer -2 + this->MAX_SIZE)%this->MAX_SIZE],
+                this->coords_structure[(this->store_pointer -1 + this->MAX_SIZE)%this->MAX_SIZE]);
+        pers_distance = (pers_distance / pers_rate)*this->real_world_rate*0.1;
+
+        double move_dist = sqrt(pow(pers_distance,2) + pow(
+                                                           this->coords_structure[(this->store_pointer - 2 + this->MAX_SIZE) % this->MAX_SIZE][2] -
+                                                           this->coords_structure[(this->store_pointer - 1 + this->MAX_SIZE) % this->MAX_SIZE][2],2));
+        move_dist *= (this->coords_structure[this->store_pointer][2]/10);  
+
+        this->total_distance += move_dist;
+        this->move_dist[this->store_pointer-1] = move_dist;
+    }
+
+    this->total_distance -= this->move_dist[this->store_pointer];
+}
+
+
+double HumanVelocity::cal_human_velocity(int rps)
+{
+    this->RPS = rps;
+    double h_velocity = this->total_distance*this->RPS/(this->MAX_SIZE - 2);
+
+    return h_velocity/100;
+}
\ No newline at end of file
diff --git a/human_velocity.h b/human_velocity.h
new file mode 100644
index 0000000..79a7100
--- /dev/null
+++ b/human_velocity.h
@@ -0,0 +1,26 @@
+#ifndef HUMAN_VELOCITY_H
+#define HUMAN_VELOCITY_H
+#include <vector>
+#include "math_utils.h"
+using namespace std;
+class HumanVelocity
+{
+public:
+    int MAX_SIZE;
+    vector<vector<int>> coords_structure;
+    vector<float> move_dist;
+    int RPS;
+    double total_distance;
+    int store_pointer;
+    int init_size;
+    double real_world_rate;
+    MathUtils math_utils;
+
+public:
+    HumanVelocity();
+    HumanVelocity(int bottom_distance, int base_distance);
+    void add_next_point(int point_x, int point_y, double point_z, double frame_presrate);
+    double cal_human_velocity(int rps);
+};
+
+#endif
\ No newline at end of file
diff --git a/linear.cpp b/linear.cpp
new file mode 100644
index 0000000..9a4233a
--- /dev/null
+++ b/linear.cpp
@@ -0,0 +1,123 @@
+#include <math.h>
+#include "linear.h"
+
+Linear::Linear(vector<vector<int>> cam_vec_ray, int center_x,int center_y)
+{
+    this->points_list = cam_vec_ray;
+    this->center_x = center_x;
+    this->center_y = center_y;
+
+    Linear::bottom_line();
+    Linear::third_line();
+
+}
+
+// 鐩寸嚎娉曡〃绀哄簳杈圭洿绾�
+void Linear::bottom_line() {
+    int x1 = this->points_list[0][0];
+    int y1 = this->points_list[0][1];
+
+    int x2 = this->points_list[1][0];
+    int y2 = this->points_list[1][1];
+
+    if(x1 == x2) {
+        this->flag = 1; 
+    }else if(y2 == y1) {
+        this->flag = 2; 
+    } else{
+        this->flag = 0;
+        this->k = (float)(y2-y1)/(x2-x1);
+    }
+//    printf("%d,%d\n",x1,y1);
+//    printf("%d,%d\n",x2,y2);
+//    cout << this->flag << endl;
+//    cout << "sssss" << endl;
+//    cout <<  this->k <<endl;
+}
+
+void Linear::third_line()
+{
+    if(this->flag == 0)
+    {
+        this->b = this->center_y - this->k * this->center_x;
+    }
+//    printf("%f,%f",this->b,this->k);
+}
+
+
+vector<float> Linear::inter_points(vector<int> point_m, vector<int> point_n)
+{
+    int xm = point_m[0];
+    int ym = point_m[1];
+    int xn = point_n[0];
+    int yn = point_n[1];
+    vector<float> inter_point_vec;
+    float inter_x, inter_y;
+    if(xm == xn) {
+        inter_x = (float) xm;
+        if (this->flag == 2)
+            inter_y = (float) this->center_y;
+        else
+            inter_y = (float) (this->k * inter_x + this->b);
+    }else if(ym == yn){
+        inter_y = (float)ym;
+        if(this->flag == 1)
+            inter_x = (float) this->center_x;
+        else
+            inter_x = (inter_y - this->b)/this->k;
+    }else
+    {
+        float k1 = (float)(ym - yn)/(xm - xn);
+        float b1 = ym - k1*xm;
+        if(this->flag == 1)
+        {
+            inter_x = (float) this->center_x;
+            inter_y = k1*inter_x + b1;
+        } else if (this->flag == 2)
+        {
+            inter_y = (float) this->center_y;
+            inter_x = (inter_y - b1)/k1;
+        } else
+        {
+            inter_x = (this->b - b1)/(k1 - this->k);
+            inter_y = k1*inter_x + b1;
+        }
+    }
+
+    inter_point_vec.push_back(inter_x);
+    inter_point_vec.push_back(inter_y);
+
+    return inter_point_vec;
+
+}
+
+
+double Linear::cal_distance()
+{
+    printf("cal distance");
+    vector<float> s_point_vec = Linear::inter_points(this->points_list[0],this->points_list[3]);
+    vector<float> e_point_vec = Linear::inter_points(this->points_list[1],this->points_list[2]);
+    printf("%f,%f,other,%f,%f",s_point_vec[0],s_point_vec[1],e_point_vec[0],e_point_vec[1]);
+
+    float pow_x = pow((s_point_vec[0] - e_point_vec[0]),2);
+    float pow_y = pow((s_point_vec[1] - e_point_vec[1]),2);
+    double distance =  pow((pow_x + pow_y),0.5);
+
+    return distance;
+}
+
+
+double Linear::adjust_distance(int base_distance,int bottom_distance, double center_distance,int angle)
+{
+    MathUtils mm;
+    double rate = cos(mm.angle_to_radian((double)angle));
+    if(rate == 0)
+    {
+        rate = 1e-5;
+    }
+
+	double result_distance = base_distance * bottom_distance / (center_distance * rate);
+    printf("\n%f::%f\n",rate,result_distance);
+//    printf("\na%d%d%f%daa%fhe%f",ragresult_distance);
+	return result_distance;
+}
\ No newline at end of file
diff --git a/linear.h b/linear.h
new file mode 100644
index 0000000..999b2ea
--- /dev/null
+++ b/linear.h
@@ -0,0 +1,34 @@
+#ifndef LINEAR_H
+#define LINEAR_H
+#include <iostream>
+#include "camera_config.h"
+#include "math_utils.h"
+#include <math.h>
+
+
+class Linear
+{
+private:
+    vector<vector<int>> points_list;
+    int center_x;
+    int center_y;
+    float k = 0;
+    float b = 0;
+    int flag = 0;
+
+public:
+    Linear(vector<vector<int>> cam_vec_ray, int center_x,int center_y);
+    double cal_distance();
+    double adjust_distance(int base_distance,int bottom_distance, double center_distance,int angle);
+
+
+private:
+    void bottom_line();
+	void third_line();
+    vector<float> inter_points(vector<int> point_A, vector<int> point_B);
+
+
+};
+
+#endif
+
diff --git a/math_utils.cpp b/math_utils.cpp
new file mode 100644
index 0000000..130b2e3
--- /dev/null
+++ b/math_utils.cpp
@@ -0,0 +1,44 @@
+#include "math_utils.h"
+#include <math.h>
+
+
+double MathUtils::angle_to_radian(double degree)
+{
+    double flag = (degree < 0)? -1.0:1.0; 
+    if(degree<0)
+    {
+       degree = degree * (-1.0);
+    }
+    double angle = degree;
+    double result = flag * (angle* M_PI)/180;
+    return result;
+}
+
+
+void MathUtils::radian_to_angle(double rad, double ang[])
+{
+    double flag = (rad < 0)? -1.0 : 1.0;
+    if(rad<0)
+    {
+        rad = rad * (-1.0);
+    }
+    double result = (rad*180)/ M_PI;
+    double degree = int(result);
+    double min =(result - degree)*60;
+    double second = (min - int(min)) * 60;
+    ang[0] = flag * degree;
+    ang[1] = int(min);
+    ang[2] = second;
+}
+
+double MathUtils::cal_distance(vector<int> coords_A, vector<int> coords_B)
+{
+    int square_sum = 0;
+    for (int i = 0; i < 3; ++i) {
+        square_sum +=  (coords_A[i] - coords_B[i])*(coords_A[i] - coords_B[i]);
+    }
+    return sqrt(square_sum);
+}
+
+
+
diff --git a/math_utils.h b/math_utils.h
new file mode 100644
index 0000000..b8887c5
--- /dev/null
+++ b/math_utils.h
@@ -0,0 +1,16 @@
+#ifndef MATH_UTILS_H
+#define MATH_UTILS_H
+#define _USE_MATH_DEFINES
+#include <vector>
+using namespace std;
+
+class MathUtils
+{
+public:
+    double angle_to_radian(double degree);
+    void radian_to_angle(double rad, double ang[]);
+    double cal_distance(vector<int> coords_A, vector<int> coords_B);
+};
+
+#endif
+
diff --git a/vector_utils.cpp b/vector_utils.cpp
new file mode 100644
index 0000000..42cb73f
--- /dev/null
+++ b/vector_utils.cpp
@@ -0,0 +1,85 @@
+#include "iostream"
+#include <vector>
+#include "algorithm" 
+#include "iterator" 
+#include "vector_utils.h"
+
+using namespace std;
+
+
+void print_vector(vector<int> v){
+    if(v.size()>0){
+        cout<<"{";
+        for(int i=0;i<int(v.size());i++){
+            cout<<v[i]<<",";
+        }
+        cout<<"\b}";
+    }
+    else{
+        cout<<"{}";
+    }
+}
+
+
+vector<int> unique_element_in_vector(vector<int> v){
+    vector<int>::iterator vector_iterator;
+    sort(v.begin(),v.end());
+    vector_iterator = unique(v.begin(),v.end());
+    if(vector_iterator != v.end()){
+        v.erase(vector_iterator,v.end());
+    }
+    return v;
+}
+
+
+vector<int> vectors_intersection(vector<int> v1,vector<int> v2){
+    vector<int> v;
+    sort(v1.begin(),v1.end());
+    sort(v2.begin(),v2.end());
+    set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),back_inserter(v));//姹備氦闆�
+    return v;
+}
+
+
+vector<int> vectors_set_union(vector<int> v1,vector<int> v2){
+    vector<int> v;
+    sort(v1.begin(),v1.end());
+    sort(v2.begin(),v2.end());
+    set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),back_inserter(v));//姹備氦闆�
+    return v;
+}
+
+
+bool VectorUtils::is_element_in_vector(vector<int> v,int element)
+{
+    printf("\nDetermine whether an element of a vector exists");
+    vector<int>::iterator it;
+    it=find(v.begin(),v.end(),element);
+    if (it!=v.end()){
+        return true;
+    }
+    else{
+        return false;
+    }
+}
+
+//int main(){
+//    vector<int> v1,v2,v;
+//    v1.push_back(22);v1.push_back(22);v1.push_back(23);v2.push_back(23);v2.push_back(24);
+//    cout<<"v1?\n" <<is_element_in_vector(v1,1)<< endl;
+//    cout<<"vi锛歕n";
+////    cout<<"v1鏄惁瀛樺湪1杩欎釜鍏冪礌锛�" <<is_element_in_vector(v1,1)<< endl;
+////    cout<<"瀵箆1鍘婚噸锛�";
+//    v1=unique_element_in_vector(v1);
+//    print_vector(v1);
+//    cout<<endl;
+//    cout<<"v1锛歕n";
+////    cout<<"姹倂1涓巚2鐨勪氦闆嗭細";
+//    v=vectors_intersection(v1,v2);
+//    print_vector(v);
+//    cout<<endl;
+//    cout<<"v23锛歕n";
+//    v=vectors_set_union(v1,v2);
+//    print_vector(v);
+//    return 0;
+//}
\ No newline at end of file
diff --git a/vector_utils.h b/vector_utils.h
new file mode 100644
index 0000000..32e70d3
--- /dev/null
+++ b/vector_utils.h
@@ -0,0 +1,13 @@
+#ifndef VECTOR_UTILS_H
+#define VECTOR_UTILS_H
+#include <iostream>
+#include <vector>
+using namespace std;
+class VectorUtils
+{
+public:
+    bool is_element_in_vector(vector<int> v,int element);
+
+};
+
+#endif
\ No newline at end of file

--
Gitblit v1.8.0