Как найти граничные пиксели каждого подключенного компонента в изображении в opencv - PullRequest
4 голосов
/ 11 января 2012

У меня есть изображение с текстом, и я хочу найти граничные пиксели каждого подключенного компонента. Какой метод мне следует использовать в opencv 2.3, я пишу код на c.Эта функция может быть похожа на bwboundaries в matlab.

спасибо,

Ответы [ 3 ]

11 голосов
/ 12 января 2012

В 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.

1 голос
/ 11 января 2012

Вы можете использовать cvFindContours (это вызов версии 1.0, но в 2.3 должен быть аналогичный вызов)

0 голосов
/ 11 января 2012

В OpenCV такая функция не реализована. Вы должны либо искать в морфологических операциях (вычлененные части вашего изображения и те же самые), либо взглянуть на cvbloblib http://opencv.willowgarage.com/wiki/cvBlobsLib

Он был разработан именно для этой цели;).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...