В OpenCV 2.3 требуемая функция называется cv :: findContours .Каждый контур (который является границей связанного компонента) сохраняется как вектор точек.Вот как получить доступ к контурам в C ++:
vector<vector<Point> > contours;
cv::findContours(img, contours, cv::RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
for (size_t i=0; i<contours.size(); ++i)
{
// do something with the current contour
// for instance, find its bounding rectangle
Rect r = cv::boundingRect(contours[i]);
// ...
}
Если вам нужна полная иерархия контуров, включая отверстия внутри компонентов и т. Д., Вызов findContours выглядит следующим образом:
vector<vector<Point> > contours;
Hierarchy hierarchy;
cv::findContours(img, contours, hierarchy, cv::RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
// do something with the contours
// ...
Примечание: параметр CV_CHAIN_APPROX_SIMPLE
указывает, что отрезки прямых линий в контуре будут кодироваться их конечными точками.Если вместо этого вы хотите сохранить все точки контура, используйте CV_CHAIN_APPROX_NONE
.
Редактировать: в C, вы вызываете cvFindContours
и получаете доступ к контурам следующим образом:
CvSeq *contours;
CvMemStorage* storage;
storage = cvCreateMemStorage(0);
cvFindContours(img, storage, &contours, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
CvSeq* c;
for(c=contours; c != NULL; c=c->h_next)
{
// do something with the contour
CvRect r = cvBoundingRect(c, 0);
// ...
}
c->h_next
указывает на следующий контур на том же уровне иерархии, что и текущий контур, а c->v_next
указывает на первый контур внутри текущего контура, если таковой имеется.Конечно, если вы используете CV_RETR_EXTERNAL
, как указано выше, c->v_next
всегда будет NULL
.