Сравнение контура в OpenCV (Convertion от C до C++)

Я все еще новый в C++, и теперь я должен преобразовать некоторые части из этого старая программа мой от C до C++, потому что я хочу применить BackgroundSubtractorMOG2 в моей программе начиная с него только доступный в C++. В основном эта программа обнаружит контуры от видеокамеры на основе второстепенное вычитание и выберите самые большие доступные контуры.

У меня есть проблема особенно на этой части (взятый от старая программа):

double largestArea = 0;                    //Const. for the largest area
CvSeq* largest_contour = NULL;             //Contour for the largest area
while (current_contour != NULL){           //If the current contour available
    double area = fabs(cvContourArea(current_contour,CV_WHOLE_SEQ, false));   //Get the current contour's area as "area"    
    if(area > largestArea){            //If "area" is larger than the previous largest area
        largestArea = area;
        largest_contour = current_contour; 
    }
    current_contour = current_contour->h_next;  //Search for the next contour
}

Эта часть - то, где программа просмотрит каждый контур, доступный как current_contour , найдите его область и сравните его с предыдущим самым большим контуром. Мой вопрос <силен>, как добраться current_contour , его область и скачок в следующий контур в C++? кроме того, , что обозначается contours.size() в C++? действительно ли это - количество просмотренных контуров или общая площадь контуров?

Это - то, что я сделал до сих пор:

for(;;)
{
    cap >> frame;//get a new frame from camera
    if( frame.empty() )
            break;
    image=frame.clone();
    mog(frame,foreground,-1);

    threshold(foreground,foreground,lowerC,upperC,THRESH_BINARY);
    medianBlur(foreground,foreground,9);
    erode(foreground,foreground,Mat());
    dilate(foreground,foreground,Mat());

    findContours(foreground,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);  

    if(contours.empty())
        continue;

//Starting this part
    double largest_area = 0;
    for(int i= 0; i < contours.size(); i++){
        double area = contourArea(contours);
        if(area >= largest_area){
            largest_area = area;
            largest_contours = contours;
        }
    }
//Until this part

    drawContours(image,largest_contours,-1,Scalar(0,0,255),2);

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

    if(waitKey(30) >= 0) break;

}

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

PS: старая программа получила некоторые ошибки в нем, но алгоритм работает просто великолепно. Свободный к как я, если вам нужна обновленная программа. В настоящее время используя OpenCV 2.4.3 + ПРОТИВ Экспорта C++ 2010 года

ОТРЕДАКТИРУЙТЕ:

Благодаря всем, кто пытается помочь мне, но я уже получил ответ, который является от здесь. Однако, для тех, как все еще не знайте: OpenCV в C НЕ ЯВЛЯЕТСЯ ТОЧНО ТЕМ ЖЕ САМЫМ КАК OpenCV в C++ .

0
nl ja de
Можно описать, как вы решили проблему, и отправьте ее и примите его как ответ. Тем путем мы знаем, что a., он решен и b., как вы решали его.
добавлено автор IBG, источник

1 ответы

Это - часть кода, где я считаю все контуры на изображении и calcilate их периметром и областью:

IplImage* bin = cvCreateImage( cvGetSize(_image), IPL_DEPTH_8U, 1);
cvConvertImage(_image, bin, CV_BGR2GRAY);
cvCanny(bin, bin, 50, 200);
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contours=0;

//Number of all contours on image @[email protected]
int contoursCont = cvFindContours( bin, storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
assert(contours!=0);

// iterate through all contours --> current = current->h_next
 for( CvSeq* current = contours; current != NULL; current = current->h_next )
 {
     //calculate perimeter and area of each contour
     double area = fabs(cvContourArea(current));
     double perim = cvContourPerimeter(current);
     cvDrawContours(_image, current, cvScalar(0, 0, 255), cvScalar(0, 255, 0), -1, 1, 8);
     //the rest code 
  }

Из документации OpenCV:

Функция cvFindContours восстанавливает контуры из двухуровневого изображения и возвращает количество восстановленных контуров. Указатель CvSeq* contours=0 заполнен функцией. Это будет содержать указатель на первый наиболее удаленный контур или ПУСТОЙ УКАЗАТЕЛЬ, если никакие контуры не будут обнаружены (если изображение абсолютно черное). Другие контуры могут быть достигнуты от first_contour, используя связи v_next и h_next.

0
добавлено
Спасибо за предложение, но OpenCV коды находится в C язык. Кроме того, я уже сделал программу, чтобы сравнить область в C (Щелчок здесь). Теперь я просто должен преобразовать его в C++, и это - мой главный вопрос.
добавлено автор Samir Izmier Chong, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest