Estoy haciendo un OpenCV software que detecta los guantes de boxeo por lo tanto quiero para detectar y extraer sólo 2 más grande de contornos (uno para cada guante de boxeo).

Mi software dibuja los contornos de todo y algunas cosas son sólo ruido, que por supuesto yo no quiero

Mi código para los contornos del dibujo:

    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    findContours(mBlur, contours, hierarchy, CV_RETR_EXTERNAL,  CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
    //----------------------------------------------------------------------------->

    vector<vector<Point> > contours_poly(contours.size());
    vector<Rect> boundRect (contours.size());
    vector<Point2f> boundingBoxArea(boundRect.size());

    //----------------------------------------------------------------------------->

    for( int i = 0; i < contours.size(); i++ )
     { 
       approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
       boundRect[i] = boundingRect( Mat(contours_poly[i]) );

     }

    ///Draw polygonal contour + bonding rects
   Mat drawing = Mat::zeros( range_out.size(), CV_8UC3 );

    for( int i = 0; i< contours.size(); i++ )
        {

           Scalar color = Scalar(0,0,255);
           drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
           fillPoly(drawing, contours, Scalar(255,0,0));

       }

Aquí hay una Imagen de Ejemplo:

OpenCV Dibujar dibujar contornos de 2 objetos mayores

Mi programa ya segmentos de los guantes por el color, La problelem es que a veces los pequeños contornos se dibujan en lugares al azar debido al ruido. Ahora, por supuesto, los guantes, los contornos son, por mucho, dominante y esta es la razón por la que quiero seguir sólo los contornos de estos. Espero que esto hace que mi pregunta más clara

Podría alguien sugerir una solución por favor
Yo soy de la codificación en C++ entorno
se refiere a

  • Usted debe publicar una imagen de ejemplo.
  • Por favor, revise las respuestas con cuidado, y hasta el voto de los que te ayudaron. También puede hacer clic en la casilla de verificación cerca de una respuesta para seleccionarlo como el oficial de la respuesta a su pregunta.
InformationsquelleAutor Tomazi | 2013-02-21

2 Comentarios

  1. 4

    La manera más fácil mirar a los dos grandes contornos es simplemente mirar a los contornos de tamaño. Algo como esto debe hacer el truco:

    int largestIndex = 0;
    int largestContour = 0;
    int secondLargestIndex = 0;
    int secondLargestContour = 0;
    for( int i = 0; i< contours.size(); i++ )
    {
        if(contours[i].size() > largestContour){
            secondLargestContour = largestContour;
            secondLargestIndex = largestIndex;
            largestContour = contours[i].size();
            largestIndex = i;
        }else if(contours[i].size() > secondLargestContour){
            secondLargestContour = contours[i].size();
            secondLargestIndex = i;
        }
    }
    Scalar color = Scalar(0,0,255);
    drawContours( drawing, contours, largestIndex, color, CV_FILLED, 8);
    drawContours( drawing, contours, secondLargestIndex, color, CV_FILLED, 8);
  2. 2

    Parece que vector<vector<Point> > contours almacena todos sus contornos. Lo que usted necesita hacer es repetir en este vector y hacer un poco de aritmética con los elementos, para ser capaz de detectar los 2 más grandes contornos en el vector.

    En esta respuesta Compartí código que detecta el más grande de contorno en un vector<vector<Point> >, por lo que es la mitad del camino.

Dejar respuesta

Please enter your comment!
Please enter your name here