forked from OAID/CVGesture
-
Notifications
You must be signed in to change notification settings - Fork 0
/
gesture.hpp
147 lines (132 loc) · 2.96 KB
/
gesture.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cstdlib>
#include <list>
#include <string>
#include <fstream>
#include <thread>
#include <memory.h>
#include <log.h>
#include <json/json.h>
#include <perf.h>
#include <algorithm>
using namespace std;
#define G_Q_SIZE 100
#define CONFIG_FILENAME "config.json"
enum G_TYPE
{
G_PALM,
G_FIST,
};
enum STATE_G
{
S_NONE,
S_PALM,
S_CLICK,
};
enum STATE_CORD
{
G_NONE,
G_FIRST_CORD,
G_SELECT_CONFIRMING,
};
struct gesture_rec
{
G_TYPE type;
double time;
cv::Rect rect;
cv::Point center;
bool is_click;
};
struct gesture_event
{
cv::Point point_lt;
cv::Point point_rb;
cv::Rect rect_select;
};
struct sys_config
{
int palm_detect_neighbor_num;
int palm_detect_size;
int fist_detect_neighbor_num;
int fist_detect_size;
int iter_time;
double click_judge_time;
double confirm_time;
int anti_shake_cnt;
string palm_path;
string fist_path;
};
class gesture
{
public:
list<gesture_rec> l_gesture;
gesture_event e_gesture;
int64 m_tick_s;
STATE_G m_state_g;
double m_CLICK_JUDGE;
STATE_CORD m_state_cord;
bool is_click;
double m_time_confirming;
double m_TIME_CONFIRMING_JUDGE;
unsigned int m_ANTI_SHAKING_CNT;
std::vector<cv::Rect> palm;
std::vector<cv::Rect> fist;
std::vector<cv::Rect> fist_tmp;
cv::CascadeClassifier Fist, Palm;
cv::Mat cam_img;
cv::Mat imageRGB[3];
double time_past=0;
int frame_cnt = 0;
int T=5;
double avg_fps=0;
int64 s;
double time_detect=0;
int pdetect_num, fdetect_num;
int pdetect_rec, fdetect_rec;
list<double> palm_tlist;
list<double> fist_tlist;
sys_config config;
string palm_path;
string fist_path;
double x1j,y1j,x2j,y2j,x1i,y1i,x2i,y2i,xx1,yy1,xx2,yy2;
double areai,areaj,h,w,intersection,iou;
perf t;
gesture()
{
//Fist.load(fist_path);
//Palm.load(palm_path);
m_tick_s = cv::getTickCount();
m_state_g = S_NONE;
//m_CLICK_JUDGE = 0.5;
m_state_cord = G_NONE;
//m_TIME_CONFIRMING_JUDGE = 0.2;
//m_ANTI_SHAKING_CNT = 4;
}
~gesture(){}
void add(G_TYPE type, cv::Rect* rect);
STATE_G update_state_g();
void update_state_cord();
double get_cur_time();
STATE_G anti_shaking_state();
bool anti_shaking_state(G_TYPE s);
cv::Point find_gesture(G_TYPE dst_type);
bool parse_config(char * path, sys_config & config);
void read_config();
void detect(cv::Mat& img);
bool is_select_confirmed();
bool is_select_start();
void clear_select();
bool is_fist();
bool is_palm();
cv::Rect get_fist();
cv::Rect get_palm();
cv::Point* get_palm_center();
cv::Point* get_select_lt();
cv::Point* get_select_rb();
double get_avg_fps();
};