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#include <cv.h> #include <highgui.h> using namespace std; //solo con fondo negro int main() { //cargamos la imagen IplImage* img = cvLoadImage("imagen7.jpg"); //ventana con imagen original cvNamedWindow("Original"); cvShowImage("Original",img); //smooth the original image using Gaussian kernel to remove noise cvSmooth(img, img, CV_GAUSSIAN,3,3); // Conversión de la imagen original en escala de grises IplImage* imgGrayScale = cvCreateImage(cvGetSize(img), 8, 1); cvCvtColor(img,imgGrayScale,CV_BGR2GRAY); //ventana Escala de grises //cvNamedWindow("Escala de Grises"); //cvShowImage("Escala de Grises",imgGrayScale); // Umbralización la imagen en escala de grises para obtener mejores resultados cvThreshold(imgGrayScale,imgGrayScale,100,255,CV_THRESH_BINARY_INV); //ventana fondo Negro //cvNamedWindow("Fondo Negro"); //cvShowImage("Fondo Negro",imgGrayScale); CvSeq* contour; //mantiene el puntero a un contorno en el bloque de memoria CvSeq* result; //mantiene secuencia de puntos de un contorno CvMemStorage *storage = cvCreateMemStorage(0);//area de almacenamiento para todos los contornos //encuentra todos los contornos de la imagen cvFindContours(imgGrayScale, storage, &contour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); //iterar atraves de cada contorno while(contour) { //Obtener una secuencia de puntos de contorno, señalado por 'contorno' la variable result = cvApproxPoly(contour, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contour)*0.02, 0); //Si hay 3 vértices en el contorno (Debe ser un triángulo) if((result ->total ==3) && fabs(cvContourArea (result , CV_WHOLE_SEQ ))>10) // { //iterar atraves de cada punto CvPoint *pt[3]; for(int i=0;i<3;i++) { pt[i] = (CvPoint*)cvGetSeqElem(result, i); } //dibujo de lineas en todo el triangulo de color rojo cvLine(img, *pt[0], *pt[1], cvScalar(255,0,0),4); cvLine(img, *pt[1], *pt[2], cvScalar(255,0,0),4); cvLine(img, *pt[2], *pt[0], cvScalar(255,0,0),4); } else if(result->total==4) { //iterar atraves de cada punto CvPoint *pt[4]; for(int i=0;i<4;i++) { pt[i] = (CvPoint*)cvGetSeqElem(result, i); } //dibujo de lineas en todo el cuadrilatero cvLine(img, *pt[0], *pt[1], cvScalar(0,255,0),4); cvLine(img, *pt[1], *pt[2], cvScalar(0,255,0),4); cvLine(img, *pt[2], *pt[3], cvScalar(0,255,0),4); cvLine(img, *pt[3], *pt[0], cvScalar(0,255,0),4); } else if(result->total==13) { //iterar atraves de cada punto CvPoint *pt[13]; for(int i=0;i<13;i++) { pt[i] = (CvPoint*)cvGetSeqElem(result, i); } //dibujo de lineas en todo el cuadrilatero cvLine(img, *pt[0], *pt[1], cvScalar(0,255,0),4); cvLine(img, *pt[1], *pt[2], cvScalar(0,255,0),4); cvLine(img, *pt[2], *pt[3], cvScalar(0,255,0),4); cvLine(img, *pt[3], *pt[0], cvScalar(0,255,0),4); cvLine(img, *pt[0], *pt[1], cvScalar(0,255,0),4); cvLine(img, *pt[1], *pt[2], cvScalar(0,255,0),4); cvLine(img, *pt[2], *pt[3], cvScalar(0,255,0),4); cvLine(img, *pt[3], *pt[0], cvScalar(0,255,0),4); } //obtiene el siguiente contorno contour = contour->h_next; } // Mostrar la imagen en la que identifican las formas están marcadas cvNamedWindow("Encuentra"); cvShowImage("Encuentra",img); cvWaitKey(0); //espera por una tecla //limpieza cvDestroyAllWindows(); cvReleaseMemStorage(&storage); cvReleaseImage(&img); cvReleaseImage(&imgGrayScale); return 0; }
Última edición por razpeitia; 16/06/2013 a las 21:01 |