2011-12-02 18 views
9

Tengo el siguiente código que realiza la resta de fondo y luego usa findContours para dibujar un límite alrededor del objeto de primer plano.OpenCV findContours problema

// frame - Input frame from a camera. 
// output - Output frame to be displayed. 
    void process(cv:: Mat &frame, cv:: Mat &output) { 

    cv::cvtColor(frame, gray, CV_BGR2GRAY); 

    // initialize background to 1st frame 
    if (background.empty()) 
     gray.convertTo(background, CV_32F); 

    // convert background to 8U 
    background.convertTo(backImage,CV_8U); 

    // compute difference between current image and background 
    cv::absdiff(backImage,gray,foreground); 

    // apply threshold to foreground image 
    cv::threshold(foreground,output,threshold,255,cv::THRESH_BINARY_INV); 

    // accumulate background 
    cv::accumulateWeighted(gray, background, learningRate, output); 

    // Find regions of interest 
    std::vector<std::vector<cv::Point> > v; // Detected foreground points 

    cv::findContours(output,v,CV_RETR_LIST,CV_CHAIN_APPROX_NONE); 

    // Sort to find the entry with the most points at the beginning. 
      // This is done to overcome noisy input. 
    std::sort(v.begin(), v.end(), DescendingCompare); 

    cv::Mat drawing = frame; 

    std::vector<std::vector<cv::Point>> contours_poly(1); 

    // Determine an approximate polygon for v[0] which is the largest contour 
    cv::approxPolyDP(cv::Mat(v[0]), contours_poly[0], 3, false); 

    // Draw polygonal contour 
    cv::Scalar color = cv::Scalar(0,0,255); 
    cv::drawContours(drawing, contours_poly, 0, color, 2, 8, std::vector<cv::Vec4i>(), 0, cv::Point()); 

    // Show in a window 
    output = drawing; 
    v.clear(); 

} 

La imagen es simplemente un fondo blanco en blanco pero findContours() devuelve un contorno con los 4 bordes de la imagen. Esto termina siendo el contorno más grande encontrado, negando mi lógica en el código. ¿Hay alguna forma de arreglar esto? Quiero que devuelva un vector nulo cuando la pantalla está en blanco.

http://imgur.com/a/hJCQl

http://imgur.com/a/hJCQl

Además, este código puede ser mejorado en ningún modo a mejorar la eficiencia?

+1

¡Yikes! Error tonto. Por favor, haga su respuesta como un comentario separado para que pueda marcarlo como correcto – Madman

Respuesta

5

Su fondo debe ser negro (0) y cualquier objeto que desee contornear debe ser blanco (o> = 1). Lo tienes invertido y es por eso que FindContours detecta el fondo como un contorno y no como el objeto.

Cuestiones relacionadas