Проблемы с нахождением контура в видеоизображении с помощью C ++ FindContours

Программа, над которой я сейчас работаюпочти сделано, но я не очень удовлетворен результатом. Используя алгоритм Канни, мне удалось получить четкое представление о контуре объекта, но в программе возникла проблема с распознаванием контура и рисованием контура красной линией. Программа:

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;
}

Краткое содержание программы:

Получить изображения с камерыШумовая фильтрация (Преобразовать в серый → размытие → Canny)Найти контурыНайдите самый большой контур и его площадь на изображении или объектеНарисуйте красную линию вокруг объекта и распечатайте самую большую областьПромыть и повторить

И результаты:

Редко я получаю то, что хочу; Обнаружен контур, нарисована красная линия (ХОРОШИЙ):

... и обычно я получаю это; Контур не обнаружен, нет красной линии (ПЛОХОЙ):

Шансы получитьХОРОШИЙ о1/20 что не очень хорошо Также линия контура объекта вContours Экран будет мигать, когда вокруг объекта появится красная линия (см. изображение «ХОРОШИЙ ОДИН»). Я использую один из моих объектов (маленький черный квадрат) для этого вопроса, но, пожалуйста, обратите внимание, что основной целью этой программы обнаружения объектов являетсяобнаруживать объект независимо от его формы или цвета.

Итак, мои вопросы:

Почему я все еще получаю плохие, несмотря на то, что контур ясен как день?Кто-нибудь может поделиться лучшей идеей о том, как улучшить обнаружение контура? (т.е. лучше алгоритм размытия)Как предотвратить мигание линии контура, когда вокруг объекта нарисована красная линия?

РЕДАКТИРОВАТЬ: Я только что обнаружил, что линия контура мигает не из-за красной линии, нарисованной вокруг нее (либо сdrawContoursили жеline функция), но это происходит после того, как самый большой контур обнаруженfindContours функция и рассчитывается как самый большой контур.

На вопрос о нет. 3 кликаВОТ. ВИДЕО ЗДЕСЬ, НАЖМИТЕ НА ЭТО !!!

Заранее спасибо.

PS: я использую OpenCV 2.4.3 на MS Visual C ++ 2010 Exp.

Ответы на вопрос(1)

Ваш ответ на вопрос