Tutorial Opencv PDF

Title Tutorial Opencv
Author jc cm
Course Visión Artificial
Institution UNED
Pages 39
File Size 2.4 MB
File Type PDF
Total Downloads 39
Total Views 127

Summary

Instalacion en java; Netbeans 7.2; uso opencv...


Description

Instalar opencv para java

También podemos crear proyectos opencv con java y el IDE de nuestra preferencia, e caso caso usaremos usaremos Netbeans Netbeans 7.2, 7.2, la la configuración configuraciónde de los los proyectos proyectos es es muy muysencilla: sencilla:

Creamos un proyecto java tipo java application.

Una Una vez vez tenemos tenemos el el proyecto proyecto creado, creado, debemos debemos agregar agregar los los archivos archivos jar jar que que cont con librerías librerías opencv, opencv, la la podemos podemos encontrar encontrar en en el el directorio directorio de de instalación instalación C:\opencv\ C:\opencv\ con el nombre de opencv-246.jar, el numero 246 puede variar según la versión de ope

Para Para agregar agregar la la librería librería hacemos hacemos lo lo siguiente: siguiente:

Por Por ultimo ultimo debemos debemos agregar agregar la la dll dll opencv_java246.dll opencv_java246.dll que que se se encuentra encuentra en en la la carpeta carpet plataformas plataformasde de32 32 bits bitsoox64 x64para para64 64 bits. bits.Lo Lomás mássencillo sencilloque que podemos podemoshacer haceres es cop cop pegarla en el directorio raíz de nuestro proyecto.

package opencv; import import org.opencv.core.Core; org.opencv.core.Core; import import org.opencv.core.CvType; org.opencv.core.CvType; import org.opencv.core.Mat;

