-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path021-Anexo02-BaseCon.cpp
142 lines (123 loc) · 4.04 KB
/
021-Anexo02-BaseCon.cpp
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
#include "BaseCon.hpp"
BaseCon::BaseCon(bool w, TrackbarCallback tc, bool robotEnable){
if(!robotEnable){
camara = new Camara(false);
}else{
camara = new Camara(true);
}
robot = new Robot(!robotEnable);
initCW(robot, ENC1_1, ENC1_2, ENC2_1, ENC2_2);
window = w;
if(window)
createWindow(tc);
}
/**
* Recibe blobs y los procesa en el motor de inferencia
*/
void BaseCon::kb_inference (){
bool avanzarR = true;
bool girarD = false;
bool girarI = false;
bool cont;
bool inclinado = false;
double distancia;
double distancia_v;
float *angle;
Mat frame;
if(camara->cap.isOpened() || !frame.empty()){
camara->cap >> frame;
}else{
cout << "No se puede obtener frame" << endl;
return;
}
CBlobResult blobs = camara->findBlobs(frame);
for(int i=0;i<blobs.GetNumBlobs();i++){
cont = false;
CBlob blob = blobs.GetBlob(i);
Rect bbox = blob.GetBoundingBox();
//si esta dentro de un rango de area (no muy grande o muy pequeno),
//entonces continua
if( blob.Area(PIXELWISE) < camara->min_blob_area ||
blob.Area(PIXELWISE) > camara->max_blob_area){
continue;
}
//para hallar si el objeto esta al fondo
int fondo = bbox.y + bbox.height;
if(window){
//if (!cont)
camara->addBlobToImg(frame, blob);
imshow("blobs", frame);
}
distancia = utils::calcular_distancia(camara->grados,
SCREEN_SIZE_Y - bbox.br().y);
cout << "distancia " << distancia << " ";
if(bbox.x < (camara->width / 2)){
//blob al lado izquierdo de la pantalla
//distancia medida desde el borde izquierdo de la pantalla hasta el
//borde derecho del blob
distancia_v = utils::calcular_distancia_horizontal(distancia,
bbox.x + bbox.width);
cout << "Caso 1: " << bbox.x + bbox.width << " ";
if(distancia < 20){
girarD = true;
}
}else{
//blob al lado derecho de la pantalla
//distancia medida desde el borde izquierdo de la pantalla hasta el
//borde izquierdo del blob
distancia_v = utils::calcular_distancia_horizontal(distancia, bbox.x);
cout << "Caso 2: " << bbox.x << " ";
if(distancia < 20){
girarI = true;
}
}
cout << "distancia_v: " <<distancia_v << " ";
if(window){
camara->addDistanciaBlob(distancia, blob, frame);
camara->addAreaBlob(blob.Area(PIXELWISE), blob, frame);
}
}
if(robot->getAngles(angle)){
float inclinacion = angle[1] * 180/M_PI;
if(inclinacion < -20){
inclinado = true;
}
}
if(inclinado){
robot->retroceder(1000);
robot->girarI(500);
robot->avanzar();
}else{
if(girarI && !girarD){
robot->girar(20);
}else if (girarD && !girarI){
robot->girar(-20);
}else if(!girarI && !girarD){
robot->avanzar();
}else if(girarD && girarI){
//numero aleatorio
std::srand(std::time(0));
int random_variable = std::rand();
//preguntar si es par o impar y girar a un sentido segun el
//resultado
if((random_variable % 2) == 0){
robot->girar(50);
}else{
robot->girar(-50);
}
}
}
}
void BaseCon::on_slider(int, void *) { }
void BaseCon::on_grados(int, void *) {
camara->mover(camara->grados);
}
/**
* Ventana para hacer pruebas
*/
void BaseCon::createWindow(TrackbarCallback tc){
namedWindow("blobs");
createTrackbar("min blobs area", "blobs", &camara->min_blob_area, 2000, tc);
createTrackbar("max blobs area", "blobs", &camara->max_blob_area, 2000, tc);
createTrackbar("grados camara", "blobs", &camara->grados, 180, tc);
}