Marcos Z
un
iga
Departamento de Electr
onica
Noviembre 2013
1/18
OpenCV
OpenCV
OpenCV (Open Source Computer Vision Library) es una biblioteca
que apunta principalmente a la visi
on por computador en tiempo
real.
Se lanz
o oficialmente en 1999, por Intel Research inicialmente para
aplicaciones avanzadas, intensivas en procesamiento.
Actualmente soportada por Willow Garage
http://opencv.willowgarage.com/wiki/
Es gratis para ser usada bajo licencia BSD open source. Existen
versiones para varias plataformas.
Si la librera encuentra Integrated Performance Primitives de Intel
en el sistema, usara estas rutinas propietarias optimizadas para
acelerar el procesamiento.
Tiene interfaces para C++, C, C#, Python, Java...; para Windows,
Linux, Android, Mac, iOS... incluso es implementable en Raspberry
Pi.
Mas de 2500 algoritmos optimizados.
2/18
Imagenes en OpenCV
Im
agenes en OpenCV - Mat
La primera version de OpenCV hered
o la estructura IplImage
de la Intel Image Processing Library para representar
imagenes.
OpenCV, pese a estar implementado en C, simulaba la
herencia en este caso: CvArr CvMat IplImage
Actualmente, OpenCV 2.3 provee clase cv::Mat, y todas las
funcionalidades tambien para C++.
La clase Mat representa un arreglo n-dimensional de uno o
varios canales.
Puede almacenar vectores y matrices, reales o complejos, e
imagenes en escala de gris o color, entre otras cosas.
Fuente:
http://opencv.itseez.com/modules/core/doc/basic_
structures.html#mat
3/18
Imagenes en Colores
Im
agenes en OpenCV - Mat
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
class Mat {
public:
// ... muchos m
etodos ...
...
/*! incluye varios bit-fields:
- magic signature
- continuity flag
- depth
- number of channels
*/
int flags;
//! dimensiones, >= 2
int dims;
//! numero de filas y columnas o (-1, -1) para mas de 2dimensiones
int rows, cols;
// Distancia entre filas sucesivas en bytes (incluye el gap de cuadratura)
size_t step;
//! puntero a los datos
uchar* data;
// Puntero al contador de referencias;
// cuando el arreglo apunta a datos cuya
// memoria fue reservada por el usuario,
// el puntero es NULL
int* refcount;
...
};
4/18
Imagenes en Colores
Im
agenes en OpenCV - depth
Tama
no para representar a un pxel o canal.
Desde un Mat definido, se obtiene con el metodo
Mat::depth()
Valores posibles:
CV_8U - 8-bit unsigned integers ( 0..255 )
CV_8S - 8-bit signed integers ( -128..127 )
CV_16U - 16-bit unsigned integers ( 0..65535 )
CV_16S - 16-bit signed integers ( -32768..32767 )
CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )
5/18
Imagenes en OpenCV
Im
agenes en OpenCV - Mat
Creacion:
1
2
3
4
5
6
El n
umero de canales se puede recuperar con
Mat::channels().
El tipo de la matriz, tal cual entregado en las funciones de
creacion, se puede recuperar con Mat::type().
6/18
Imagenes en OpenCV
Im
agenes en OpenCV - Mat
Creacion de imagen:
1
2
3
4
5
6
7
8
9
10
7/18
Imagenes en OpenCV
Im
agenes en OpenCV - Mat
Creacion:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cv::Mat M(Size(640,480),CV_8UC3);
int i, j, cols = M.cols,
rows = M.rows;
int depth = M.depth(),
channels = M.channels(),
step = M.step;
uchar *data = M.data;
std::cout << "Cols: " << cols << std::endl;
std::cout << "Rows: " << rows << std::endl;
std::cout << "channels: " << channels << std::endl;
std::cout << "step: " << step << std::endl;
for(i = 0; i < rows; i++) {
for(j = 0; j < cols; j++) {
data[i*step + j*channels + 0]
= data[i*step + j*channels + 1] = 0;
}
}
8/18
Imagenes en Colores
Im
agenes en OpenCV - ROI
El ROI (Region Of Interest) define cual regi
on de la imagen debe ser
procesada.
Se manejan con:
dtop: n
umero de pxeles hacia arriba del lmite superior.
dbottom: n
umero de pxeles hacia abajo del lmite inferior.
dleft: n
umero de pxeles hacia la izquierda del lmite izquierdo.
dright: n
umero de pxeles hacia la derecha del lmite derecho.
El ROI se utiliza en forma est
andar en todas las funciones de OpenCV.
9/18
Imagenes en Colores
Im
agenes en OpenCV - ROI
cv::Size size;
cv::Point point;
//Con la misma Mat M .....
//Extraigo la informacion del ROI actual:
M.locateROI(size,point);
//Ajusto el ROI con un nuevo cuadro, por ejemplo,
// Rect(x, y, width, height)
cv::Rect newROI(10,10,100,100);
M.adjustROI(-newROI.y,-(size.height-newROI.height-newROI.y),
-newROI.x,-(size.width -newROI.width -newROI.x));
10/18
Imagenes en Colores
Im
agenes en OpenCV - Conversiones de Color
Funci
on de conversi
on de color.
void cv::cvtColor(Mat src, Mat dst, int code);
CV_RGB2RGBA
CV_BGR2BGRA
CV_RGBA2RGB
CV_BGRA2BGR
CV_RGB2GRAY
CV_BGR2GRAY
CV_GRAY2RGB
CV_GRAY2BGR
11/18
Imagenes en Colores
Im
agenes en OpenCV - Conversiones de Color
code define el tipo de conversi
on. Las m
as usadas:
CV_RGB2YCrCb //Convierte RGB o BGR a YCrCb (YUV)
CV_BGR2YCrCb
CV_YCrCb2RGB
CV_YCrCb2BGR
CV_RGB2HSV //Convierte RGB o BGR a HSV (hue saturation value), y vice versa
CV_BGR2HSV
CV_HSV2RGB
CV_HSV2BGR
CV_RGB2HLS //Convierte RGB o BGR a HLS (hue lightness saturation), y vice versa
CV_BGR2HLS
CV_HLS2RGB
CV_HLS2BGR
12/18
OpenCV y QT
13/18
$ sudo ldconfig
(Opcional) Usar pkg-config para simplificar el proceso making/building de
proyectos OpenCV: $ pkg-config opencv libs
Dependencias OpenCV simplemente linkeadas mediante:
pkg-config opencv --cflags --libs
Reiniciar Ubuntu.
14/18
15/18
Bibliotecas de OpenCV
Estructura de las bibliotecas de OpenCV
Core: Estructuras/clases y funcionalidades de base de OpenCV.
17/18
Bibliotecas de OpenCV
18/18