root / vision / cvblobs8.3 / BlobOperators.h @ b11b2b30
History | View | Annotate | Download (16.3 KB)
1 |
#ifndef BLOB_OPERATORS_H_INCLUDED
|
---|---|
2 |
#define BLOB_OPERATORS_H_INCLUDED
|
3 |
|
4 |
#include "blob.h" |
5 |
|
6 |
/**************************************************************************
|
7 |
Definici? de les classes per a fer operacions sobre els blobs
|
8 |
|
9 |
Helper classes to perform operations on blobs
|
10 |
**************************************************************************/
|
11 |
|
12 |
//! Factor de conversi? de graus a radians
|
13 |
#define DEGREE2RAD (CV_PI / 180.0) |
14 |
|
15 |
|
16 |
//! Classe d'on derivarem totes les operacions sobre els blobs
|
17 |
//! Interface to derive all blob operations
|
18 |
class COperadorBlob |
19 |
{ |
20 |
public:
|
21 |
virtual ~COperadorBlob(){}; |
22 |
|
23 |
//! Aply operator to blob
|
24 |
virtual double operator()(CBlob &blob) = 0; |
25 |
//! Get operator name
|
26 |
virtual const char *GetNom() = 0; |
27 |
|
28 |
operator COperadorBlob*() |
29 |
{ |
30 |
return (COperadorBlob*)this;
|
31 |
} |
32 |
}; |
33 |
|
34 |
typedef COperadorBlob funcio_calculBlob;
|
35 |
|
36 |
#ifdef BLOB_OBJECT_FACTORY
|
37 |
/**
|
38 |
Funci? per comparar dos identificadors dins de la f?brica de COperadorBlobs
|
39 |
*/
|
40 |
struct functorComparacioIdOperador
|
41 |
{ |
42 |
bool operator()(const char* s1, const char* s2) const |
43 |
{ |
44 |
return strcmp(s1, s2) < 0; |
45 |
} |
46 |
}; |
47 |
|
48 |
//! Definition of Object factory type for COperadorBlob objects
|
49 |
typedef ObjectFactory<COperadorBlob, const char *, functorComparacioIdOperador > t_OperadorBlobFactory; |
50 |
|
51 |
//! Funci? global per a registrar tots els operadors definits a blob.h
|
52 |
void RegistraTotsOperadors( t_OperadorBlobFactory &fabricaOperadorsBlob );
|
53 |
|
54 |
#endif
|
55 |
|
56 |
|
57 |
//! Classe per calcular l'etiqueta d'un blob
|
58 |
//! Class to get ID of a blob
|
59 |
class CBlobGetID : public COperadorBlob |
60 |
{ |
61 |
public:
|
62 |
double operator()(CBlob &blob)
|
63 |
{ |
64 |
return blob.GetID();
|
65 |
} |
66 |
const char *GetNom() |
67 |
{ |
68 |
return "CBlobGetID"; |
69 |
} |
70 |
}; |
71 |
|
72 |
|
73 |
//! Classe per calcular l'?rea d'un blob
|
74 |
//! Class to get the area of a blob
|
75 |
class CBlobGetArea : public COperadorBlob |
76 |
{ |
77 |
public:
|
78 |
double operator()(CBlob &blob)
|
79 |
{ |
80 |
return blob.Area();
|
81 |
} |
82 |
const char *GetNom() |
83 |
{ |
84 |
return "CBlobGetArea"; |
85 |
} |
86 |
}; |
87 |
|
88 |
//! Classe per calcular el perimetre d'un blob
|
89 |
//! Class to get the perimeter of a blob
|
90 |
class CBlobGetPerimeter: public COperadorBlob |
91 |
{ |
92 |
public:
|
93 |
double operator()(CBlob &blob)
|
94 |
{ |
95 |
return blob.Perimeter();
|
96 |
} |
97 |
const char *GetNom() |
98 |
{ |
99 |
return "CBlobGetPerimeter"; |
100 |
} |
101 |
}; |
102 |
|
103 |
//! Classe que diu si un blob ?s extern o no
|
104 |
//! Class to get the extern flag of a blob
|
105 |
class CBlobGetExterior: public COperadorBlob |
106 |
{ |
107 |
public:
|
108 |
CBlobGetExterior() |
109 |
{ |
110 |
m_mask = NULL;
|
111 |
m_xBorder = false;
|
112 |
m_yBorder = false;
|
113 |
} |
114 |
CBlobGetExterior(IplImage *mask, bool xBorder = true, bool yBorder = true) |
115 |
{ |
116 |
m_mask = mask; |
117 |
m_xBorder = xBorder; |
118 |
m_yBorder = yBorder; |
119 |
} |
120 |
double operator()(CBlob &blob)
|
121 |
{ |
122 |
return blob.Exterior(m_mask, m_xBorder, m_yBorder);
|
123 |
} |
124 |
const char *GetNom() |
125 |
{ |
126 |
return "CBlobGetExterior"; |
127 |
} |
128 |
private:
|
129 |
IplImage *m_mask; |
130 |
bool m_xBorder, m_yBorder;
|
131 |
}; |
132 |
|
133 |
//! Classe per calcular la mitjana de nivells de gris d'un blob
|
134 |
//! Class to get the mean grey level of a blob
|
135 |
class CBlobGetMean: public COperadorBlob |
136 |
{ |
137 |
public:
|
138 |
CBlobGetMean() |
139 |
{ |
140 |
m_image = NULL;
|
141 |
} |
142 |
CBlobGetMean( IplImage *image ) |
143 |
{ |
144 |
m_image = image; |
145 |
}; |
146 |
|
147 |
double operator()(CBlob &blob)
|
148 |
{ |
149 |
return blob.Mean(m_image);
|
150 |
} |
151 |
const char *GetNom() |
152 |
{ |
153 |
return "CBlobGetMean"; |
154 |
} |
155 |
private:
|
156 |
|
157 |
IplImage *m_image; |
158 |
}; |
159 |
|
160 |
//! Classe per calcular la desviaci? est?ndard dels nivells de gris d'un blob
|
161 |
//! Class to get the standard deviation of the grey level values of a blob
|
162 |
class CBlobGetStdDev: public COperadorBlob |
163 |
{ |
164 |
public:
|
165 |
CBlobGetStdDev() |
166 |
{ |
167 |
m_image = NULL;
|
168 |
} |
169 |
CBlobGetStdDev( IplImage *image ) |
170 |
{ |
171 |
m_image = image; |
172 |
}; |
173 |
double operator()(CBlob &blob)
|
174 |
{ |
175 |
return blob.StdDev(m_image);
|
176 |
} |
177 |
const char *GetNom() |
178 |
{ |
179 |
return "CBlobGetStdDev"; |
180 |
} |
181 |
private:
|
182 |
|
183 |
IplImage *m_image; |
184 |
|
185 |
}; |
186 |
|
187 |
//! Classe per calcular la compacitat d'un blob
|
188 |
//! Class to calculate the compactness of a blob
|
189 |
class CBlobGetCompactness: public COperadorBlob |
190 |
{ |
191 |
public:
|
192 |
double operator()(CBlob &blob);
|
193 |
const char *GetNom() |
194 |
{ |
195 |
return "CBlobGetCompactness"; |
196 |
} |
197 |
}; |
198 |
|
199 |
//! Classe per calcular la longitud d'un blob
|
200 |
//! Class to calculate the length of a blob
|
201 |
class CBlobGetLength: public COperadorBlob |
202 |
{ |
203 |
public:
|
204 |
double operator()(CBlob &blob);
|
205 |
const char *GetNom() |
206 |
{ |
207 |
return "CBlobGetLength"; |
208 |
} |
209 |
}; |
210 |
|
211 |
//! Classe per calcular l'amplada d'un blob
|
212 |
//! Class to calculate the breadth of a blob
|
213 |
class CBlobGetBreadth: public COperadorBlob |
214 |
{ |
215 |
public:
|
216 |
double operator()(CBlob &blob);
|
217 |
const char *GetNom() |
218 |
{ |
219 |
return "CBlobGetBreadth"; |
220 |
} |
221 |
}; |
222 |
|
223 |
//! Classe per calcular la difer?ncia en X del blob
|
224 |
class CBlobGetDiffX: public COperadorBlob |
225 |
{ |
226 |
public:
|
227 |
double operator()(CBlob &blob)
|
228 |
{ |
229 |
return blob.GetBoundingBox().width;
|
230 |
} |
231 |
const char *GetNom() |
232 |
{ |
233 |
return "CBlobGetDiffX"; |
234 |
} |
235 |
}; |
236 |
|
237 |
//! Classe per calcular la difer?ncia en X del blob
|
238 |
class CBlobGetDiffY: public COperadorBlob |
239 |
{ |
240 |
public:
|
241 |
double operator()(CBlob &blob)
|
242 |
{ |
243 |
return blob.GetBoundingBox().height;
|
244 |
} |
245 |
const char *GetNom() |
246 |
{ |
247 |
return "CBlobGetDiffY"; |
248 |
} |
249 |
}; |
250 |
|
251 |
//! Classe per calcular el moment PQ del blob
|
252 |
//! Class to calculate the P,Q moment of a blob
|
253 |
class CBlobGetMoment: public COperadorBlob |
254 |
{ |
255 |
public:
|
256 |
//! Constructor est?ndard
|
257 |
//! Standard constructor (gets the 00 moment)
|
258 |
CBlobGetMoment() |
259 |
{ |
260 |
m_p = m_q = 0;
|
261 |
} |
262 |
//! Constructor: indiquem el moment p,q a calcular
|
263 |
//! Constructor: gets the PQ moment
|
264 |
CBlobGetMoment( int p, int q ) |
265 |
{ |
266 |
m_p = p; |
267 |
m_q = q; |
268 |
}; |
269 |
double operator()(CBlob &blob);
|
270 |
const char *GetNom() |
271 |
{ |
272 |
return "CBlobGetMoment"; |
273 |
} |
274 |
|
275 |
private:
|
276 |
//! moment que volem calcular
|
277 |
int m_p, m_q;
|
278 |
}; |
279 |
|
280 |
//! Classe per calcular el perimetre del poligon convex d'un blob
|
281 |
//! Class to calculate the convex hull perimeter of a blob
|
282 |
class CBlobGetHullPerimeter: public COperadorBlob |
283 |
{ |
284 |
public:
|
285 |
double operator()(CBlob &blob);
|
286 |
const char *GetNom() |
287 |
{ |
288 |
return "CBlobGetHullPerimeter"; |
289 |
} |
290 |
}; |
291 |
|
292 |
//! Classe per calcular l'?rea del poligon convex d'un blob
|
293 |
//! Class to calculate the convex hull area of a blob
|
294 |
class CBlobGetHullArea: public COperadorBlob |
295 |
{ |
296 |
public:
|
297 |
double operator()(CBlob &blob);
|
298 |
const char *GetNom() |
299 |
{ |
300 |
return "CBlobGetHullArea"; |
301 |
} |
302 |
}; |
303 |
|
304 |
//! Classe per calcular la x minima en la y minima
|
305 |
//! Class to calculate the minimum x on the minimum y
|
306 |
class CBlobGetMinXatMinY: public COperadorBlob |
307 |
{ |
308 |
public:
|
309 |
double operator()(CBlob &blob);
|
310 |
const char *GetNom() |
311 |
{ |
312 |
return "CBlobGetMinXatMinY"; |
313 |
} |
314 |
}; |
315 |
|
316 |
//! Classe per calcular la y minima en la x maxima
|
317 |
//! Class to calculate the minimum y on the maximum x
|
318 |
class CBlobGetMinYatMaxX: public COperadorBlob |
319 |
{ |
320 |
public:
|
321 |
double operator()(CBlob &blob);
|
322 |
const char *GetNom() |
323 |
{ |
324 |
return "CBlobGetMinYatMaxX"; |
325 |
} |
326 |
}; |
327 |
|
328 |
//! Classe per calcular la x maxima en la y maxima
|
329 |
//! Class to calculate the maximum x on the maximum y
|
330 |
class CBlobGetMaxXatMaxY: public COperadorBlob |
331 |
{ |
332 |
public:
|
333 |
double operator()(CBlob &blob);
|
334 |
const char *GetNom() |
335 |
{ |
336 |
return "CBlobGetMaxXatMaxY"; |
337 |
} |
338 |
}; |
339 |
|
340 |
//! Classe per calcular la y maxima en la x minima
|
341 |
//! Class to calculate the maximum y on the minimum y
|
342 |
class CBlobGetMaxYatMinX: public COperadorBlob |
343 |
{ |
344 |
public:
|
345 |
double operator()(CBlob &blob);
|
346 |
const char *GetNom() |
347 |
{ |
348 |
return "CBlobGetMaxYatMinX"; |
349 |
} |
350 |
}; |
351 |
|
352 |
//! Classe per a calcular la x m?nima
|
353 |
//! Class to get the minimum x
|
354 |
class CBlobGetMinX: public COperadorBlob |
355 |
{ |
356 |
public:
|
357 |
double operator()(CBlob &blob)
|
358 |
{ |
359 |
return blob.MinX();
|
360 |
} |
361 |
const char *GetNom() |
362 |
{ |
363 |
return "CBlobGetMinX"; |
364 |
} |
365 |
}; |
366 |
|
367 |
//! Classe per a calcular la x m?xima
|
368 |
//! Class to get the maximum x
|
369 |
class CBlobGetMaxX: public COperadorBlob |
370 |
{ |
371 |
public:
|
372 |
double operator()(CBlob &blob)
|
373 |
{ |
374 |
return blob.MaxX();
|
375 |
} |
376 |
const char *GetNom() |
377 |
{ |
378 |
return "CBlobGetMaxX"; |
379 |
} |
380 |
}; |
381 |
|
382 |
//! Classe per a calcular la y m?nima
|
383 |
//! Class to get the minimum y
|
384 |
class CBlobGetMinY: public COperadorBlob |
385 |
{ |
386 |
public:
|
387 |
double operator()(CBlob &blob)
|
388 |
{ |
389 |
return blob.MinY();
|
390 |
} |
391 |
const char *GetNom() |
392 |
{ |
393 |
return "CBlobGetMinY"; |
394 |
} |
395 |
}; |
396 |
|
397 |
//! Classe per a calcular la y m?xima
|
398 |
//! Class to get the maximum y
|
399 |
class CBlobGetMaxY: public COperadorBlob |
400 |
{ |
401 |
public:
|
402 |
double operator()(CBlob &blob)
|
403 |
{ |
404 |
return blob.MaxY();
|
405 |
} |
406 |
const char *GetNom() |
407 |
{ |
408 |
return "CBlobGetMaxY"; |
409 |
} |
410 |
}; |
411 |
|
412 |
|
413 |
//! Classe per calcular l'elongacio d'un blob
|
414 |
//! Class to calculate the elongation of the blob
|
415 |
class CBlobGetElongation: public COperadorBlob |
416 |
{ |
417 |
public:
|
418 |
double operator()(CBlob &blob);
|
419 |
const char *GetNom() |
420 |
{ |
421 |
return "CBlobGetElongation"; |
422 |
} |
423 |
}; |
424 |
|
425 |
//! Classe per calcular la rugositat d'un blob
|
426 |
//! Class to calculate the roughness of the blob
|
427 |
class CBlobGetRoughness: public COperadorBlob |
428 |
{ |
429 |
public:
|
430 |
double operator()(CBlob &blob);
|
431 |
const char *GetNom() |
432 |
{ |
433 |
return "CBlobGetRoughness"; |
434 |
} |
435 |
}; |
436 |
|
437 |
//! Classe per calcular la dist?ncia entre el centre del blob i un punt donat
|
438 |
//! Class to calculate the euclidean distance between the center of a blob and a given point
|
439 |
class CBlobGetDistanceFromPoint: public COperadorBlob |
440 |
{ |
441 |
public:
|
442 |
//! Standard constructor (distance to point 0,0)
|
443 |
CBlobGetDistanceFromPoint() |
444 |
{ |
445 |
m_x = m_y = 0.0; |
446 |
} |
447 |
//! Constructor (distance to point x,y)
|
448 |
CBlobGetDistanceFromPoint( const double x, const double y ) |
449 |
{ |
450 |
m_x = x; |
451 |
m_y = y; |
452 |
} |
453 |
|
454 |
double operator()(CBlob &blob);
|
455 |
const char *GetNom() |
456 |
{ |
457 |
return "CBlobGetDistanceFromPoint"; |
458 |
} |
459 |
|
460 |
private:
|
461 |
// coordenades del punt on volem calcular la dist?ncia
|
462 |
double m_x, m_y;
|
463 |
}; |
464 |
|
465 |
//! Classe per calcular el nombre de pixels externs d'un blob
|
466 |
//! Class to get the number of extern pixels of a blob
|
467 |
class CBlobGetExternPerimeter: public COperadorBlob |
468 |
{ |
469 |
public:
|
470 |
CBlobGetExternPerimeter() |
471 |
{ |
472 |
m_mask = NULL;
|
473 |
m_xBorder = false;
|
474 |
m_yBorder = false;
|
475 |
} |
476 |
CBlobGetExternPerimeter( IplImage *mask, bool xBorder = true, bool yBorder = true ) |
477 |
{ |
478 |
m_mask = mask; |
479 |
m_xBorder = xBorder; |
480 |
m_yBorder = yBorder; |
481 |
} |
482 |
double operator()(CBlob &blob)
|
483 |
{ |
484 |
return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder);
|
485 |
} |
486 |
const char *GetNom() |
487 |
{ |
488 |
return "CBlobGetExternPerimeter"; |
489 |
} |
490 |
private:
|
491 |
IplImage *m_mask; |
492 |
bool m_xBorder, m_yBorder;
|
493 |
}; |
494 |
|
495 |
//! Classe per calcular el ratio entre el perimetre i nombre pixels externs
|
496 |
//! valors propers a 0 indiquen que la majoria del blob ?s intern
|
497 |
//! valors propers a 1 indiquen que la majoria del blob ?s extern
|
498 |
//! Class to calculate the ratio between the perimeter and the number of extern pixels
|
499 |
class CBlobGetExternPerimeterRatio: public COperadorBlob |
500 |
{ |
501 |
public:
|
502 |
CBlobGetExternPerimeterRatio() |
503 |
{ |
504 |
m_mask = NULL;
|
505 |
m_xBorder = false;
|
506 |
m_yBorder = false;
|
507 |
} |
508 |
CBlobGetExternPerimeterRatio( IplImage *mask, bool xBorder = true, bool yBorder = true ) |
509 |
{ |
510 |
m_mask = mask; |
511 |
m_xBorder = xBorder; |
512 |
m_yBorder = yBorder; |
513 |
} |
514 |
double operator()(CBlob &blob)
|
515 |
{ |
516 |
if( blob.Perimeter() != 0 ) |
517 |
return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder) / blob.Perimeter();
|
518 |
else
|
519 |
return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder);
|
520 |
} |
521 |
const char *GetNom() |
522 |
{ |
523 |
return "CBlobGetExternPerimeterRatio"; |
524 |
} |
525 |
private:
|
526 |
IplImage *m_mask; |
527 |
bool m_xBorder, m_yBorder;
|
528 |
}; |
529 |
|
530 |
//! Classe per calcular el ratio entre el perimetre convex i nombre pixels externs
|
531 |
//! valors propers a 0 indiquen que la majoria del blob ?s intern
|
532 |
//! valors propers a 1 indiquen que la majoria del blob ?s extern
|
533 |
//! Class to calculate the ratio between the perimeter and the number of extern pixels
|
534 |
class CBlobGetExternHullPerimeterRatio: public COperadorBlob |
535 |
{ |
536 |
public:
|
537 |
CBlobGetExternHullPerimeterRatio() |
538 |
{ |
539 |
m_mask = NULL;
|
540 |
m_xBorder = false;
|
541 |
m_yBorder = false;
|
542 |
} |
543 |
CBlobGetExternHullPerimeterRatio( IplImage *mask, bool xBorder = true, bool yBorder = true ) |
544 |
{ |
545 |
m_mask = mask; |
546 |
m_xBorder = xBorder; |
547 |
m_yBorder = yBorder; |
548 |
} |
549 |
double operator()(CBlob &blob)
|
550 |
{ |
551 |
CBlobGetHullPerimeter getHullPerimeter; |
552 |
double hullPerimeter;
|
553 |
|
554 |
if( (hullPerimeter = getHullPerimeter( blob ) ) != 0 ) |
555 |
return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder) / hullPerimeter;
|
556 |
else
|
557 |
return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder);
|
558 |
} |
559 |
const char *GetNom() |
560 |
{ |
561 |
return "CBlobGetExternHullPerimeterRatio"; |
562 |
} |
563 |
private:
|
564 |
IplImage *m_mask; |
565 |
bool m_xBorder, m_yBorder;
|
566 |
|
567 |
}; |
568 |
|
569 |
//! Classe per calcular el centre en el eix X d'un blob
|
570 |
//! Class to calculate the center in the X direction
|
571 |
class CBlobGetXCenter: public COperadorBlob |
572 |
{ |
573 |
public:
|
574 |
double operator()(CBlob &blob)
|
575 |
{ |
576 |
return blob.MinX() + (( blob.MaxX() - blob.MinX() ) / 2.0); |
577 |
} |
578 |
const char *GetNom() |
579 |
{ |
580 |
return "CBlobGetXCenter"; |
581 |
} |
582 |
}; |
583 |
|
584 |
//! Classe per calcular el centre en el eix Y d'un blob
|
585 |
//! Class to calculate the center in the Y direction
|
586 |
class CBlobGetYCenter: public COperadorBlob |
587 |
{ |
588 |
public:
|
589 |
double operator()(CBlob &blob)
|
590 |
{ |
591 |
return blob.MinY() + (( blob.MaxY() - blob.MinY() ) / 2.0); |
592 |
} |
593 |
const char *GetNom() |
594 |
{ |
595 |
return "CBlobGetYCenter"; |
596 |
} |
597 |
}; |
598 |
|
599 |
//! Classe per calcular la longitud de l'eix major d'un blob
|
600 |
//! Class to calculate the length of the major axis of the ellipse that fits the blob edges
|
601 |
class CBlobGetMajorAxisLength: public COperadorBlob |
602 |
{ |
603 |
public:
|
604 |
double operator()(CBlob &blob)
|
605 |
{ |
606 |
CvBox2D elipse = blob.GetEllipse(); |
607 |
|
608 |
return elipse.size.width;
|
609 |
} |
610 |
const char *GetNom() |
611 |
{ |
612 |
return "CBlobGetMajorAxisLength"; |
613 |
} |
614 |
}; |
615 |
|
616 |
//! Classe per calcular el ratio entre l'area de la elipse i la de la taca
|
617 |
//! Class
|
618 |
class CBlobGetAreaElipseRatio: public COperadorBlob |
619 |
{ |
620 |
public:
|
621 |
double operator()(CBlob &blob)
|
622 |
{ |
623 |
if( blob.Area()==0.0 ) return 0.0; |
624 |
|
625 |
CvBox2D elipse = blob.GetEllipse(); |
626 |
double ratioAreaElipseAreaTaca = ( (elipse.size.width/2.0) |
627 |
* |
628 |
(elipse.size.height/2.0) |
629 |
*CV_PI |
630 |
) |
631 |
/ |
632 |
blob.Area(); |
633 |
|
634 |
return ratioAreaElipseAreaTaca;
|
635 |
} |
636 |
const char *GetNom() |
637 |
{ |
638 |
return "CBlobGetAreaElipseRatio"; |
639 |
} |
640 |
}; |
641 |
|
642 |
//! Classe per calcular la longitud de l'eix menor d'un blob
|
643 |
//! Class to calculate the length of the minor axis of the ellipse that fits the blob edges
|
644 |
class CBlobGetMinorAxisLength: public COperadorBlob |
645 |
{ |
646 |
public:
|
647 |
double operator()(CBlob &blob)
|
648 |
{ |
649 |
CvBox2D elipse = blob.GetEllipse(); |
650 |
|
651 |
return elipse.size.height;
|
652 |
} |
653 |
const char *GetNom() |
654 |
{ |
655 |
return "CBlobGetMinorAxisLength"; |
656 |
} |
657 |
}; |
658 |
|
659 |
//! Classe per calcular l'orientaci? de l'ellipse del blob en radians
|
660 |
//! Class to calculate the orientation of the ellipse that fits the blob edges in radians
|
661 |
class CBlobGetOrientation: public COperadorBlob |
662 |
{ |
663 |
public:
|
664 |
double operator()(CBlob &blob)
|
665 |
{ |
666 |
CvBox2D elipse = blob.GetEllipse(); |
667 |
/*
|
668 |
if( elipse.angle > 180.0 )
|
669 |
return (( elipse.angle - 180.0 )* DEGREE2RAD);
|
670 |
else
|
671 |
return ( elipse.angle * DEGREE2RAD);
|
672 |
*/
|
673 |
return elipse.angle;
|
674 |
} |
675 |
const char *GetNom() |
676 |
{ |
677 |
return "CBlobGetOrientation"; |
678 |
} |
679 |
}; |
680 |
|
681 |
//! Classe per calcular el cosinus de l'orientaci? de l'ellipse del blob
|
682 |
//! Class to calculate the cosinus of the orientation of the ellipse that fits the blob edges
|
683 |
class CBlobGetOrientationCos: public COperadorBlob |
684 |
{ |
685 |
public:
|
686 |
double operator()(CBlob &blob)
|
687 |
{ |
688 |
CBlobGetOrientation getOrientation; |
689 |
return fabs( cos( getOrientation(blob)*DEGREE2RAD ));
|
690 |
} |
691 |
const char *GetNom() |
692 |
{ |
693 |
return "CBlobGetOrientationCos"; |
694 |
} |
695 |
}; |
696 |
|
697 |
|
698 |
//! Classe per calcular el ratio entre l'eix major i menor de la el?lipse
|
699 |
//! Class to calculate the ratio between both axes of the ellipse
|
700 |
class CBlobGetAxisRatio: public COperadorBlob |
701 |
{ |
702 |
public:
|
703 |
double operator()(CBlob &blob)
|
704 |
{ |
705 |
double major,minor;
|
706 |
CBlobGetMajorAxisLength getMajor; |
707 |
CBlobGetMinorAxisLength getMinor; |
708 |
|
709 |
major = getMajor(blob); |
710 |
minor = getMinor(blob); |
711 |
|
712 |
if( major != 0 ) |
713 |
return minor / major;
|
714 |
else
|
715 |
return 0; |
716 |
} |
717 |
const char *GetNom() |
718 |
{ |
719 |
return "CBlobGetAxisRatio"; |
720 |
} |
721 |
}; |
722 |
|
723 |
|
724 |
//! Classe per calcular si un punt cau dins del blob
|
725 |
//! Class to calculate whether a point is inside a blob
|
726 |
class CBlobGetXYInside: public COperadorBlob |
727 |
{ |
728 |
public:
|
729 |
//! Constructor est?ndard
|
730 |
//! Standard constructor
|
731 |
CBlobGetXYInside() |
732 |
{ |
733 |
m_p.x = 0;
|
734 |
m_p.y = 0;
|
735 |
} |
736 |
//! Constructor: indiquem el punt
|
737 |
//! Constructor: sets the point
|
738 |
CBlobGetXYInside( CvPoint2D32f p ) |
739 |
{ |
740 |
m_p = p; |
741 |
}; |
742 |
double operator()(CBlob &blob);
|
743 |
const char *GetNom() |
744 |
{ |
745 |
return "CBlobGetXYInside"; |
746 |
} |
747 |
|
748 |
private:
|
749 |
//! punt que considerem
|
750 |
//! point to be considered
|
751 |
CvPoint2D32f m_p; |
752 |
}; |
753 |
|
754 |
#endif //!BLOB_OPERATORS_H_INCLUDED |