Ver Mensaje Individual
  #7 (permalink)  
Antiguo 16/06/2013, 20:46
alex_uam
 
Fecha de Ingreso: junio-2013
Mensajes: 18
Antigüedad: 10 años, 10 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