You are on page 1of 18

De C a C++ - Parte 4 - OpenCV

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

// Crear una matriz compleja de 7x7 con el valor (1+3i).


Mat M(7, 7, CV_32FC2, Scalar(1,3));

3
4
5
6

// y luego convertir M en una matriz de 100x60


// de 15-canales de 8 bits (contenido previo se libera).
M.create(100, 60, CV_8UC(15));

Formato para tipo y n


umero de canales:
CV_<numero_de_bits>{U|S|F}C<numero_de_canales>
U: entero unsigned
S: entero signed
F: punto flotante

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

// crear nueva imagen de 320x240


cv::Mat img(Size(320,240),CV_8UC3);

3
4
5
6

// Seleccionar ROI (region de interes)


// mediante subimagen
cv::Mat roi(img, Rect(10,10,100,100));

7
8
9
10

// Llenar el ROI con (0,255,0) (verde);


// imagen original de 320x240 se modifica
roi = Scalar(0,255,0);

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:

Clase cv::Rect, con atributos de posici


on (x, y ), width y
height.
Clase cv::Size, con atributos de width y height.
Clase cv::Point, con atributos de posici
on (x, y ).
Para saber la posici
on se usa Mat::locateROI(cv::Size, cv::Point).
Para ajustar la ROI se usa Mat::adjustROI(int dtop, int dbottom, int
dleft, int dright), 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);

code define el tipo de conversi


on. Las m
as usadas:
CV_BGR2RGB
CV_RGB2BGR
CV_RGBA2BGRA
CV_BGRA2RGBA

//Convierte entre RGB y BGR (con o sin canal alpha)

CV_RGB2RGBA
CV_BGR2BGRA

//Agrega canal alpha

CV_RGBA2RGB
CV_BGRA2BGR

//Elimina canal alpha

CV_RGB2GRAY
CV_BGR2GRAY

//Convierte RGB o BGR a grayscale

CV_GRAY2RGB
CV_GRAY2BGR

//Convierte grayscale a RGB o BGR

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

OpenCV y QT: Instalaci


on integrada
qt-opencv-multithreaded proyecto p
ublico que integra QT y OpenCV en
un ambiente multi-hilos.
code.google.com/p/qt-opencv-multithreaded/wiki/Documentation

13/18

OpenCV y QT : Instalacion integrada


Instalaci
on de OpenCV (para Ubuntu 11.04)
1 Descargar e instalar CMake y otras dependencias requeridas:
$ sudo apt-get update
$ sudo apt-get install build-essential cmake libgtk2.0-dev libtiff4-dev
libjasper-dev libavformat-dev libswscale-dev libavcodec-dev libjpeg62-dev
2 Descargar u
ltima versi
on de OpenCV:
http://sourceforge.net/projects/opencvlibrary/files/
3 Descomprimir archivo y entrar al directorio:
$ tar -xvf OpenCV-2.3.1.tar.bz2
$ cd OpenCV-2.3.1
4 Crear directorio (archivos construidos por CMake ir
an a
el):
$ mkdir release
$ cd release
5 Usar CMake para generar el makefile:
$ cmake -D CMAKE BUILD TYPE=RELEASE -D CMAKE INSTALL PREFIX=/usr/local ..
6
7

Compilar e instalar OpenCV:


$ sudo make install
Indicar al sistema las bibliotecas generadas:
$ export LD LIBRARY PATH= /OpenCV-2.3.1/release/lib:$LD LIBRARY PATH

$ 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

OpenCV y QT : Instalacion integrada

En el caso de Windows, el paquete de OpenCV 2.3.1 instala todo lo que


necesita.
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.3.1/
OpenCV-2.3.1-win-superpack.exe/download

Para OpenCV en Ubuntu 11.10, utilizar:


http://thebitbangtheory.wordpress.com/2011/10/23/
how-to-install-opencv-2-3-1-in-ubuntu-11-10-oneiric-ocelot-with-python-support/

reemplazando el paso 4, por la instalaci


on del repositorio con el paquete
ffmpeg actualizado en:
https://launchpad.net/~jon-severinsson/+archive/ffmpeg

15/18

OpenCV y QT : Instalacion integrada


Integraci
on de OpenCV con QT
1 En Qt Creator, agregar lo siguiente al archivo .PRO del proyecto, para
compatibilidad con Windows y Linux:
win32{
INCLUDEPATH += "C:\\OpenCV-2.3.1\\release\\include"
LIBS += -LC:\\OpenCV-2.3.1\\release\\lib
LIBS += -llibopencv_highgui \
-llibopencv_core \
-llibopencv_imgproc \
-llibopencv_video \
-llibopencv_calib3d \
-llibopencv_contrib \
-llibopencv_features2d \
-llibopencv_flann \
-llibopencv_gpu \
-llibopencv_objdetect \
-llibopencv_video \
-llibopencv_legacy
}
unix{
LIBS += pkg-config opencv --cflags --libs
}

En el caso de Windows, preocuparse de ajustar los directorios seg


un la u
ltima
versi
on de OpenCV instalada.
En el caso de Linux, si no se dispone del comando pkg-config:
LIBS += -lopencv core -lopencv imgproc -lopencv highgui -lopencv ml -lopencv video
-lopencv features2d -lopencv calib3d -lopencv objdetect -lopencv contrib -lopencv legacy -lopencv flann
2

Inclur los headers de OpenCV donde se requiera. Por ejemplo:


#include <opencv/cv.h>
#include <opencv/highgui.h>
16/18

Bibliotecas de OpenCV
Estructura de las bibliotecas de OpenCV
Core: Estructuras/clases y funcionalidades de base de OpenCV.

Clases de base: Point , Size , Rect , Vec


La clase de matrices Mat.
Muchas funciones para manipulaci
on de matrices.
Tambien considera compatibilidad con C, estructuras din
amicas,
operaciones con arreglos, funciones b
asicas de dibujo, XML y clustering.
Se accede mediante: #include <opencv/highgui.h>
Highgui: GUI de alto nivel y acceso I/O. Incluye interfaces usuarias
(ventanas cl
asicas de OpenCV), lectura y escritura de im
agenes y video, y
nuevas funcionalidades con QT.
Se accede mediante: #include <opencv/highgui.h>
imgproc: Funciones de procesamiento de im
agenes (filtros, funciones
geometricas, detecci
on de caractersticas y objetos, entre otros).
Se accede mediante: #include <opencv/cv.h>

17/18

Bibliotecas de OpenCV

Estructura de las bibliotecas de OpenCV


Otras bibliotecas:

video: analisis de movimiento y tracking.


calib3d: calibraci
on y geometra proyectiva.
feature2d: extracci
on y procesamiento de caractersticas 2D.
objdetect: detecci
on de objetos usando aprendizaje mediante
ejemplos.
ml: Metodos de machine learning.
flann: Metodos de clustering y b
usqueda.
gpu: Aceleraci
on mediante gpu.
Se acceden mediante: #include <opencv/cv.h>
Link a la documentaci
on:
http://opencv.itseez.com/trunk/modules/refman.html

18/18

You might also like