Foros del Web » Programación para mayores de 30 ;) » Programación General »

Reconocimiento de patrones y OpenCV

Estas en el tema de Reconocimiento de patrones y OpenCV en el foro de Programación General en Foros del Web. Hola buenas dias, espero me puedan ayudar a despejar mis dudas sobre el uso de opencv, la verdad necesito ayuda de como realizar un proyecto, ...
  #1 (permalink)  
Antiguo 11/06/2013, 09:15
 
Fecha de Ingreso: junio-2013
Mensajes: 18
Antigüedad: 11 años, 5 meses
Puntos: 0
Información Reconocimiento de patrones y OpenCV

Hola buenas dias, espero me puedan ayudar a despejar mis dudas sobre el uso de opencv, la verdad necesito ayuda de como realizar un proyecto, necesito un programa que clasifique objetos(circulos,cuadrados,triangulos y rectangulos), se que OpenCv me puede ayudar la duda esta en como utilizarlo, pues tengo la idea de como hacerlo.

Lo primero que pretendo es leer una foto que solo contenga una figura de las antes mencionadas, y que defina que figura es; creo eso se puede hacer por medio de una libreria de OpenCV pero no se cuál es, la idea que tengo es que identifique por medio de sus lados la figura que es , es decir, de un cuadrado debe localizarlo porque sus 4 lados seqn iguales, un triangulo que solo tenga 3 lados y un rectangulo que 2 de sus lados sean iguales y los otros 2 igual, y la circunferencia pues no tiene lados, la verdad tengo la idea pero no se como implementarlo, espero me puedan ayudar, GRACIAS!


Y esperando les guste mi proyecto
  #2 (permalink)  
Antiguo 11/06/2013, 11:30
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: Reconocimiento de patrones y OpenCV

¿Ya leíste la documentación de OpenCV?

En todo casi hay muchos que han hecho eso, por ejemplo: http://opencv-srf.blogspot.mx/2011/0...-contours.html

Más: https://www.google.com.mx/search?q=o...hrome&ie=UTF-8

Saludos
__________________
Grupo Telegram Docker en Español
  #3 (permalink)  
Antiguo 11/06/2013, 12:41
 
Fecha de Ingreso: junio-2013
Mensajes: 18
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Reconocimiento de patrones y OpenCV

ya revise y sí hay mucha información de opencv, pero creo me complico porque tengo entendido que existe una función en opencv que calcula si es un triangulo, rectangulo, cuadrado o circunferencia,
  #4 (permalink)  
Antiguo 11/06/2013, 12:47
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: Reconocimiento de patrones y OpenCV

No sabría decirte, pero por lo menos el primer link creo que resuelve tu problema.

Saludos
__________________
Grupo Telegram Docker en Español
  #5 (permalink)  
Antiguo 11/06/2013, 19:03
 
Fecha de Ingreso: junio-2013
Mensajes: 18
Antigüedad: 11 años, 5 meses
Puntos: 0
Exclamación Respuesta: Reconocimiento de patrones y OpenCV

muchas gracias carlangueitor!! mi duda es como definir que se trata de un cuadrado o de un rectangulo, y la otra es como saber si se encuentra una circunferencia?, espero me puedas ayudar gracias!!!
  #6 (permalink)  
Antiguo 12/06/2013, 11:06
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: Reconocimiento de patrones y OpenCV

A ver, lee el (los) link (s), en el primer link, el segundo párrafo empieza con algo así:

Cita:
As example, you will get 3 points (vertices) for a triangle, and 4 points for quadrilaterals. So, you can identify any polygon by the number of vertices of that polygon. You can even identify features of polygons such as convexity, concavity, equilateral and etc by calculating and comparing distances between vertices.
Ya leíste todo el articulo?

Saludos
__________________
Grupo Telegram Docker en Español
  #7 (permalink)  
Antiguo 16/06/2013, 20:46
 
Fecha de Ingreso: junio-2013
Mensajes: 18
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Reconocimiento de patrones y OpenCV

si pero no logro encontrar la forma de poder diferenciar un cuadrado, de un rectangulo, lo más que puedo es encontrar un cuadrado, pero mi objetivo es clasificar cuadrados, rectangulos, mira el codigo que uso es el siguiente:




