Контурное сравнение в OpenCV (преобразование из 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() в С ++? Это число отсканированных контуров или общая площадь контуров?

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

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 + VS C ++ 2010 Exp.

РЕДАКТИРОВАТЬ:

Спасибо всем, кто пытается мне помочь, но я уже получил ответ от Вот. Тем не менее, для тех, кто до сих пор не знаю: OpenCV в C НЕ ТОЛЬКО ЖЕ, КАК OpenCV в C++.

0

Решение

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

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 @contoursCont@
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 заполняется функцией. Он будет содержать указатель на первый внешний контур или NULL, если контуры не обнаружены (если изображение полностью черное). Другие контуры могут быть получены из first_contour с помощью ссылок h_next и v_next.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]