1 2 3 4 5 6 7 8 9 10 11 12 public class Opencv { public public static static void void main(String[] main(String[] args) args) {{ 13 14 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); System.loadLibrary(Core.NATIVE_LIBRARY_NAME); System.out.println("Opencv-" System.out.println("Opencv-" + + Core.VERSION); Mat Mat mm == Mat.eye(3, Mat.eye(3, 3, 3, CvType.CV_8UC1) CvType.CV_8UC1 System.out.println("m System.out.println("m == "" ++ m.dump()) m.dump() } } view raw opencv.java hosted with ❤by by GitHub Si Si todo todo esta esta correcto correcto podremos podremos ejecutar ejecutar este este código. código.

Introducción a OpenCV Una Una vez vez hemos hemos instalado instalado opencv opencv podemos podemos comenzar comenzar aa crear crear nuestra nuestra primera primera aplic apli opencv opencvuna unalibrería libreríade decomputación computaciónvisual visualtrabajaremos trabajaremosla lamayoría mayoríadel deltiempo tiempocon conim i videos videos por por lo lo cual cual lo lo primero primero que que veremos veremos será será como como mostrar mostrar imágenes imágenes yy videos videos en en

Por Por ultimo ultimo debemos debemos agregar agregar la la dll dll opencv_java246.dll opencv_java246.dll que que se se encuentra encuentra en en la la carpeta carpet plataformas plataformasde de32 32 bits bitsoox64 x64para para64 64 bits. bits.Lo Lomás mássencillo sencilloque que podemos podemoshacer haceres es cop cop pegarla en el directorio raíz de nuestro proyecto.

package opencv; import import org.opencv.core.Core; org.opencv.core.Core; import import org.opencv.core.CvType; org.opencv.core.CvType; import org.opencv.core.Mat;

1 2 3 4 5 6 7 8 9 10 11 12 public class Opencv { public public static static void void main(String[] main(String[] args) args) {{ 13 14 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); System.loadLibrary(Core.NATIVE_LIBRARY_NAME); System.out.println("Opencv-" System.out.println("Opencv-" + + Core.VERSION); Mat Mat mm == Mat.eye(3, Mat.eye(3, 3, 3, CvType.CV_8UC1) CvType.CV_8UC1 System.out.println("m System.out.println("m == "" ++ m.dump()) m.dump() } } view raw opencv.java hosted with ❤by by GitHub Si Si todo todo esta esta correcto correcto podremos podremos ejecutar ejecutar este este código. código.

Introducción a OpenCV Una Una vez vez hemos hemos instalado instalado opencv opencv podemos podemos comenzar comenzar aa crear crear nuestra nuestra primera primera aplic apli opencv opencvuna unalibrería libreríade decomputación computaciónvisual visualtrabajaremos trabajaremosla lamayoría mayoríadel deltiempo tiempocon conim i videos videos por por lo lo cual cual lo lo primero primero que que veremos veremos será será como como mostrar mostrar imágenes imágenes yy videos videos en en

Lo Lo primero primero es es crear crear un un proyecto proyecto opencv opencv con con la la plantilla plantilla que que previamente previamente creamos. creamos.

#include

using namespacecv; namespace cv;

intmain( int main( intargc, int argc, char** char** argv ) {

//crea //crea una una ventana ventana llamada llamada ‘ventana’ ‘ventana’ de de tamaño tamaño automático automático oo ajustable ajustable

namedWindow( "ventana", "ventana", CV_WINDOW_AUTOSIZE); CV_WINDOW_AUTOSIZE);

//Espera a que se presione una tecla waitKey(0);

//destruye la ventana destroyWindow( "ventana"); "ventana" );

#include

using namespacecv;

intmain( intargc, char** argv ) {

namedWindow( "ventana", CV_WINDOW_AUTOSIZE);

//carga la imagen indicada y la devuelve en una matriz Matm1 = imread("imagen.jpeg");

//Muestra la imagen la ventana indicada imshow( "ventana", m1);

waitKey(0); destroyWindow( "ventana");

}

Con esto tenemos nuestro primer programa listo, el cual muestra una imagen en una debemos presionar una tecla para salir, en nuestro caso la imagen debe estar en el p se encuentra fuera debemos indicar la ruta completa.

Mostrar un video en OpenCV

Para reproducir un video se hace de forma similar a una imagen ya que un video no e una secuencia de imágenes, por lo que deberemos cargar las imágenes del video y una tras otras, veamos cómo se hace:

namedWindow( "ventana", CV_WINDOW_AUTOSIZE );

//cargar el archivo de video especificado VideoCapture vc("video.mp4");

//verificar si se ha podio cargar el video if(!vc.isOpened()) return-1;

//obtener los cuadros por segundo double fps = vc.get(CV_CAP_PROP_FPS);

// calcular el tiempo de espera entre cada imagen a mostrar int delay

1000 / fps;

//cargar el primer cuadro o imagen del video en frame vc >> frame;

imshow( "ventana", frame);

//esperar un periodo de tiempo especificado por delay //si se presiona la tecla 27 (ESC) salir del loop if(waitKey(delay) == 27) break; }

destroyWindow( "ventana");

El archivo video.mp4 se reproducirá, si deseamos reproducir otro video debemos ruta completa.

vc >> frame esta línea de código carga cada cuadro del video dentro de frama p

mostrarlo, en cada iteración del loop se avanza hacia el siguiente cuadro, este pudimos haber escrito de esta forma: vc.read(frame);

if(waitKey(delay) == 27) break; la función waitKey(0) espera a indefinidamente

presione una tecla, si indicamos un número mayor que cero será el periodo de tiem que esperara a que se presione una tecla, si en ese periodo no se ha presion continua.

Descarga Codigo C++ OpenCV - Proyecto Introducción a OpenCV

Dibujar Formas y Texto

Lo primero que necesitamos es donde dibujar por lo que crearemos una imagen (M sobre la cual representaremos nuestros dibujos, el siguiente código crea un objeto d Mat que representa nuestra imagen en opencv de 800x600 pixeles, de 3 canale inicializada en 0 o sea color negro.

Matimg(rows, cols, CV_8UC3, Scalar::all(0));

rows: cantidad de filas o pixeles de alto que tendrá nuestra imagen 600. cols: cantidad de columnas o pixeles de ancho de nuestra imagen 800. CV_8UC3:puede ser alguno de los valores mencionados abajo seguido de C3 para tre o C1, C2, C4 para 1, 2, 4, canales respectivamente: 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 ) Scalar::all(0): Scalar representa el color de la imagen en formato BGR, podemos esta color diferente estableciendo los diferentes canales de este modo: Scalar(azul, ver podemos usar el macro CV_RGB(rojo, verde, azul) si nos resulta más cómodo.

Ahora podemos comenzar a dibujar, la primera función que veremos es circle la cual para dibujar un circulo, es muy sencilla veamos cómo se usa:

circle(img, Point(cols / 2, rows / 2), 250, Scalar(255,0,0), 3);

Otra función interesante de dibujo es la función putText la cual dibuja en texto, para debemos especificar la imagen donde vamos a dibujar, el texto a representar, el pun será dibujado el texto (la parte izquierda inferior), el tipo de letra (FONT_HERSHEY_ FONT_HERSHEY_PLAIN,

FONT_HERSHEY_DUPLEX,

FONT_HERSHEY_TRIPLEX,

FONT_HERSHEY_C FONT_HERSHEY_COMPLE

FONT_HERSHEY_SCRIPT_SIMPLEX, FONT_HERSHEY_SCRIPT_COMPLEX ), el tamaño grosor del texto.

putText(img, "OpenCV 2", Point (180,320), FONT_HERSHEY_SCRIPT_COMPLEX, 3, CV_RGB (125,12,145), 2);

Podemos encontrar algunos ejemplos de como dibujar en opencv en la carpeta: C:\Opencv\samples\cpp\tutorial_code\core\Matrix

Código de ejmplo:

#include

using namespacecv;

void main() { introws = 600; intcols = 800; intrec = 150;

//crear una imagen de 800x600 pixeles

//dibuja un circulo en el centro de la imagen de un radio de 250 circle(img, Point(cols / 2, rows / 2), 250, Scalar (255,0,0), 3);

//dibuja una linea line(img, Point(), Point(cols, rows), CV_RGB(255,0,0), 2, CV_AA);

//dibuja un rectangulo rectangle(img, Point(rec, rec), Point(cols - rec, rows - rec), CV_RGB (0,255,255));

//dibuja el texto Opencv 2 putText(img, "OpenCV 2" , Point(180,320), FONT_HERSHEY_SCRIPT_COMPLEX, 3 CV_RGB (125,12,145), 2);

imshow( "Drawing", img); waitKey(0); }

Procesamiento de imágenes en OpenCV En opencv contamos con diferentes funciones que nos permiten procesar las imágen cambiar una imagen a escala de grises o aplicarle otros algoritmos más complicados

img: Imagen original. dst: Matriz donde se almacenara la nueva imagen. Size(width, height): Tamaño del kernel, deben ser positivos e impares. 8: desviación estándar en el eje X.

gaussianblur

MedianBlur

medianBlur(img, dst, 5);

5: ksize debe ser un valor mayor que 1 e impar.

medianblur

erode

Dilate

dilate(img, dst, krl);

dilate

Guardar una imagen

Una vez hemos procesado la imagen tal vez nos interese guardar en disco una co imagen procesada, opencv nos proporciona la función imwrite para almacenar una im un archivo indicado, disponemos de distintos formatos como JPG, PNG, TIFF.

vector compression_params; compression _params.push_back(CV_IMWRITE_PNG_COMPRESSION);

#include using namespace cv; int main() { Mat img = imread("imagen.jpg"); 1234 Mat dst, krl; 5678

9 10 11

GaussianBlur(img, dst, Size(11,7), 1.5); Canny(dst, dst, 0, 30, 3); //blur(img, dst, Size(10,20)); //medianBlur(img, dst, 5); //erode(img, dst, krl); //dilate(img, dst, krl);

12 13 14 15 16 17 18 19 20 21 24 25

vector compression_params; compression_params.push_back(CV_IMWRITE_PNG_COMPRE compression_params.push_back(9);

26 27

imwrite("alpha.png", dst, compression_params);

22 23

28 29 imshow("Imagen Original", img); imshow("Imagen Prosesada", dst); waitKey(5000); return 1; }

view raw writeImage.cpp hosted with ❤by GitHub

Tutorial opencv Trackbar y Mouse Opencv nos provee con funciones para crear y manipular el trackbar así como funciones para manejar los eventos del mouse, el uso de estas funciones es fácil

Lo primero que debemos hacer es crear una ventana como ya aprendimos en los opencv anteriores. Para crear un trackbar basta con llamar a la función createTrackba hay que pasarle como parámetro el nombre del trackbar, el nombre de la ventana deseamos agregarlo, la dirección de memoria de la variable en donde almacenaremo actual del trackbar, el valor máximo, y la función que se ejecutara cada vez que camb del trackbar.

createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar );

Como ejemplo utilizaremos uno disponible en el tutoriales opencv, se muestra com mescla a dos imágenes el valor alfa es cambiado con el trackbar.

voidon_trackbar( int, void* ) { alpha = (double) alpha_slider/alpha_slider_max ; beta = ( 1.0 - alpha ); addWeighted( src1, alpha, src2, beta, 0.0, dst); imshow( "Linear Blend", dst ); }

Si necesitamos saber en qué posición está el trackbar podemos llamar a l getTrackbarPos pasándole el nombre del trackbar y de la ventana, esta funcion nos un int que representa la posición del trackbar.

Este

código

se

encuentra

disponible

C:\opencv\samples\cpp\tutorial_code\HighGUI\AddingImagesTrackbar.cpp

Debemos recordar cambiar la ruta de las imágenes para que el proyecto se pueda eje

Tutorial opencv Mouse

Para controlar los eventos que produce el mouse contamos con la función setMouseC cual le debemos pasar como parámetro el nombre de la ventana que deseamos función que controlara los eventos, en este tutorial opencv veremos cómo usar esta f

setMouseCallback( "Uso del raton", onMouse);

La función onMouse debe tener el siguiente formato, donde event representa ocurrido y los enteros x, y las coordenadas donde se encuentra el mouse.

static voidonMouse( intevent, intx, inty, int, void* ) { switch(event)

case CV_EVENT_LBUTTONUP

:

break;

case CV_EVENT_RBUTTONUP

:

break;

case CV_EVENT_MBUTTONUP

:

break;

caseCV_EVENT_LBUTTONDBLCLK :

break;

caseCV_EVENT_RBUTTONDBLCLK :

break;

caseCV_EVENT_MBUTTONDBLCLK :

break;

} }

Estos son los diferentes eventos que produce el mouse, por lo general hacen lo qu nombre y si queremos podemos probar a ver cuándo se produce cada uno de e ejemplo si quisiéramos saber cuándo se mueve el ratón usaríamos CV_EVENT_MOUS , y serían las coordenadas a las que se movió.

#include using namespace cv; using namespace std; static void onMouse( int event, int x y, int, void* ) { string msg = "mouse - movido: X = " to_string(x) + " Y = " + to_string(y) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Mat img(200, 650, CV_8UC3); 16 17 18 19 20 21 22 23 24 25 26 switch (event) 27 28 29 30 31 32 33 34 35 36 37 { case CV EVENT MOUSEMOVE:

break; case CV_EVENT_MBUTTONDOWN

:

case CV_EVENT_LBUTTONUP

:

case CV_EVENT_RBUTTONUP

:

case CV_EVENT_MBUTTONUP

:

break; break; break; break; case CV_EVENT_LBUTTONDBLCLK : break; case CV_EVENT_RBUTTONDBLCLK : break; case CV_EVENT_MBUTTONDBLCLK : break; } } int main( int argc, char** argv ) { namedWindow( "Uso del raton", setMouseCallback( "Uso del ra onMouse); waitKey(); return 0; }

view raw mouse.cpp hosted with ❤by GitHub

Acceso a la webcam con opencv Con opencv podemos acceder a la cámara web que tengamos instalada en el com también podremos procesar estas imágenes capturadas por la webcam mediante ope su puesto grabar videos de la cámara.

Webcam desde opencv

Para acceder a la webcam lo hacemos de manera parecida a como mostramos un v que en lugar de especificar un archivo de video a la clase VideoCapture indicaremos e de dispositivo que deseamos usar cero si tenemos solo una cámara.

using namespacecv;

intmain() { VideoCapturecap(0);

if(!cap.isOpened()) return-1;

namedWindow("webcam");

for(;;) { Matframe; cap >> frame; imshow( "webcam", frame); if(waitKey(50) >= 0) break; }

return0; }

Código Python:

from cv2 import *

whileTrue: next, frame = vc.read() imshow("webcam", frame) ifwaitKey(50) >= 0: break;

Si deseamos procesar cada uno de los cuadros del video capturado podemos ha mismo modo como lo hicimos de un video pregrabado, veamos un ejemplo:

Código C++:

for(;;) { Matframe, edges; cap >> frame;

cvtColor(frame, edges, CV_BGR2GRAY); GaussianBlur(edges, edges, Size (7,7), 1.5, 1.5); Canny(edges, edges, 0, 30, 3);

imshow( "webcam", edges); if(waitKey(50) >= 0) break ; }

Código Python:

gauss = GaussianBlur(gray, (7,7), 1.5, 1.5) can = Canny(gauss, 0, 30, 3)

imshow("webcam", can) ifwaitKey(50) >= 0: break;

Almacenar video en disco

Si deseamos grabar el video proveniente de la webcam en disco, podemos hacerlo m clase VideoWriter, en el constructor o el método open debemos indicar el nombre deseamos guardar el archivo con extensión, el códec que usaremos, los cuadros por s la resolución del video.

VideoWriterwtr("webcam.avi", CV_FOURCC( 'M','J','P','G'), 30, Size(640,480));

CV_FOURCC(’P’,’I’,’M,’1’) para codec MPEG-1 codec. CV_FOURCC(’M’,’J’,’P’,’G’) para códec motion-jpeg.

Existen más códec puedes verlos aquí: http://www.fourcc.org/codecs.php Para finalizar solo nos falta escribir cada cuadro, lo podemos hacer de dos modos:

wtr.write(dest); wtr

if(!cap.isOpened() || !wtr.isOpe return -1; namedWindow("webcam"); for(;;) { Mat frame, edges, dest; cap >> frame; cvtColor(frame, edges, CV_BGR2GRAY); GaussianBlur(edges, edges Size(7,7), 1.5, 1.5); Canny(edges, edges, 0, 30 cvtColor(edges, dest, CV_GRAY2BGR); wtr = 0) brea } wtr.release(); return 0; }

view raw saveWebcamVideo.cpphosted with

❤byGitHub

OpenCV Detectar Líneas

Las funciones de OpenCV HoughLines y HoughLinesP son usadas pa detectar líneas en una imagen, ambas funciones usan el método HoughTransform para buscar líneas, círculos y otras formas básicas.

Para la detección de líneas usamos dos métodos:  

El método estándar HougLines Standard Hough Line Transfor m. El método probabilístico es más eficiente HougLinesP Probabilis Transform.

     

1 2 3 4 5 6 7 8 9 10 11 12 13

dst: proporcionado por Canny. lines: almacena las lineas detectadas. rho : usaremos 1 pixel. theta: usaremos 1 grado (CV_PI/180). threshold: numero mínimo de líneas a detectar. srn and stn: zero por defecto.

vector lines; HoughLines(dst, lines, 1, CV_PI/180, 200, 0, 0 ); for ( size_t i = 0; i < lines.size(); i++ ) { float rho = lines[i][0], theta = lines[i][1]; Point pt1, pt2; double a = cos(theta), b = sin(theta); double x0 = a*rho, y0 = b*rho; pt1.x = cvRound(x0 + 1000*(-b)); pt1.y = cvRound(y0 + 1000*(a)); pt2.x = cvRound(x0 - 1000*(-b)); pt2.y = cvRound(y0 - 1000*(a)); line( cdst, pt1, pt2, Scalar(0,0,2 55), 3, CV_AA); }

Para aplicar el método HoughLinesP se hace de manera similar solo cambian a parámetros y la manera como devuelve las lineas:      

1 2 3 4 5 6 7 8

dst: proporcionado por Canny. lines: almacena las lineas detectadas. rho : usaremos 1 pixel. theta: usaremos 1 grado (CV_PI/180). threshold: numero mínimo de líneas a detectar. minLinLength: mínimo de puntos que forman una línea.

vector lines; HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 ); for ( size_t i = 0; i < lines.size(); i++ ) { Vec4i l = lines[i]; line( cdst, Point(l[0], l[1]...


Similar Free PDFs