Código C++:
Ver original
  1. #include <cv.h>
  2. #include <highgui.h>
  3. using namespace std;
  4. //solo con fondo negro
  5. int main()
  6. {
  7.         //cargamos la imagen
  8.         IplImage* img =  cvLoadImage("imagen7.jpg");
  9.  
  10.         //ventana con imagen original
  11.         cvNamedWindow("Original");
  12.         cvShowImage("Original",img);
  13.  
  14.          //smooth the original image using Gaussian kernel to remove noise
  15.         cvSmooth(img, img, CV_GAUSSIAN,3,3);
  16.  
  17.        // Conversión de la imagen original en escala de grises
  18.         IplImage* imgGrayScale = cvCreateImage(cvGetSize(img), 8, 1);
  19.         cvCvtColor(img,imgGrayScale,CV_BGR2GRAY);
  20.  
  21.         //ventana Escala de grises
  22.         //cvNamedWindow("Escala de Grises");
  23.         //cvShowImage("Escala de Grises",imgGrayScale);
  24.  
  25.         // Umbralización la imagen en escala de grises para obtener mejores resultados
  26.         cvThreshold(imgGrayScale,imgGrayScale,100,255,CV_THRESH_BINARY_INV);
  27.  
  28.         //ventana fondo Negro
  29.         //cvNamedWindow("Fondo Negro");
  30.         //cvShowImage("Fondo Negro",imgGrayScale);
  31.  
  32.         CvSeq* contour;  //mantiene el puntero a un contorno en el bloque de memoria
  33.         CvSeq* result;   //mantiene secuencia de puntos de un contorno
  34.         CvMemStorage *storage = cvCreateMemStorage(0);//area de almacenamiento para todos los contornos
  35.  
  36.         //encuentra todos los contornos de la imagen
  37.         cvFindContours(imgGrayScale, storage, &contour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
  38.  
  39.         //iterar atraves de cada contorno
  40.         while(contour)
  41.         {
  42.                 //Obtener una secuencia de puntos de contorno, señalado por 'contorno' la variable
  43.                 result = cvApproxPoly(contour, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contour)*0.02, 0);
  44.  
  45.                 //Si hay 3 vértices en el contorno (Debe ser un triángulo)
  46.                 if((result->total==3) && fabs(cvContourArea(result, CV_WHOLE_SEQ))>10) //              
  47.                 {
  48.                         //iterar atraves de cada punto
  49.                         CvPoint *pt[3];
  50.                         for(int i=0;i<3;i++)
  51.                         {
  52.                                 pt[i] = (CvPoint*)cvGetSeqElem(result, i);
  53.                         }
  54.  
  55.                         //dibujo de lineas en todo el triangulo de color rojo
  56.                         cvLine(img, *pt[0], *pt[1], cvScalar(255,0,0),4);
  57.                         cvLine(img, *pt[1], *pt[2], cvScalar(255,0,0),4);
  58.                         cvLine(img, *pt[2], *pt[0], cvScalar(255,0,0),4);
  59.  
  60.                 }
  61.  
  62.                 else if(result->total==4)
  63.                 {
  64.                     //iterar atraves de cada punto
  65.                     CvPoint *pt[4];
  66.                     for(int i=0;i<4;i++)
  67.                     {
  68.                         pt[i] = (CvPoint*)cvGetSeqElem(result, i);
  69.                     }
  70.                     //dibujo de lineas en todo el cuadrilatero
  71.                     cvLine(img, *pt[0], *pt[1], cvScalar(0,255,0),4);
  72.                     cvLine(img, *pt[1], *pt[2], cvScalar(0,255,0),4);
  73.                     cvLine(img, *pt[2], *pt[3], cvScalar(0,255,0),4);
  74.                     cvLine(img, *pt[3], *pt[0], cvScalar(0,255,0),4);
  75.                 }
  76.                
  77.                
  78.                 else if(result->total==13)
  79.                 {
  80.                     //iterar atraves de cada punto
  81.                     CvPoint *pt[13];
  82.                     for(int i=0;i<13;i++)
  83.                     {
  84.                         pt[i] = (CvPoint*)cvGetSeqElem(result, i);
  85.                     }
  86.                     //dibujo de lineas en todo el cuadrilatero
  87.                     cvLine(img, *pt[0], *pt[1], cvScalar(0,255,0),4);
  88.                     cvLine(img, *pt[1], *pt[2], cvScalar(0,255,0),4);
  89.                     cvLine(img, *pt[2], *pt[3], cvScalar(0,255,0),4);
  90.                     cvLine(img, *pt[3], *pt[0], cvScalar(0,255,0),4);
  91.                     cvLine(img, *pt[0], *pt[1], cvScalar(0,255,0),4);
  92.                     cvLine(img, *pt[1], *pt[2], cvScalar(0,255,0),4);
  93.                     cvLine(img, *pt[2], *pt[3], cvScalar(0,255,0),4);
  94.                     cvLine(img, *pt[3], *pt[0], cvScalar(0,255,0),4);
  95.                    
  96.                    
  97.                    
  98.                 }
  99.                
  100.                
  101.                
  102.                
  103.                
  104.                 //obtiene el siguiente contorno
  105.                 contour = contour->h_next;
  106.         }
  107.  
  108.         // Mostrar la imagen en la que identifican las formas están marcadas  
  109.         cvNamedWindow("Encuentra");
  110.         cvShowImage("Encuentra",img);
  111.  
  112.         cvWaitKey(0); //espera por una tecla
  113.  
  114.         //limpieza
  115.         cvDestroyAllWindows();
  116.         cvReleaseMemStorage(&storage);
  117.         cvReleaseImage(&img);
  118.         cvReleaseImage(&imgGrayScale);
  119.  
  120.         return 0;
  121. }

Última edición por razpeitia; 16/06/2013 a las 21:01

Etiquetas: patrones, programa, reconocimiento
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:25.