2012-07-12 23 views
6

¿Cómo identificar los contornos dentro de otro contorno? Traté de revisar muchos tutoriales de OpenCV, pero no pude identificarlo. Por favor, ¿puede una persona experta proporcionar un código simple para explicarlo?¿Cómo identificar los contornos dentro de otro contorno usando JavaCV?

Este es mi archivo de entrada

enter image description here

Esta parte oscura es el contorno que necesito para identificar.

enter image description here

Por favor tenga la amabilidad de compartir su experiencia conmigo.

+0

¿Puede dar más información? ¿Cuál es el criterio de detección que llena el contorno? – ArtemStorozhuk

Respuesta

2

Aquí hay un enfoque simple en el código de Python. (But as I stated in my comment below, It is not an universal answer applicable everywhere, It is just to show finding contour inside a contour can be done. And if your images are different, then you have to come with some different constraints other than i mentioned below)

Lo que está haciendo después de encontrar Contornos es que comprueba si el área de cada contorno es menor que un valor especificado (di 10000, solo una conjetura), si no es un contorno más grande, evítelo. Si el valor es menor que el especificado, puede ser nuestro cuadrado o rectángulo al lado.

Así que encontramos su ancho y alto y verificamos si la relación de aspecto es cercana a 1. Si es así, es nuestro cuadrado.

import cv2 
import numpy as np 

img = cv2.imread('sofcnt.jpg') 
gray = cv2.imread('sofcnt.jpg',0) 

ret,thresh = cv2.threshold(gray,127,255,1) 

cont,hier = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) 

for cnt in cont: 
    approx = cv2.approxPolyDP(cnt,0.02*cv2.arcLength(cnt,True),True) 
    if cv2.contourArea(cnt) < 10000: 
     x,y,w,h = cv2.boundingRect(cnt) 
     if w/float(h) < 2: 
      cv2.drawContours(img,[cnt],0,255,-1) 


cv2.imshow('a',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Resultado:

enter image description here

+1

¿Por qué crees que se necesita una cifra similar a la figura cuadrada dentro de algunos ploygon? ¿Tal vez el autor quiere encontrar una figura que contenga el centro de algún pologon? Gracias. – ArtemStorozhuk

+1

+1 - Sí, tienes razón, entonces él tiene que especificar eso también.Creo que quería ver cómo identificar cualquier contorno dentro de un contorno, así que este es un tipo para hacerlo. de esta manera tiene que encontrar otra solución, y por supuesto no es una respuesta universal, solo para este problema en particular. –

+0

Actualizado el año. –

3

No es muy cómodo con JavaCV, por lo que aquí es como fui sobre la solución de este problema en OpenCV y C (cosas antiguas):

  1. Encuentra todos los contornos en la imagen usando cvFindContours()
  2. Ejecutar dos bucles (repetir punteros h_next o lo que sea que haya en JavaCV) sobre estos contornos. Para cada contorno en el bucle externo, haga coincidir con todos los demás contornos detectados en función de. . .
  3. Calcula el recuadro delimitador de cada contorno. Esta será una estructura CvRect.
  4. Pase los dos CvRects a una función que calcula el área de intersección (superposición) entre dos rectángulos.
  5. Si esta área es igual al área del más pequeño de los dos rectángulos, entonces el contorno correspondiente al rectángulo más pequeño está completamente encerrado por el más grande.

    Aquí está el código para encontrar el área de intersección. Debe haber estado flotando por la web en alguna parte.

    CvRect intersect(CvRect r1, CvRect r2) { CvRect intersection;

    // find overlapping region 
    intersection.x = (r1.x < r2.x) ? r2.x : r1.x; 
    intersection.y = (r1.y < r2.y) ? r2.y : r1.y; 
    intersection.width = (r1.x + r1.width < r2.x + r2.width) ? 
        r1.x + r1.width : r2.x + r2.width; 
    intersection.width -= intersection.x; 
    intersection.height = (r1.y + r1.height < r2.y + r2.height) ? 
        r1.y + r1.height : r2.y + r2.height; 
    intersection.height -= intersection.y;  
    
    // check for non-overlapping regions 
    if ((intersection.width <= 0) || (intersection.height <= 0)) { 
        intersection = cvRect(0, 0, 0, 0); 
    } 
    
    return intersection; 
    

    }

Cuestiones relacionadas