Problemas para encontrar el contorno en una imagen de video usando FindContours de C ++

El programa en el que estoy trabajando ahora escasi Hecho pero no estoy muy satisfecho con el resultado. Al usar el algoritmo de Canny, logré tener muy claro el contorno del objeto, pero el programa tiene algún problema para reconocer el contorno y dibujar el contorno con una línea roja. El programa:

void setwindowSettings(){
    namedWindow("Contours", CV_WINDOW_AUTOSIZE);

    createTrackbar("LowerC", "Contours", &lowerC, 255, NULL);
    createTrackbar("UpperC", "Contours", &upperC, 255, NULL);
}

void wait(void)
{
    long t=30000000;
    while(t--);
}

int main(void)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened())  // check if we succeeded
    return -1;

Mat frame,foreground,image;
double pt1, pt2, area;
Rect rect;
int i;

vector<vector<Point> > contours;
vector<vector<Point> > largest_contours;

namedWindow("Capture", CV_WINDOW_AUTOSIZE);
setwindowSettings();

while(1){
    cap >> frame; // get a new frame from camera
    if( frame.empty() )
            break;
    image=frame.clone();

    cvtColor(image,foreground,CV_BGR2GRAY);
    GaussianBlur(foreground,foreground,Size(9,11),0,0);
    Canny(foreground,foreground,lowerC,upperC,3);

    findContours(foreground,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);  

    if(contours.empty())
        continue;

    double largest_area = 0;

    for( i= 0; i < contours.size(); i++){  // get the largest contour
        area = fabs(contourArea(contours[i]));
        if(area >= largest_area){
            largest_area = area;
            largest_contours.clear(); 
            largest_contours.push_back(contours[i]);
        }
    }

    if(largest_area>=3000){   // draw the largest contour if exceeded minimum largest area 
        drawContours(image,largest_contours,-1,Scalar(0,0,255),2);
        printf("area = %.f\n",largest_area);
    }

    wait();

    imshow( "Capture",image );
    imshow("Contours",foreground);

    if(waitKey(30) >= 0) break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}

Resumen del programa:

Obtener imagenes de camaraFiltración de ruido (Convertir a gris → difuminar → Canny)Encontrar contornosEncuentra el contorno más grande y su área en la imagen alias el objetoDibuja una línea roja alrededor del objeto e imprime el área más grandeEnjuague y repita

Y los resultados:

Rara vez tengo lo que quiero; Contorno detectado, línea roja dibujada (Bueno uno):

... y generalmente tengo esto; No se detectó contorno, no línea roja (UNO MALO):

Las posibilidades de conseguir elBueno uno están a punto1/20 lo cual no es muy bueno. Además, la línea del contorno del objeto enContours la pantalla parpadeará cuando aparezca la línea roja alrededor del objeto (vea la imagen de GOOD ONE). Estoy usando uno de mis objetos (una pequeña caja cuadrada negra) para esta pregunta, pero tenga en cuenta que el objetivo principal de este programa de detección de objetos esPara detectar el objeto independientemente de su forma o su color.

Así que mis preguntas son:

¿Por qué sigo recibiendo los BAD ONES a pesar de que el contorno es tan claro como el día?¿Alguien puede compartir una mejor idea sobre cómo mejorar la detección de contorno? (es decir, mejor algoritmo de desenfoque)¿Cómo evitar que la línea de contorno parpadee cuando se dibuja la línea roja alrededor del objeto?

EDITAR: Acabo de descubrir que el parpadeo de la línea de contorno no se debe a la línea roja dibujada a su alrededor (ya sea condrawContoursoline función) pero ocurre después de que el contorno más grande es detectado porfindContours Funciona y calcula como el contorno más grande.

Por pregunta sobre no. 3 clicAQUÍ. VIDEO AQUI, HAGA CLICK !!!

Gracias por adelantado.

PS: Estoy usando OpenCV 2.4.3 en Ms Visual C ++ 2010 Exp.

Respuestas a la pregunta(1)

Su respuesta a la pregunta