2016-12-12 3 views
0

Я обрабатываю видео, которое хочу обнаружить некоторые объекты.фильтрация нежелательных контуров - opencv с C++

Во-первых, я удаляю фон, затем делаю его серым и создаю двоичное изображение, используя cv::threshold, а затем cv::findcontours.

Я хочу удалить слишком длинные и слишком короткие контуры. Я нашел код по этой причине в «Поварной книге Opencv 2». Но у него есть ошибка времени выполнения на 21-м кадре моего видео.

// Eliminate too short or too long contours 
    size_t cmin{ 15 }; // minimum contour length 
    size_t cmax{ 120 }; // maximum contour length 


    std::vector<std::vector<cv::Point> >:: 
     const_iterator itc = contours.begin(); 
    while (itc != contours.end()) { 
     if (itc->size() < cmin || itc->size() > cmax) 
      itc = contours.erase(itc); 
     else 
      ++itc; 
    } 

Я искал и нашел еще один код и он имеет ту же самую ошибку на тот же кадр:

double min_area = 500; // area threshold 
    double max_area = 1500; // area threshold 
    for (int i = 0; i < contours.size(); i++) // iterate through each contour. 
    { 
     double area = contourArea(contours[i], false); // Find the area of contour 
     if (area < min_area || area > max_area) 
      contours.erase(contours.begin() + i); 
    } 

и я написал код, чтобы создать новый вектор и просто скопировать принятые контуры в нем. но он также имеет ту же самую ошибку на том же кадре:

std::vector<std::vector<cv::Point> > goodcontours; 
    size_t cmin{ 15 }; 
    size_t cmax{ 120 }; 
    double contourlength = 1; 
    size_t contoursize = contours.size(); 
    for (int i = 0; i != contoursize;i++) { 
     contourlength = cv::arcLength(contours[i], true); 
     if (contourlength > cmin && contourlength < cmax) 
      goodcontours.push_back(contours.at(i)); 
    } 

Я попробовал другие видео, и все из них имеет ту же проблему на определенном кадре.

Перед ошибкой, я все еще вижу нежелательные контуры, и это означает, что они действительно не устранены.

ошибка просто сказать:

Необработанное исключение в 0x75017FB2 (ucrtbase.dll)

Есть ли у вас какие-либо предложения для фильтрации контуров?

one of my video frames contours

+1

Я ** угадывание **, что он должен делать с контур не соответствует 'contourArea 'предположения (слишком маленькие, возможно?). Должно быть более подробное информационное сообщение - смотрите внимательнее – slawekwin

ответ

1

Один из моих друзей ответил на мой вопрос, и я поделился ею с вами:

cv::findContours(image,contours,CV_RETR_LIST,mode,cv::Point(offset_x,offset_y)); 

    for(int i=0;i<contours.size();i++) 
    { 
     AreaContour=cv::contourArea(contours[i]); 
     if(AreaContour<MaxAreaContour && AreaContour>MinAreaContour) 
     drawContours(Result,contours,i,cv::Scalar(DrawColor),Thickness,LineType,cv::noArray(),2147483647,cv::Point(DrawOffset_x,DrawOffset_y)); 

    } 
Смежные вопросы