Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Utilidades/src/cvUtilities.h
blob: e0404a87e0c3332fbac535549e39c3b691781b90 (plain)
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
/**
 * @author Sebastián Marichal
 * 		   sebastian_marichal@hotmail.com
 * 		   sebarocker@gmail.com
 *
 * Universidad de la República, Montevideo , Uruguay
 */
#ifndef CVUTILITIES_H_INCLUDED
#define CVUTILITIES_H_INCLUDED

#include <opencv/cv.h>
#include <opencv/cxcore.h>
#include <opencv/highgui.h>
#include "Estructuras.h"
#include <AR/video.h>

#define ERROR_HISTOGRAMA_OK 100
#define ERROR_HISTOGRAMA_FALLO 101

#define ERROR_RANGOS_CALCULADOS_OK 102
#define ERROR_RANGOS_HISTOGRAMA_NO_CONTINUO 103

#define ERROR_HISTOGRAMA_NULL 104

IplImage* crearImagenCvGris(ARUint8  *dataPtr,int xsize,int ysize);
IplImage* crearImagenCv(ARUint8  *dataPtr,int xsize,int ysize);
IplImage* crearImagenCv2(ARUint8  *dataPtr,int xsize,int ysize);
IplImage* crearImagenCv3(int xsize,int ysize);
void templateMatching(IplImage* image, IplImage* templateImage);
void convertShervineRGBtoHSV(uchar R,uchar G, uchar B, uchar *H,uchar *S, uchar *V);
IplImage* convertImageRGBtoHSV(const IplImage *imageRGB);
void normalizarHSVOpenCV(IplImage* img);
void HSVtoHSVcvUchar(uchar *H,uchar *S,uchar *V);
void HSVtoHSVcvUdouble(double *H,double *S,double *V);
void RGBtoHSVDouble(double r, double g, double b, double *H, double *S, double *V);
/*Convierte el area indicada usando RGBtoHSVDouble para cada pixel dentro del area indicada*/
void rgb2hsv(IplImage* img,IplImage*hsv,CvRect area);
void RGBtoHSVchar(uchar r, uchar g, uchar b, uchar *H, uchar *S, uchar *V);
int hayObjetoColor(IplImage* img, IplImage* mono,int hlower,int hupper, int slower, int supper, int vlower,
					int vupper,int mostrarImagen, int xStart, int yStart, int width, int height,int minArea,
					int maxArea,int Erode,int Dilate,int Smooth,int enclosingCircle, char* ventana,char * ventanaColor);
/**
 * Muestra el segmento de imagen correspondiente donde (xStart,yStart) es el vertice
 * superior izquierdo
 *
 */
void mostrarTarget(IplImage* img,float xStart,float yStart, int width,int height);

/*
 * minH, maxH, minS, maxS, minV, maxV : Randos de color que se quiere detectar
 * verticesMarcador : Vertices definiendo zona rectangular donde se buscara el apuntador. Por ejemplo ,pueden ser los vertices de un marcador ARtoolkit
 * offsetRoi : Offset de la zona de estudio. zona de estudio es el area definida por los vertices + offsetRoi
 * dataPtr : Imagen original
 * img, mono_Image : Imagenes inicializadas con los tamanos adecuados para contener a dataPtr pero vacias
 * min_area : Area minima del apuntador. Si se detecta un apuntador con area menor no se toma en cuenta
 * max_area : Area maxima del apuntador. Si se detecta un apuntador con area mayor no se toma en cuenta
 * min_area_width_height : El minimo de alto o ancho que tiene que tener el area de estudio. Si alguna de sus 2 dimensiones es menor a este
 * 							valor entonces se descarta y no se busca el apuntador. El valor minimo que puede recibir en este parametro es 1
 * erode,smooth,dilate : Propios del algoritmo de reconocimiento de color. Si se usa erode y dilate no se usa smooth.
 *
 */
float hayApuntador(int minH,int maxH, int minS, int maxS, int minV, int maxV, double vertices[4][2], int offsetRoi, uchar* dataPtr,
					IplImage* img,IplImage* mono_Image,int min_area_width_height,int min_area,int max_area,int erode, int dilate,
					int smooth,int enclosingCircle, double *areaZonaEstudio, char* ventanaMostrarImagenMono,char* ventanaMostrarImagenColor);


/**
 * Version mas nueva
 * Idem a la anterior pero recibe el rango de colores en una estructura RangosColorApuntador.
 * Ademas no recibe un max_area sino que lo calcula mediante areaZonaEstudio/factor
 */
float hayApuntador(RangosColorApuntador rangos, double vertices[4][2], int offsetRoi, uchar* dataPtr,
					IplImage* img,IplImage* mono_Image,int min_area_width_height,int min_area,float factor,int erode, int dilate,int smooth, int enclosingCircle,double *areaZonaEstudio,char* ventanaMostrarImagenMono,char* ventanaMostrarImagenColor);



				/******************************MANEJO DE HISTOGRAMAS**********************************/

/*Crea un Histograma y setea su valor en 0*/
CvHistogram* crearHistogramaHS(RangosColorApuntador rangos,int h_bins,int s_bins);
CvHistogram* crearHistograma1D(float *ranges, int bins);
void separarImagenEnPlanos(IplImage* hsv, IplImage* h_plane,IplImage* s_plane,IplImage* v_plane);
int calcularHistograma(CvHistogram* hist,IplImage* plane,IplImage* mascara,int bins,float* ranges,int acumular,int debugMode);

int getTotalBins1D(CvHistogram* hist,int nbins);
void imprimirInfoHist(CvHistogram* hist, int nbins);

int calcRangosHist(CvHistogram* hist, int nbins, float* ranges, int continuo,double *resCalc);


//Video Functions
unsigned char* getRawVideoFrame();

#endif // CVUTILITIES_H_INCLUDED